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