#!/usr/bin/python import dbus import sys, os import time WPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant" WPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant" WPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant" WPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface" WPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces" WPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID" def byte_array_to_string(s): import urllib r = "" for c in s: if c >= 32 and c < 127: r += "%c" % c else: r += urllib.quote(chr(c)) return r def main(): if len(sys.argv) != 2: print "Usage: wpas-test.py <interface>" os._exit(1) ifname = sys.argv[1] bus = dbus.SystemBus() wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) # See if wpa_supplicant already knows about this interface path = None try: path = wpas.getInterface(ifname) except dbus.dbus_bindings.DBusException, exc: if str(exc) != "wpa_supplicant knows nothing about this interface.": raise exc try: path = wpas.addInterface(ifname, {'driver': dbus.Variant('wext')}) except dbus.dbus_bindings.DBusException, exc: if str(exc) != "wpa_supplicant already controls this interface.": raise exc if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE) iface.scan() # Should really wait for the "scanResults" signal instead of sleeping time.sleep(5) res = iface.scanResults() print "Scanned wireless networks:" for opath in res: net_obj = bus.get_object(WPAS_DBUS_SERVICE, opath) net = dbus.Interface(net_obj, WPAS_DBUS_BSSID_INTERFACE) props = net.properties() # Convert the byte-array for SSID and BSSID to printable strings bssid = "" for item in props["bssid"]: bssid = bssid + ":%02x" % item bssid = bssid[1:] ssid = byte_array_to_string(props["ssid"]) wpa = "no" if props.has_key("wpaie"): wpa = "yes" wpa2 = "no" if props.has_key("rsnie"): wpa2 = "yes" freq = 0 if props.has_key("frequency"): freq = props["frequency"] caps = props["capabilities"] qual = props["quality"] level = props["level"] noise = props["noise"] maxrate = props["maxrate"] / 1000000 print " %s :: ssid='%s' wpa=%s wpa2=%s quality=%d%% rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq) wpas.removeInterface(dbus.ObjectPath(path)) # Should fail here with unknown interface error iface.scan() if __name__ == "__main__": main()