1214501Srpaulo#!/usr/bin/python 2214501Srpaulo 3214501Srpauloimport dbus 4214501Srpauloimport sys, os 5214501Srpauloimport time 6214501Srpauloimport gobject 7214501Srpaulofrom dbus.mainloop.glib import DBusGMainLoop 8214501Srpaulo 9214501SrpauloWPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1" 10214501SrpauloWPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1" 11214501SrpauloWPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1" 12214501Srpaulo 13214501SrpauloWPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface" 14214501SrpauloWPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces" 15214501SrpauloWPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS" 16214501Srpaulo 17214501Srpaulodef byte_array_to_string(s): 18214501Srpaulo import urllib 19214501Srpaulo r = "" 20214501Srpaulo for c in s: 21214501Srpaulo if c >= 32 and c < 127: 22214501Srpaulo r += "%c" % c 23214501Srpaulo else: 24214501Srpaulo r += urllib.quote(chr(c)) 25214501Srpaulo return r 26214501Srpaulo 27214501Srpaulodef list_interfaces(wpas_obj): 28214501Srpaulo ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces', 29214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 30214501Srpaulo for path in ifaces: 31214501Srpaulo if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) 32214501Srpaulo ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname', 33214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 34214501Srpaulo print ifname 35214501Srpaulo 36214501Srpaulodef propertiesChanged(properties): 37214501Srpaulo if properties.has_key("State"): 38214501Srpaulo print "PropertiesChanged: State: %s" % (properties["State"]) 39214501Srpaulo 40214501Srpaulodef showBss(bss): 41214501Srpaulo net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss) 42214501Srpaulo net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE) 43214501Srpaulo 44214501Srpaulo # Convert the byte-array for SSID and BSSID to printable strings 45214501Srpaulo val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID', 46214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 47214501Srpaulo bssid = "" 48214501Srpaulo for item in val: 49214501Srpaulo bssid = bssid + ":%02x" % item 50214501Srpaulo bssid = bssid[1:] 51214501Srpaulo val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID', 52214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 53214501Srpaulo ssid = byte_array_to_string(val) 54214501Srpaulo 55214501Srpaulo val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA', 56214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 57214501Srpaulo wpa = "no" 58214501Srpaulo if len(val["KeyMgmt"]) > 0: 59214501Srpaulo wpa = "yes" 60214501Srpaulo val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN', 61214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 62214501Srpaulo wpa2 = "no" 63214501Srpaulo if len(val["KeyMgmt"]) > 0: 64214501Srpaulo wpa2 = "yes" 65214501Srpaulo freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency', 66214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 67214501Srpaulo signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal', 68214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 69214501Srpaulo val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates', 70214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 71214501Srpaulo if len(val) > 0: 72214501Srpaulo maxrate = val[0] / 1000000 73214501Srpaulo else: 74214501Srpaulo maxrate = 0 75214501Srpaulo 76214501Srpaulo print " %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq) 77214501Srpaulo 78214501Srpaulodef scanDone(success): 79214501Srpaulo print "Scan done: success=%s" % success 80214501Srpaulo 81214501Srpaulo res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs', 82214501Srpaulo dbus_interface=dbus.PROPERTIES_IFACE) 83214501Srpaulo 84214501Srpaulo print "Scanned wireless networks:" 85214501Srpaulo for opath in res: 86214501Srpaulo print opath 87214501Srpaulo showBss(opath) 88214501Srpaulo 89214501Srpaulodef bssAdded(bss, properties): 90214501Srpaulo print "BSS added: %s" % (bss) 91214501Srpaulo showBss(bss) 92214501Srpaulo 93214501Srpaulodef bssRemoved(bss): 94214501Srpaulo print "BSS removed: %s" % (bss) 95214501Srpaulo 96214501Srpaulodef main(): 97214501Srpaulo dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 98214501Srpaulo global bus 99214501Srpaulo bus = dbus.SystemBus() 100214501Srpaulo wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) 101214501Srpaulo 102214501Srpaulo if len(sys.argv) != 2: 103214501Srpaulo list_interfaces(wpas_obj) 104214501Srpaulo os._exit(1) 105214501Srpaulo 106214501Srpaulo wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) 107214501Srpaulo bus.add_signal_receiver(scanDone, 108214501Srpaulo dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 109214501Srpaulo signal_name="ScanDone") 110214501Srpaulo bus.add_signal_receiver(bssAdded, 111214501Srpaulo dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 112214501Srpaulo signal_name="BSSAdded") 113214501Srpaulo bus.add_signal_receiver(bssRemoved, 114214501Srpaulo dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 115214501Srpaulo signal_name="BSSRemoved") 116214501Srpaulo bus.add_signal_receiver(propertiesChanged, 117214501Srpaulo dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 118214501Srpaulo signal_name="PropertiesChanged") 119214501Srpaulo 120214501Srpaulo ifname = sys.argv[1] 121214501Srpaulo 122214501Srpaulo # See if wpa_supplicant already knows about this interface 123214501Srpaulo path = None 124214501Srpaulo try: 125214501Srpaulo path = wpas.GetInterface(ifname) 126214501Srpaulo except dbus.DBusException, exc: 127214501Srpaulo if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"): 128214501Srpaulo raise exc 129214501Srpaulo try: 130214501Srpaulo path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'}) 131214501Srpaulo time.sleep(1) 132214501Srpaulo 133214501Srpaulo except dbus.DBusException, exc: 134214501Srpaulo if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"): 135214501Srpaulo raise exc 136214501Srpaulo 137214501Srpaulo global if_obj 138214501Srpaulo if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) 139214501Srpaulo global iface 140214501Srpaulo iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE) 141214501Srpaulo iface.Scan({'Type': 'active'}) 142214501Srpaulo 143214501Srpaulo gobject.MainLoop().run() 144214501Srpaulo 145214501Srpaulo wpas.RemoveInterface(dbus.ObjectPath(path)) 146214501Srpaulo 147214501Srpauloif __name__ == "__main__": 148214501Srpaulo main() 149214501Srpaulo 150