1#!/usr/bin/python
2
3import dbus
4import sys, os
5import time
6import gobject
7from dbus.mainloop.glib import DBusGMainLoop
8
9WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
10WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
11WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"
12
13WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
14WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
15WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS"
16WPAS_DBUS_NETWORK_INTERFACE = "fi.w1.wpa_supplicant1.Network"
17
18def byte_array_to_string(s):
19	import urllib
20	r = ""
21	for c in s:
22		if c >= 32 and c < 127:
23			r += "%c" % c
24		else:
25			r += urllib.quote(chr(c))
26	return r
27
28def list_interfaces(wpas_obj):
29	ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces',
30			      dbus_interface=dbus.PROPERTIES_IFACE)
31	for path in ifaces:
32		if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
33		ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname',
34			      dbus_interface=dbus.PROPERTIES_IFACE)
35		print ifname
36
37def interfaceAdded(interface, properties):
38	print "InterfaceAdded(%s): Ifname=%s" % (interface, properties['Ifname'])
39
40def interfaceRemoved(interface):
41	print "InterfaceRemoved(%s)" % (interface)
42
43def propertiesChanged(properties):
44	for i in properties:
45		print "PropertiesChanged: %s=%s" % (i, properties[i])
46
47def showBss(bss):
48	net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss)
49	net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
50
51	# Convert the byte-array for SSID and BSSID to printable strings
52	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID',
53			  dbus_interface=dbus.PROPERTIES_IFACE)
54	bssid = ""
55	for item in val:
56		bssid = bssid + ":%02x" % item
57	bssid = bssid[1:]
58	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID',
59			  dbus_interface=dbus.PROPERTIES_IFACE)
60	ssid = byte_array_to_string(val)
61
62	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA',
63			  dbus_interface=dbus.PROPERTIES_IFACE)
64	wpa = "no"
65	if val != None:
66		wpa = "yes"
67	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN',
68			  dbus_interface=dbus.PROPERTIES_IFACE)
69	wpa2 = "no"
70	if val != None:
71		wpa2 = "yes"
72	freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency',
73			   dbus_interface=dbus.PROPERTIES_IFACE)
74	signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal',
75			     dbus_interface=dbus.PROPERTIES_IFACE)
76	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates',
77			  dbus_interface=dbus.PROPERTIES_IFACE)
78	if len(val) > 0:
79		maxrate = val[0] / 1000000
80	else:
81		maxrate = 0
82
83	print "  %s  ::  ssid='%s'  wpa=%s  wpa2=%s  signal=%d  rate=%d  freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq)
84
85def scanDone(success):
86	gobject.MainLoop().quit()
87	print "Scan done: success=%s" % success
88
89def scanDone2(success, path=None):
90	print "Scan done: success=%s [path=%s]" % (success, path)
91
92def bssAdded(bss, properties):
93	print "BSS added: %s" % (bss)
94	showBss(bss)
95
96def bssRemoved(bss):
97	print "BSS removed: %s" % (bss)
98
99def blobAdded(blob):
100	print "BlobAdded(%s)" % (blob)
101
102def blobRemoved(blob):
103	print "BlobRemoved(%s)" % (blob)
104
105def networkAdded(network, properties):
106	print "NetworkAdded(%s)" % (network)
107
108def networkRemoved(network):
109	print "NetworkRemoved(%s)" % (network)
110
111def networkSelected(network):
112	print "NetworkSelected(%s)" % (network)
113
114def propertiesChangedInterface(properties):
115	for i in properties:
116		print "PropertiesChanged(interface): %s=%s" % (i, properties[i])
117
118def propertiesChangedBss(properties):
119	for i in properties:
120		print "PropertiesChanged(BSS): %s=%s" % (i, properties[i])
121
122def propertiesChangedNetwork(properties):
123	for i in properties:
124		print "PropertiesChanged(Network): %s=%s" % (i, properties[i])
125
126def main():
127	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
128	global bus
129	bus = dbus.SystemBus()
130	wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
131
132	if len(sys.argv) != 2:
133		list_interfaces(wpas_obj)
134		os._exit(1)
135
136	wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
137	bus.add_signal_receiver(interfaceAdded,
138				dbus_interface=WPAS_DBUS_INTERFACE,
139				signal_name="InterfaceAdded")
140	bus.add_signal_receiver(interfaceRemoved,
141				dbus_interface=WPAS_DBUS_INTERFACE,
142				signal_name="InterfaceRemoved")
143	bus.add_signal_receiver(propertiesChanged,
144				dbus_interface=WPAS_DBUS_INTERFACE,
145				signal_name="PropertiesChanged")
146
147	ifname = sys.argv[1]
148	path = wpas.GetInterface(ifname)
149	if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
150	iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
151	iface.connect_to_signal("ScanDone", scanDone2,
152				path_keyword='path')
153
154	bus.add_signal_receiver(scanDone,
155				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
156				signal_name="ScanDone",
157				path=path)
158	bus.add_signal_receiver(bssAdded,
159				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
160				signal_name="BSSAdded",
161				path=path)
162	bus.add_signal_receiver(bssRemoved,
163				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
164				signal_name="BSSRemoved",
165				path=path)
166	bus.add_signal_receiver(blobAdded,
167				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
168				signal_name="BlobAdded",
169				path=path)
170	bus.add_signal_receiver(blobRemoved,
171				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
172				signal_name="BlobRemoved",
173				path=path)
174	bus.add_signal_receiver(networkAdded,
175				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
176				signal_name="NetworkAdded",
177				path=path)
178	bus.add_signal_receiver(networkRemoved,
179				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
180				signal_name="NetworkRemoved",
181				path=path)
182	bus.add_signal_receiver(networkSelected,
183				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
184				signal_name="NetworkSelected",
185				path=path)
186	bus.add_signal_receiver(propertiesChangedInterface,
187				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
188				signal_name="PropertiesChanged",
189				path=path)
190
191	bus.add_signal_receiver(propertiesChangedBss,
192				dbus_interface=WPAS_DBUS_BSS_INTERFACE,
193				signal_name="PropertiesChanged")
194
195	bus.add_signal_receiver(propertiesChangedNetwork,
196				dbus_interface=WPAS_DBUS_NETWORK_INTERFACE,
197				signal_name="PropertiesChanged")
198
199	gobject.MainLoop().run()
200
201if __name__ == "__main__":
202	main()
203
204