123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #!/usr/bin/python
- import dbus
- import sys, os
- import time
- import gobject
- from dbus.mainloop.glib import DBusGMainLoop
- WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
- WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
- WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"
- WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
- WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
- WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS"
- 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 list_interfaces(wpas_obj):
- ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces',
- dbus_interface=dbus.PROPERTIES_IFACE)
- for path in ifaces:
- if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
- ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname',
- dbus_interface=dbus.PROPERTIES_IFACE)
- print ifname
- def propertiesChanged(properties):
- if properties.has_key("State"):
- print "PropertiesChanged: State: %s" % (properties["State"])
- def showBss(bss):
- net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss)
- net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
- # Convert the byte-array for SSID and BSSID to printable strings
- val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID',
- dbus_interface=dbus.PROPERTIES_IFACE)
- bssid = ""
- for item in val:
- bssid = bssid + ":%02x" % item
- bssid = bssid[1:]
- val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID',
- dbus_interface=dbus.PROPERTIES_IFACE)
- ssid = byte_array_to_string(val)
- val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA',
- dbus_interface=dbus.PROPERTIES_IFACE)
- wpa = "no"
- if len(val["KeyMgmt"]) > 0:
- wpa = "yes"
- val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN',
- dbus_interface=dbus.PROPERTIES_IFACE)
- wpa2 = "no"
- if len(val["KeyMgmt"]) > 0:
- wpa2 = "yes"
- freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency',
- dbus_interface=dbus.PROPERTIES_IFACE)
- signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal',
- dbus_interface=dbus.PROPERTIES_IFACE)
- val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates',
- dbus_interface=dbus.PROPERTIES_IFACE)
- if len(val) > 0:
- maxrate = val[0] / 1000000
- else:
- maxrate = 0
- print " %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq)
- def scanDone(success):
- print "Scan done: success=%s" % success
-
- res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs',
- dbus_interface=dbus.PROPERTIES_IFACE)
- print "Scanned wireless networks:"
- for opath in res:
- print opath
- showBss(opath)
- def bssAdded(bss, properties):
- print "BSS added: %s" % (bss)
- showBss(bss)
- def bssRemoved(bss):
- print "BSS removed: %s" % (bss)
- def main():
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- global bus
- bus = dbus.SystemBus()
- wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
- if len(sys.argv) != 2:
- list_interfaces(wpas_obj)
- os._exit(1)
- wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
- bus.add_signal_receiver(scanDone,
- dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
- signal_name="ScanDone")
- bus.add_signal_receiver(bssAdded,
- dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
- signal_name="BSSAdded")
- bus.add_signal_receiver(bssRemoved,
- dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
- signal_name="BSSRemoved")
- bus.add_signal_receiver(propertiesChanged,
- dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
- signal_name="PropertiesChanged")
- ifname = sys.argv[1]
- # See if wpa_supplicant already knows about this interface
- path = None
- try:
- path = wpas.GetInterface(ifname)
- except dbus.DBusException, exc:
- if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
- raise exc
- try:
- path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'})
- time.sleep(1)
- except dbus.DBusException, exc:
- if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
- raise exc
- global if_obj
- if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
- global iface
- iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
- iface.Scan({'Type': 'active'})
- gobject.MainLoop().run()
- wpas.RemoveInterface(dbus.ObjectPath(path))
- if __name__ == "__main__":
- main()
|