00001
00002
00003 import dbus
00004 import sys, os
00005 import time
00006 import gobject
00007 from dbus.mainloop.glib import DBusGMainLoop
00008
00009 WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
00010 WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
00011 WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"
00012
00013 WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
00014 WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
00015 WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS"
00016
00017 def byte_array_to_string(s):
00018 import urllib
00019 r = ""
00020 for c in s:
00021 if c >= 32 and c < 127:
00022 r += "%c" % c
00023 else:
00024 r += urllib.quote(chr(c))
00025 return r
00026
00027 def list_interfaces(wpas_obj):
00028 ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces',
00029 dbus_interface=dbus.PROPERTIES_IFACE)
00030 for path in ifaces:
00031 if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
00032 ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname',
00033 dbus_interface=dbus.PROPERTIES_IFACE)
00034 print ifname
00035
00036 def propertiesChanged(properties):
00037 if properties.has_key("State"):
00038 print "PropertiesChanged: State: %s" % (properties["State"])
00039
00040 def showBss(bss):
00041 net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss)
00042 net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
00043
00044
00045 val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID',
00046 dbus_interface=dbus.PROPERTIES_IFACE)
00047 bssid = ""
00048 for item in val:
00049 bssid = bssid + ":%02x" % item
00050 bssid = bssid[1:]
00051 val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID',
00052 dbus_interface=dbus.PROPERTIES_IFACE)
00053 ssid = byte_array_to_string(val)
00054
00055 val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA',
00056 dbus_interface=dbus.PROPERTIES_IFACE)
00057 wpa = "no"
00058 if len(val["KeyMgmt"]) > 0:
00059 wpa = "yes"
00060 val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN',
00061 dbus_interface=dbus.PROPERTIES_IFACE)
00062 wpa2 = "no"
00063 if len(val["KeyMgmt"]) > 0:
00064 wpa2 = "yes"
00065 freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency',
00066 dbus_interface=dbus.PROPERTIES_IFACE)
00067 signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal',
00068 dbus_interface=dbus.PROPERTIES_IFACE)
00069 val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates',
00070 dbus_interface=dbus.PROPERTIES_IFACE)
00071 if len(val) > 0:
00072 maxrate = val[0] / 1000000
00073 else:
00074 maxrate = 0
00075
00076 print " %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq)
00077
00078 def scanDone(success):
00079 print "Scan done: success=%s" % success
00080
00081 res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs',
00082 dbus_interface=dbus.PROPERTIES_IFACE)
00083
00084 print "Scanned wireless networks:"
00085 for opath in res:
00086 print opath
00087 showBss(opath)
00088
00089 def bssAdded(bss, properties):
00090 print "BSS added: %s" % (bss)
00091 showBss(bss)
00092
00093 def bssRemoved(bss):
00094 print "BSS removed: %s" % (bss)
00095
00096 def main():
00097 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
00098 global bus
00099 bus = dbus.SystemBus()
00100 wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
00101
00102 if len(sys.argv) != 2:
00103 list_interfaces(wpas_obj)
00104 os._exit(1)
00105
00106 wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
00107 bus.add_signal_receiver(scanDone,
00108 dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
00109 signal_name="ScanDone")
00110 bus.add_signal_receiver(bssAdded,
00111 dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
00112 signal_name="BSSAdded")
00113 bus.add_signal_receiver(bssRemoved,
00114 dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
00115 signal_name="BSSRemoved")
00116 bus.add_signal_receiver(propertiesChanged,
00117 dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
00118 signal_name="PropertiesChanged")
00119
00120 ifname = sys.argv[1]
00121
00122
00123 path = None
00124 try:
00125 path = wpas.GetInterface(ifname)
00126 except dbus.DBusException, exc:
00127 if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
00128 raise exc
00129 try:
00130 path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'})
00131 time.sleep(1)
00132
00133 except dbus.DBusException, exc:
00134 if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
00135 raise exc
00136
00137 global if_obj
00138 if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
00139 global iface
00140 iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
00141 iface.Scan({'Type': 'active'})
00142
00143 gobject.MainLoop().run()
00144
00145 wpas.RemoveInterface(dbus.ObjectPath(path))
00146
00147 if __name__ == "__main__":
00148 main()
00149