1189251Ssam#!/usr/bin/python 2189251Ssam 3189251Ssamimport dbus 4189251Ssamimport sys, os 5189251Ssamimport time 6189251Ssam 7189251SsamWPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant" 8189251SsamWPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant" 9189251SsamWPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant" 10189251Ssam 11189251SsamWPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface" 12189251SsamWPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces" 13189251SsamWPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID" 14189251Ssam 15189251Ssamdef byte_array_to_string(s): 16189251Ssam import urllib 17189251Ssam r = "" 18189251Ssam for c in s: 19189251Ssam if c >= 32 and c < 127: 20189251Ssam r += "%c" % c 21189251Ssam else: 22189251Ssam r += urllib.quote(chr(c)) 23189251Ssam return r 24189251Ssam 25189251Ssamdef main(): 26189251Ssam if len(sys.argv) != 2: 27189251Ssam print "Usage: wpas-test.py <interface>" 28189251Ssam os._exit(1) 29189251Ssam 30189251Ssam ifname = sys.argv[1] 31189251Ssam 32189251Ssam bus = dbus.SystemBus() 33189251Ssam wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) 34189251Ssam wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) 35189251Ssam 36189251Ssam # See if wpa_supplicant already knows about this interface 37189251Ssam path = None 38189251Ssam try: 39189251Ssam path = wpas.getInterface(ifname) 40189251Ssam except dbus.dbus_bindings.DBusException, exc: 41189251Ssam if str(exc) != "wpa_supplicant knows nothing about this interface.": 42189251Ssam raise exc 43189251Ssam try: 44189251Ssam path = wpas.addInterface(ifname, {'driver': dbus.Variant('wext')}) 45189251Ssam except dbus.dbus_bindings.DBusException, exc: 46189251Ssam if str(exc) != "wpa_supplicant already controls this interface.": 47189251Ssam raise exc 48189251Ssam 49189251Ssam if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) 50189251Ssam iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE) 51189251Ssam iface.scan() 52189251Ssam # Should really wait for the "scanResults" signal instead of sleeping 53189251Ssam time.sleep(5) 54189251Ssam res = iface.scanResults() 55189251Ssam 56189251Ssam print "Scanned wireless networks:" 57189251Ssam for opath in res: 58189251Ssam net_obj = bus.get_object(WPAS_DBUS_SERVICE, opath) 59189251Ssam net = dbus.Interface(net_obj, WPAS_DBUS_BSSID_INTERFACE) 60189251Ssam props = net.properties() 61189251Ssam 62189251Ssam # Convert the byte-array for SSID and BSSID to printable strings 63189251Ssam bssid = "" 64189251Ssam for item in props["bssid"]: 65189251Ssam bssid = bssid + ":%02x" % item 66189251Ssam bssid = bssid[1:] 67189251Ssam ssid = byte_array_to_string(props["ssid"]) 68189251Ssam wpa = "no" 69189251Ssam if props.has_key("wpaie"): 70189251Ssam wpa = "yes" 71189251Ssam wpa2 = "no" 72189251Ssam if props.has_key("rsnie"): 73189251Ssam wpa2 = "yes" 74189251Ssam freq = 0 75189251Ssam if props.has_key("frequency"): 76189251Ssam freq = props["frequency"] 77189251Ssam caps = props["capabilities"] 78189251Ssam qual = props["quality"] 79189251Ssam level = props["level"] 80189251Ssam noise = props["noise"] 81189251Ssam maxrate = props["maxrate"] / 1000000 82189251Ssam 83189251Ssam print " %s :: ssid='%s' wpa=%s wpa2=%s quality=%d%% rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq) 84189251Ssam 85189251Ssam wpas.removeInterface(dbus.ObjectPath(path)) 86189251Ssam # Should fail here with unknown interface error 87189251Ssam iface.scan() 88189251Ssam 89189251Ssamif __name__ == "__main__": 90189251Ssam main() 91189251Ssam 92