1189251Ssam#!/usr/bin/python
2189251Ssam
3189251Ssamimport dbus
4189251Ssamimport sys, os
5189251Ssamimport time
6189251Ssam
7189251SsamWPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant"
8189251SsamWPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant"
9189251SsamWPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant"
10189251Ssam
11189251SsamWPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface"
12189251SsamWPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces"
13189251SsamWPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID"
14189251Ssam
15189251Ssamdef byte_array_to_string(s):
16189251Ssam	import urllib
17189251Ssam	r = ""
18189251Ssam	for c in s:
19189251Ssam		if c >= 32 and c < 127:
20189251Ssam			r += "%c" % c
21189251Ssam		else:
22189251Ssam			r += urllib.quote(chr(c))
23189251Ssam	return r
24189251Ssam
25189251Ssamdef main():
26189251Ssam	if len(sys.argv) != 2:
27189251Ssam		print "Usage: wpas-test.py <interface>"
28189251Ssam		os._exit(1)
29189251Ssam
30189251Ssam	ifname = sys.argv[1]
31189251Ssam
32189251Ssam	bus = dbus.SystemBus()
33189251Ssam	wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
34189251Ssam	wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
35189251Ssam
36189251Ssam	# See if wpa_supplicant already knows about this interface
37189251Ssam	path = None
38189251Ssam	try:
39189251Ssam		path = wpas.getInterface(ifname)
40189251Ssam	except dbus.dbus_bindings.DBusException, exc:
41189251Ssam		if str(exc) != "wpa_supplicant knows nothing about this interface.":
42189251Ssam			raise exc
43189251Ssam		try:
44189251Ssam			path = wpas.addInterface(ifname, {'driver': dbus.Variant('wext')})
45189251Ssam		except dbus.dbus_bindings.DBusException, exc:
46189251Ssam			if str(exc) != "wpa_supplicant already controls this interface.":
47189251Ssam				raise exc
48189251Ssam
49189251Ssam	if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
50189251Ssam	iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
51189251Ssam	iface.scan()
52189251Ssam	# Should really wait for the "scanResults" signal instead of sleeping
53189251Ssam	time.sleep(5)
54189251Ssam	res = iface.scanResults()
55189251Ssam
56189251Ssam	print "Scanned wireless networks:"
57189251Ssam	for opath in res:
58189251Ssam		net_obj = bus.get_object(WPAS_DBUS_SERVICE, opath)
59189251Ssam		net = dbus.Interface(net_obj, WPAS_DBUS_BSSID_INTERFACE)
60189251Ssam		props = net.properties()
61189251Ssam
62189251Ssam		# Convert the byte-array for SSID and BSSID to printable strings
63189251Ssam		bssid = ""
64189251Ssam		for item in props["bssid"]:
65189251Ssam			bssid = bssid + ":%02x" % item
66189251Ssam		bssid = bssid[1:]
67189251Ssam		ssid = byte_array_to_string(props["ssid"])
68189251Ssam		wpa = "no"
69189251Ssam		if props.has_key("wpaie"):
70189251Ssam			wpa = "yes"
71189251Ssam		wpa2 = "no"
72189251Ssam		if props.has_key("rsnie"):
73189251Ssam			wpa2 = "yes"
74189251Ssam		freq = 0
75189251Ssam		if props.has_key("frequency"):
76189251Ssam			freq = props["frequency"]
77189251Ssam		caps = props["capabilities"]
78189251Ssam		qual = props["quality"]
79189251Ssam		level = props["level"]
80189251Ssam		noise = props["noise"]
81189251Ssam		maxrate = props["maxrate"] / 1000000
82189251Ssam
83189251Ssam		print "  %s  ::  ssid='%s'  wpa=%s  wpa2=%s  quality=%d%%  rate=%d  freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq)
84189251Ssam
85189251Ssam	wpas.removeInterface(dbus.ObjectPath(path))
86189251Ssam	# Should fail here with unknown interface error
87189251Ssam	iface.scan()
88189251Ssam
89189251Ssamif __name__ == "__main__":
90189251Ssam	main()
91189251Ssam
92