18dbcf02cSchristos#!/usr/bin/python 28dbcf02cSchristos 38dbcf02cSchristosimport dbus 48dbcf02cSchristosimport sys, os 58dbcf02cSchristosimport time 68dbcf02cSchristosimport gobject 78dbcf02cSchristosfrom dbus.mainloop.glib import DBusGMainLoop 88dbcf02cSchristos 98dbcf02cSchristosWPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1" 108dbcf02cSchristosWPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1" 118dbcf02cSchristosWPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1" 128dbcf02cSchristos 138dbcf02cSchristosWPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface" 148dbcf02cSchristosWPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces" 158dbcf02cSchristosWPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS" 168dbcf02cSchristos 178dbcf02cSchristosdef byte_array_to_string(s): 188dbcf02cSchristos import urllib 198dbcf02cSchristos r = "" 208dbcf02cSchristos for c in s: 218dbcf02cSchristos if c >= 32 and c < 127: 228dbcf02cSchristos r += "%c" % c 238dbcf02cSchristos else: 248dbcf02cSchristos r += urllib.quote(chr(c)) 258dbcf02cSchristos return r 268dbcf02cSchristos 278dbcf02cSchristosdef list_interfaces(wpas_obj): 288dbcf02cSchristos ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces', 298dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 308dbcf02cSchristos for path in ifaces: 318dbcf02cSchristos if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) 328dbcf02cSchristos ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname', 338dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 34*3d6c0713Schristos print(ifname) 358dbcf02cSchristos 368dbcf02cSchristosdef propertiesChanged(properties): 378dbcf02cSchristos if properties.has_key("State"): 38*3d6c0713Schristos print("PropertiesChanged: State: %s" % (properties["State"])) 398dbcf02cSchristos 408dbcf02cSchristosdef showBss(bss): 418dbcf02cSchristos net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss) 428dbcf02cSchristos net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE) 438dbcf02cSchristos 448dbcf02cSchristos # Convert the byte-array for SSID and BSSID to printable strings 458dbcf02cSchristos val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID', 468dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 478dbcf02cSchristos bssid = "" 488dbcf02cSchristos for item in val: 498dbcf02cSchristos bssid = bssid + ":%02x" % item 508dbcf02cSchristos bssid = bssid[1:] 518dbcf02cSchristos val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID', 528dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 538dbcf02cSchristos ssid = byte_array_to_string(val) 548dbcf02cSchristos 558dbcf02cSchristos val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA', 568dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 578dbcf02cSchristos wpa = "no" 588dbcf02cSchristos if len(val["KeyMgmt"]) > 0: 598dbcf02cSchristos wpa = "yes" 608dbcf02cSchristos val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN', 618dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 628dbcf02cSchristos wpa2 = "no" 638dbcf02cSchristos if len(val["KeyMgmt"]) > 0: 648dbcf02cSchristos wpa2 = "yes" 658dbcf02cSchristos freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency', 668dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 678dbcf02cSchristos signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal', 688dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 698dbcf02cSchristos val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates', 708dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 718dbcf02cSchristos if len(val) > 0: 728dbcf02cSchristos maxrate = val[0] / 1000000 738dbcf02cSchristos else: 748dbcf02cSchristos maxrate = 0 758dbcf02cSchristos 76*3d6c0713Schristos print(" %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq)) 778dbcf02cSchristos 788dbcf02cSchristosdef scanDone(success): 79*3d6c0713Schristos print("Scan done: success=%s" % success) 808dbcf02cSchristos 818dbcf02cSchristos res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs', 828dbcf02cSchristos dbus_interface=dbus.PROPERTIES_IFACE) 838dbcf02cSchristos 84*3d6c0713Schristos print("Scanned wireless networks:") 858dbcf02cSchristos for opath in res: 86*3d6c0713Schristos print(opath) 878dbcf02cSchristos showBss(opath) 888dbcf02cSchristos 898dbcf02cSchristosdef bssAdded(bss, properties): 90*3d6c0713Schristos print("BSS added: %s" % (bss)) 918dbcf02cSchristos showBss(bss) 928dbcf02cSchristos 938dbcf02cSchristosdef bssRemoved(bss): 94*3d6c0713Schristos print("BSS removed: %s" % (bss)) 958dbcf02cSchristos 968dbcf02cSchristosdef main(): 978dbcf02cSchristos dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 988dbcf02cSchristos global bus 998dbcf02cSchristos bus = dbus.SystemBus() 1008dbcf02cSchristos wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) 1018dbcf02cSchristos 1028dbcf02cSchristos if len(sys.argv) != 2: 1038dbcf02cSchristos list_interfaces(wpas_obj) 1048dbcf02cSchristos os._exit(1) 1058dbcf02cSchristos 1068dbcf02cSchristos wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) 1078dbcf02cSchristos bus.add_signal_receiver(scanDone, 1088dbcf02cSchristos dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 1098dbcf02cSchristos signal_name="ScanDone") 1108dbcf02cSchristos bus.add_signal_receiver(bssAdded, 1118dbcf02cSchristos dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 1128dbcf02cSchristos signal_name="BSSAdded") 1138dbcf02cSchristos bus.add_signal_receiver(bssRemoved, 1148dbcf02cSchristos dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 1158dbcf02cSchristos signal_name="BSSRemoved") 1168dbcf02cSchristos bus.add_signal_receiver(propertiesChanged, 1178dbcf02cSchristos dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE, 1188dbcf02cSchristos signal_name="PropertiesChanged") 1198dbcf02cSchristos 1208dbcf02cSchristos ifname = sys.argv[1] 1218dbcf02cSchristos 1228dbcf02cSchristos # See if wpa_supplicant already knows about this interface 1238dbcf02cSchristos path = None 1248dbcf02cSchristos try: 1258dbcf02cSchristos path = wpas.GetInterface(ifname) 126*3d6c0713Schristos except dbus.DBusException as exc: 1278dbcf02cSchristos if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"): 1288dbcf02cSchristos raise exc 1298dbcf02cSchristos try: 1308dbcf02cSchristos path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'}) 1318dbcf02cSchristos time.sleep(1) 1328dbcf02cSchristos 133*3d6c0713Schristos except dbus.DBusException as exc: 1348dbcf02cSchristos if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"): 1358dbcf02cSchristos raise exc 1368dbcf02cSchristos 1378dbcf02cSchristos global if_obj 1388dbcf02cSchristos if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) 1398dbcf02cSchristos global iface 1408dbcf02cSchristos iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE) 1418dbcf02cSchristos iface.Scan({'Type': 'active'}) 1428dbcf02cSchristos 1438dbcf02cSchristos gobject.MainLoop().run() 1448dbcf02cSchristos 1458dbcf02cSchristos wpas.RemoveInterface(dbus.ObjectPath(path)) 1468dbcf02cSchristos 1478dbcf02cSchristosif __name__ == "__main__": 1488dbcf02cSchristos main() 1498dbcf02cSchristos 150