aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/examples/wpas-dbus-new.py
blob: 8a7f1022c8aa18d4088d81f16d65425e6f155ce5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/python

import dbus
import sys, os
import time
import gobject
from dbus.mainloop.glib import DBusGMainLoop

WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"

WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.Interface.BSS"

def byte_array_to_string(s):
	import urllib
	r = ""    
	for c in s:
		if c >= 32 and c < 127:
			r += "%c" % c
		else:
			r += urllib.quote(chr(c))
	return r

def list_interfaces(wpas_obj):
	ifaces = wpas_obj.Interfaces
	for i in ifaces:
		print "%s" (i)

def stateChanged(newState, oldState):
	print "StateChanged(%s -> %s)" % (oldState, newState)

def scanDone(success):
	gobject.MainLoop().quit()
	print "Scan done: success=%s" % success
	
	res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs',
			 dbus_interface=dbus.PROPERTIES_IFACE)

	print "Scanned wireless networks:"
	for opath in res:
		print opath
		net_obj = bus.get_object(WPAS_DBUS_SERVICE, opath)
		net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
		props = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Properties',
				    dbus_interface=dbus.PROPERTIES_IFACE)
		#print props

		# Convert the byte-array for SSID and BSSID to printable strings
		bssid = ""
		for item in props['BSSID']:
			bssid = bssid + ":%02x" % item
		bssid = bssid[1:]
		ssid = byte_array_to_string(props["SSID"])

		wpa = "no"
		if props.has_key("WPAIE"):
			wpa = "yes"
		wpa2 = "no"
		if props.has_key("RSNIE"):
			wpa2 = "yes"
		freq = 0
		if props.has_key("Frequency"):
			freq = props["Frequency"]
		caps = props["Capabilities"]
		qual = props["Quality"]
		level = props["Level"]
		noise = props["Noise"]
		maxrate = props["MaxRate"] / 1000000

		print "  %s  ::  ssid='%s'  wpa=%s  wpa2=%s  quality=%d%%  rate=%d  freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq)

def main():
	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
	global bus
	bus = dbus.SystemBus()
	wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
	wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
	bus.add_signal_receiver(scanDone,
				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
				signal_name="ScanDone")
	bus.add_signal_receiver(stateChanged,
				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
				signal_name="StateChanged")

	if len(sys.argv) != 2:
		list_interfaces(wpas_obj)
		os._exit(1)

	ifname = sys.argv[1]

	# See if wpa_supplicant already knows about this interface
	path = None
	try:
		path = wpas.GetInterface(ifname)
	except dbus.DBusException, exc:
		if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
			raise exc
		try:
			path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'})
			time.sleep(1)

		except dbus.DBusException, exc:
			if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
				raise exc

	global if_obj
	if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
	global iface
	iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
	iface.Scan({'Type': 'active'})

	gobject.MainLoop().run()

	wpas.RemoveInterface(dbus.ObjectPath(path))

if __name__ == "__main__":
	main()