xref: /netbsd-src/external/bsd/wpa/dist/wpa_supplicant/examples/wpas-dbus-new.py (revision 3d6c0713cbbf51a549dcd172f2c1ea93f7781249)
18dbcf02cSchristos#!/usr/bin/python
28dbcf02cSchristos
38dbcf02cSchristosimport dbus
48dbcf02cSchristosimport sys, os
58dbcf02cSchristosimport time
68dbcf02cSchristosimport gobject
78dbcf02cSchristosfrom dbus.mainloop.glib import DBusGMainLoop
88dbcf02cSchristos
98dbcf02cSchristosWPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
108dbcf02cSchristosWPAS_DBUS_INTERFACE = "fi.w1.wpa_supplicant1"
118dbcf02cSchristosWPAS_DBUS_OPATH = "/fi/w1/wpa_supplicant1"
128dbcf02cSchristos
138dbcf02cSchristosWPAS_DBUS_INTERFACES_INTERFACE = "fi.w1.wpa_supplicant1.Interface"
148dbcf02cSchristosWPAS_DBUS_INTERFACES_OPATH = "/fi/w1/wpa_supplicant1/Interfaces"
158dbcf02cSchristosWPAS_DBUS_BSS_INTERFACE = "fi.w1.wpa_supplicant1.BSS"
168dbcf02cSchristos
178dbcf02cSchristosdef byte_array_to_string(s):
188dbcf02cSchristos	import urllib
198dbcf02cSchristos	r = ""
208dbcf02cSchristos	for c in s:
218dbcf02cSchristos		if c >= 32 and c < 127:
228dbcf02cSchristos			r += "%c" % c
238dbcf02cSchristos		else:
248dbcf02cSchristos			r += urllib.quote(chr(c))
258dbcf02cSchristos	return r
268dbcf02cSchristos
278dbcf02cSchristosdef list_interfaces(wpas_obj):
288dbcf02cSchristos	ifaces = wpas_obj.Get(WPAS_DBUS_INTERFACE, 'Interfaces',
298dbcf02cSchristos			      dbus_interface=dbus.PROPERTIES_IFACE)
308dbcf02cSchristos	for path in ifaces:
318dbcf02cSchristos		if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
328dbcf02cSchristos		ifname = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'Ifname',
338dbcf02cSchristos			      dbus_interface=dbus.PROPERTIES_IFACE)
34*3d6c0713Schristos		print(ifname)
358dbcf02cSchristos
368dbcf02cSchristosdef propertiesChanged(properties):
378dbcf02cSchristos	if properties.has_key("State"):
38*3d6c0713Schristos		print("PropertiesChanged: State: %s" % (properties["State"]))
398dbcf02cSchristos
408dbcf02cSchristosdef showBss(bss):
418dbcf02cSchristos	net_obj = bus.get_object(WPAS_DBUS_SERVICE, bss)
428dbcf02cSchristos	net = dbus.Interface(net_obj, WPAS_DBUS_BSS_INTERFACE)
438dbcf02cSchristos
448dbcf02cSchristos	# Convert the byte-array for SSID and BSSID to printable strings
458dbcf02cSchristos	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'BSSID',
468dbcf02cSchristos			  dbus_interface=dbus.PROPERTIES_IFACE)
478dbcf02cSchristos	bssid = ""
488dbcf02cSchristos	for item in val:
498dbcf02cSchristos		bssid = bssid + ":%02x" % item
508dbcf02cSchristos	bssid = bssid[1:]
518dbcf02cSchristos	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'SSID',
528dbcf02cSchristos			  dbus_interface=dbus.PROPERTIES_IFACE)
538dbcf02cSchristos	ssid = byte_array_to_string(val)
548dbcf02cSchristos
558dbcf02cSchristos	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'WPA',
568dbcf02cSchristos			  dbus_interface=dbus.PROPERTIES_IFACE)
578dbcf02cSchristos	wpa = "no"
588dbcf02cSchristos	if len(val["KeyMgmt"]) > 0:
598dbcf02cSchristos		wpa = "yes"
608dbcf02cSchristos	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'RSN',
618dbcf02cSchristos			  dbus_interface=dbus.PROPERTIES_IFACE)
628dbcf02cSchristos	wpa2 = "no"
638dbcf02cSchristos	if len(val["KeyMgmt"]) > 0:
648dbcf02cSchristos		wpa2 = "yes"
658dbcf02cSchristos	freq = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Frequency',
668dbcf02cSchristos			   dbus_interface=dbus.PROPERTIES_IFACE)
678dbcf02cSchristos	signal = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Signal',
688dbcf02cSchristos			     dbus_interface=dbus.PROPERTIES_IFACE)
698dbcf02cSchristos	val = net_obj.Get(WPAS_DBUS_BSS_INTERFACE, 'Rates',
708dbcf02cSchristos			  dbus_interface=dbus.PROPERTIES_IFACE)
718dbcf02cSchristos	if len(val) > 0:
728dbcf02cSchristos		maxrate = val[0] / 1000000
738dbcf02cSchristos	else:
748dbcf02cSchristos		maxrate = 0
758dbcf02cSchristos
76*3d6c0713Schristos	print("  %s  ::  ssid='%s'  wpa=%s  wpa2=%s  signal=%d  rate=%d  freq=%d" % (bssid, ssid, wpa, wpa2, signal, maxrate, freq))
778dbcf02cSchristos
788dbcf02cSchristosdef scanDone(success):
79*3d6c0713Schristos	print("Scan done: success=%s" % success)
808dbcf02cSchristos
818dbcf02cSchristos	res = if_obj.Get(WPAS_DBUS_INTERFACES_INTERFACE, 'BSSs',
828dbcf02cSchristos			 dbus_interface=dbus.PROPERTIES_IFACE)
838dbcf02cSchristos
84*3d6c0713Schristos	print("Scanned wireless networks:")
858dbcf02cSchristos	for opath in res:
86*3d6c0713Schristos		print(opath)
878dbcf02cSchristos		showBss(opath)
888dbcf02cSchristos
898dbcf02cSchristosdef bssAdded(bss, properties):
90*3d6c0713Schristos	print("BSS added: %s" % (bss))
918dbcf02cSchristos	showBss(bss)
928dbcf02cSchristos
938dbcf02cSchristosdef bssRemoved(bss):
94*3d6c0713Schristos	print("BSS removed: %s" % (bss))
958dbcf02cSchristos
968dbcf02cSchristosdef main():
978dbcf02cSchristos	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
988dbcf02cSchristos	global bus
998dbcf02cSchristos	bus = dbus.SystemBus()
1008dbcf02cSchristos	wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
1018dbcf02cSchristos
1028dbcf02cSchristos	if len(sys.argv) != 2:
1038dbcf02cSchristos		list_interfaces(wpas_obj)
1048dbcf02cSchristos		os._exit(1)
1058dbcf02cSchristos
1068dbcf02cSchristos	wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
1078dbcf02cSchristos	bus.add_signal_receiver(scanDone,
1088dbcf02cSchristos				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
1098dbcf02cSchristos				signal_name="ScanDone")
1108dbcf02cSchristos	bus.add_signal_receiver(bssAdded,
1118dbcf02cSchristos				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
1128dbcf02cSchristos				signal_name="BSSAdded")
1138dbcf02cSchristos	bus.add_signal_receiver(bssRemoved,
1148dbcf02cSchristos				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
1158dbcf02cSchristos				signal_name="BSSRemoved")
1168dbcf02cSchristos	bus.add_signal_receiver(propertiesChanged,
1178dbcf02cSchristos				dbus_interface=WPAS_DBUS_INTERFACES_INTERFACE,
1188dbcf02cSchristos				signal_name="PropertiesChanged")
1198dbcf02cSchristos
1208dbcf02cSchristos	ifname = sys.argv[1]
1218dbcf02cSchristos
1228dbcf02cSchristos	# See if wpa_supplicant already knows about this interface
1238dbcf02cSchristos	path = None
1248dbcf02cSchristos	try:
1258dbcf02cSchristos		path = wpas.GetInterface(ifname)
126*3d6c0713Schristos	except dbus.DBusException as exc:
1278dbcf02cSchristos		if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
1288dbcf02cSchristos			raise exc
1298dbcf02cSchristos		try:
1308dbcf02cSchristos			path = wpas.CreateInterface({'Ifname': ifname, 'Driver': 'test'})
1318dbcf02cSchristos			time.sleep(1)
1328dbcf02cSchristos
133*3d6c0713Schristos		except dbus.DBusException as exc:
1348dbcf02cSchristos			if not str(exc).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
1358dbcf02cSchristos				raise exc
1368dbcf02cSchristos
1378dbcf02cSchristos	global if_obj
1388dbcf02cSchristos	if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
1398dbcf02cSchristos	global iface
1408dbcf02cSchristos	iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
1418dbcf02cSchristos	iface.Scan({'Type': 'active'})
1428dbcf02cSchristos
1438dbcf02cSchristos	gobject.MainLoop().run()
1448dbcf02cSchristos
1458dbcf02cSchristos	wpas.RemoveInterface(dbus.ObjectPath(path))
1468dbcf02cSchristos
1478dbcf02cSchristosif __name__ == "__main__":
1488dbcf02cSchristos	main()
1498dbcf02cSchristos
150