]>
Commit | Line | Data |
---|---|---|
55fc1ce0 JM |
1 | #!/usr/bin/python |
2 | ||
3 | import dbus | |
4 | import sys, os | |
5 | import time | |
6 | import gobject | |
7 | from dbus.mainloop.glib import DBusGMainLoop | |
8 | ||
9 | WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1" | |
10 | WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1" | |
11 | WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1" | |
12 | ||
13 | WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface" | |
14 | WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces" | |
8e5568f8 | 15 | WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS" |
55fc1ce0 JM |
16 | |
17 | def byte_array_to_string(s): | |
18 | import urllib | |
19 | r = "" | |
20 | for c in s: | |
21 | if c >= 32 and c < 127: | |
22 | r += "%c" % c | |
23 | else: | |
24 | r += urllib.quote(chr(c)) | |
25 | return r | |
26 | ||
27 | def list_interfaces(wpas_obj): | |
e7f7d231 JM |
28 | ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces', |
29 | dbus_interface=dbus.PROPERTIES_IFACE) | |
30 | for path in ifaces: | |
31 | if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) | |
32 | ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname', | |
33 | dbus_interface=dbus.PROPERTIES_IFACE) | |
34 | print ifname | |
55fc1ce0 | 35 | |
777f07b6 JM |
36 | def propertiesChanged(properties): |
37 | if properties.has_key("State"): | |
38 | print "PropertiesChanged: State: %s" % (properties["State"]) | |
55fc1ce0 | 39 | |
c9df730b JM |
40 | def showBss(bss): |
41 | net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss) | |
42 | net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE) | |
c9df730b JM |
43 | |
44 | # Convert the byte-array for SSID and BSSID to printable strings | |
70993cd8 JM |
45 | val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID', |
46 | dbus_interface=dbus.PROPERTIES_IFACE) | |
c9df730b | 47 | bssid = "" |
70993cd8 | 48 | for item in val: |
c9df730b JM |
49 | bssid = bssid + ":%02x" % item |
50 | bssid = bssid[1:] | |
70993cd8 JM |
51 | val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID', |
52 | dbus_interface=dbus.PROPERTIES_IFACE) | |
53 | ssid = byte_array_to_string(val) | |
c9df730b | 54 | |
7899e2f4 | 55 | val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA', |
70993cd8 | 56 | dbus_interface=dbus.PROPERTIES_IFACE) |
c9df730b | 57 | wpa = "no" |
7899e2f4 | 58 | if len(val["KeyMgmt"]) > 0: |
c9df730b | 59 | wpa = "yes" |
7899e2f4 | 60 | val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN', |
70993cd8 | 61 | dbus_interface=dbus.PROPERTIES_IFACE) |
c9df730b | 62 | wpa2 = "no" |
7899e2f4 | 63 | if len(val["KeyMgmt"]) > 0: |
c9df730b | 64 | wpa2 = "yes" |
70993cd8 JM |
65 | freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency', |
66 | dbus_interface=dbus.PROPERTIES_IFACE) | |
67 | signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal', | |
68 | dbus_interface=dbus.PROPERTIES_IFACE) | |
75d328af | 69 | val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates', |
70993cd8 | 70 | dbus_interface=dbus.PROPERTIES_IFACE) |
75d328af WS |
71 | if len(val) > 0: |
72 | maxrate = val[0] / 1000000 | |
73 | else: | |
74 | maxrate = 0 | |
c9df730b | 75 | |
70993cd8 | 76 | print " %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq) |
c9df730b | 77 | |
55fc1ce0 | 78 | def scanDone(success): |
55fc1ce0 JM |
79 | print "Scan done: success=%s" % success |
80 | ||
81 | res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs', | |
82 | dbus_interface=dbus.PROPERTIES_IFACE) | |
83 | ||
84 | print "Scanned wireless networks:" | |
85 | for opath in res: | |
86 | print opath | |
c9df730b JM |
87 | showBss(opath) |
88 | ||
70993cd8 | 89 | def bssAdded(bss, properties): |
c9df730b JM |
90 | print "BSS added: %s" % (bss) |
91 | showBss(bss) | |
92 | ||
93 | def bssRemoved(bss): | |
94 | print "BSS removed: %s" % (bss) | |
55fc1ce0 JM |
95 | |
96 | def main(): | |
97 | dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) | |
98 | global bus | |
99 | bus = dbus.SystemBus() | |
100 | wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) | |
e7f7d231 JM |
101 | |
102 | if len(sys.argv) != 2: | |
103 | list_interfaces(wpas_obj) | |
104 | os._exit(1) | |
105 | ||
55fc1ce0 JM |
106 | wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) |
107 | bus.add_signal_receiver(scanDone, | |
108 | dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, | |
109 | signal_name="ScanDone") | |
c9df730b JM |
110 | bus.add_signal_receiver(bssAdded, |
111 | dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, | |
112 | signal_name="BSSAdded") | |
113 | bus.add_signal_receiver(bssRemoved, | |
114 | dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, | |
115 | signal_name="BSSRemoved") | |
777f07b6 | 116 | bus.add_signal_receiver(propertiesChanged, |
55fc1ce0 | 117 | dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, |
777f07b6 | 118 | signal_name="PropertiesChanged") |
55fc1ce0 | 119 | |
55fc1ce0 JM |
120 | ifname = sys.argv[1] |
121 | ||
122 | # See if wpa_supplicant already knows about this interface | |
123 | path = None | |
124 | try: | |
125 | path = wpas.GetInterface(ifname) | |
bab493b9 | 126 | except dbus.DBusException as exc: |
55fc1ce0 JM |
127 | if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"): |
128 | raise exc | |
129 | try: | |
130 | path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'}) | |
131 | time.sleep(1) | |
132 | ||
bab493b9 | 133 | except dbus.DBusException as exc: |
55fc1ce0 JM |
134 | if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"): |
135 | raise exc | |
136 | ||
137 | global if_obj | |
138 | if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) | |
139 | global iface | |
140 | iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE) | |
141 | iface.Scan({'Type': 'active'}) | |
142 | ||
143 | gobject.MainLoop().run() | |
144 | ||
145 | wpas.RemoveInterface(dbus.ObjectPath(path)) | |
146 | ||
147 | if __name__ == "__main__": | |
148 | main() | |
149 |