wpas-dbus-new.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/python
  2. import dbus
  3. import sys, os
  4. import time
  5. import gobject
  6. from dbus.mainloop.glib import DBusGMainLoop
  7. WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
  8. WPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
  9. WPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"
  10. WPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
  11. WPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
  12. WPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.Interface.BSS"
  13. def byte_array_to_string(s):
  14. import urllib
  15. r = ""
  16. for c in s:
  17. if c >= 32 and c < 127:
  18. r += "%c" % c
  19. else:
  20. r += urllib.quote(chr(c))
  21. return r
  22. def list_interfaces(wpas_obj):
  23. ifaces = wpas_obj.Interfaces
  24. for i in ifaces:
  25. print "%s" (i)
  26. def stateChanged(newState, oldState):
  27. print "StateChanged(%s -> %s)" % (oldState, newState)
  28. def showBss(bss):
  29. net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss)
  30. net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
  31. props = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Properties',
  32. dbus_interface=dbus.PROPERTIES_IFACE)
  33. #print props
  34. # Convert the byte-array for SSID and BSSID to printable strings
  35. bssid = ""
  36. for item in props['BSSID']:
  37. bssid = bssid + ":%02x" % item
  38. bssid = bssid[1:]
  39. ssid = byte_array_to_string(props["SSID"])
  40. wpa = "no"
  41. if props.has_key("WPAIE"):
  42. wpa = "yes"
  43. wpa2 = "no"
  44. if props.has_key("RSNIE"):
  45. wpa2 = "yes"
  46. freq = 0
  47. if props.has_key("Frequency"):
  48. freq = props["Frequency"]
  49. caps = props["Capabilities"]
  50. qual = props["Quality"]
  51. level = props["Level"]
  52. noise = props["Noise"]
  53. maxrate = props["MaxRate"] / 1000000
  54. print " %s :: ssid='%s' wpa=%s wpa2=%s quality=%d%% rate=%d freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq)
  55. def scanDone(success):
  56. gobject.MainLoop().quit()
  57. print "Scan done: success=%s" % success
  58. res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs',
  59. dbus_interface=dbus.PROPERTIES_IFACE)
  60. print "Scanned wireless networks:"
  61. for opath in res:
  62. print opath
  63. showBss(opath)
  64. def bssAdded(bss):
  65. print "BSS added: %s" % (bss)
  66. showBss(bss)
  67. def bssRemoved(bss):
  68. print "BSS removed: %s" % (bss)
  69. def main():
  70. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  71. global bus
  72. bus = dbus.SystemBus()
  73. wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
  74. wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
  75. bus.add_signal_receiver(scanDone,
  76. dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
  77. signal_name="ScanDone")
  78. bus.add_signal_receiver(bssAdded,
  79. dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
  80. signal_name="BSSAdded")
  81. bus.add_signal_receiver(bssRemoved,
  82. dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
  83. signal_name="BSSRemoved")
  84. bus.add_signal_receiver(stateChanged,
  85. dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
  86. signal_name="StateChanged")
  87. if len(sys.argv) != 2:
  88. list_interfaces(wpas_obj)
  89. os._exit(1)
  90. ifname = sys.argv[1]
  91. # See if wpa_supplicant already knows about this interface
  92. path = None
  93. try:
  94. path = wpas.GetInterface(ifname)
  95. except dbus.DBusException, exc:
  96. if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
  97. raise exc
  98. try:
  99. path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'})
  100. time.sleep(1)
  101. except dbus.DBusException, exc:
  102. if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
  103. raise exc
  104. global if_obj
  105. if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
  106. global iface
  107. iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
  108. iface.Scan({'Type': 'active'})
  109. gobject.MainLoop().run()
  110. wpas.RemoveInterface(dbus.ObjectPath(path))
  111. if __name__ == "__main__":
  112. main()