1252190Srpaulo#!/usr/bin/python
2252190Srpaulo# Tests p2p_stop_find
3252190Srpaulo######### MAY NEED TO RUN AS SUDO #############
4252190Srpaulo
5252190Srpauloimport dbus
6252190Srpauloimport sys, os
7252190Srpauloimport time
8252190Srpauloimport gobject
9252190Srpauloimport threading
10252190Srpauloimport getopt
11252190Srpaulofrom dbus.mainloop.glib import DBusGMainLoop
12252190Srpaulo
13252190Srpaulodef usage():
14252190Srpaulo	print "Usage:"
15252190Srpaulo	print "  %s -i <interface_name> \ " \
16252190Srpaulo		% sys.argv[0]
17252190Srpaulo	print "  		[-w <wpas_dbus_interface>]"
18252190Srpaulo	print "Options:"
19252190Srpaulo	print "  -i = interface name"
20252190Srpaulo	print "  -w = wpas dbus interface = fi.w1.wpa_supplicant1"
21252190Srpaulo	print "Example:"
22252190Srpaulo	print "  %s -i wlan0" % sys.argv[0]
23252190Srpaulo
24252190Srpaulo# Required Signals
25252190Srpaulodef deviceLost(devicepath):
26252190Srpaulo	print "Device lost: %s" % (devicepath)
27252190Srpaulo
28252190Srpaulodef p2pStateChange(status):
29252190Srpaulo	print status
30252190Srpaulo	os._exit(0)
31252190Srpaulo
32252190Srpauloclass P2P_Stop_Find (threading.Thread):
33252190Srpaulo	# Needed Variables
34252190Srpaulo	global bus
35252190Srpaulo	global wpas_object
36252190Srpaulo	global interface_object
37252190Srpaulo	global p2p_interface
38252190Srpaulo	global interface_name
39252190Srpaulo	global wpas
40252190Srpaulo	global wpas_dbus_interface
41252190Srpaulo	global path
42252190Srpaulo	global timeout
43252190Srpaulo
44252190Srpaulo	# Dbus Paths
45252190Srpaulo	global wpas_dbus_opath
46252190Srpaulo	global wpas_dbus_interfaces_opath
47252190Srpaulo	global wpas_dbus_interfaces_interface
48252190Srpaulo	global wpas_dbus_interfaces_p2pdevice
49252190Srpaulo
50252190Srpaulo	# Constructor
51252190Srpaulo	def __init__(self,interface_name,wpas_dbus_interface,timeout):
52252190Srpaulo		# Initializes variables and threads
53252190Srpaulo		self.interface_name = interface_name
54252190Srpaulo		self.wpas_dbus_interface = wpas_dbus_interface
55252190Srpaulo		self.timeout = timeout
56252190Srpaulo
57252190Srpaulo		# Initializes thread and daemon allows for ctrl-c kill
58252190Srpaulo		threading.Thread.__init__(self)
59252190Srpaulo		self.daemon = True
60252190Srpaulo
61252190Srpaulo		# Generating interface/object paths
62252190Srpaulo		self.wpas_dbus_opath = "/" + \
63252190Srpaulo				self.wpas_dbus_interface.replace(".","/")
64252190Srpaulo		self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \
65252190Srpaulo				"/Interfaces"
66252190Srpaulo		self.wpas_dbus_interfaces_interface = \
67252190Srpaulo				self.wpas_dbus_interface + ".Interface"
68252190Srpaulo		self.wpas_dbus_interfaces_p2pdevice = \
69252190Srpaulo				self.wpas_dbus_interfaces_interface \
70252190Srpaulo				+ ".P2PDevice"
71252190Srpaulo
72252190Srpaulo		# Getting interfaces and objects
73252190Srpaulo		DBusGMainLoop(set_as_default=True)
74252190Srpaulo		self.bus = dbus.SystemBus()
75252190Srpaulo		self.wpas_object = self.bus.get_object(
76252190Srpaulo				self.wpas_dbus_interface,
77252190Srpaulo				self.wpas_dbus_opath)
78252190Srpaulo		self.wpas = dbus.Interface(self.wpas_object,
79252190Srpaulo				self.wpas_dbus_interface)
80252190Srpaulo
81252190Srpaulo		# Try to see if supplicant knows about interface
82252190Srpaulo		# If not, throw an exception
83252190Srpaulo		try:
84252190Srpaulo			self.path = self.wpas.GetInterface(
85252190Srpaulo					self.interface_name)
86252190Srpaulo		except dbus.DBusException, exc:
87252190Srpaulo			error = 'Error:\n  Interface ' + self.interface_name \
88252190Srpaulo				+ ' was not found'
89252190Srpaulo			print error
90252190Srpaulo			usage()
91252190Srpaulo			os._exit(0)
92252190Srpaulo
93252190Srpaulo		self.interface_object = self.bus.get_object(
94252190Srpaulo				self.wpas_dbus_interface, self.path)
95252190Srpaulo		self.p2p_interface = dbus.Interface(self.interface_object,
96252190Srpaulo				self.wpas_dbus_interfaces_p2pdevice)
97252190Srpaulo
98252190Srpaulo		# Signals
99252190Srpaulo		self.bus.add_signal_receiver(deviceLost,
100252190Srpaulo			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
101252190Srpaulo			signal_name="DeviceLost")
102252190Srpaulo		self.bus.add_signal_receiver(p2pStateChange,
103252190Srpaulo			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
104252190Srpaulo			signal_name="P2PStateChanged")
105252190Srpaulo
106252190Srpaulo	# Runs p2p_stop_find
107252190Srpaulo	def run(self):
108252190Srpaulo		# Allows other threads to keep working while MainLoop runs
109252190Srpaulo		# Required for timeout implementation
110252190Srpaulo		gobject.MainLoop().get_context().iteration(True)
111252190Srpaulo		gobject.threads_init()
112252190Srpaulo		self.p2p_interface.StopFind()
113252190Srpaulo		gobject.MainLoop().run()
114252190Srpaulo
115252190Srpaulo
116252190Srpauloif __name__ == "__main__":
117252190Srpaulo	# Needed because P2PStateChanged signal is not caught
118252190Srpaulo	timeout = 5
119252190Srpaulo	# Defaults for optional inputs
120252190Srpaulo	wpas_dbus_interface = 'fi.w1.wpa_supplicant1'
121252190Srpaulo
122252190Srpaulo	# interface_name is required
123252190Srpaulo	interface_name = None
124252190Srpaulo
125252190Srpaulo	# Using getopts to handle options
126252190Srpaulo	try:
127252190Srpaulo		options, args = getopt.getopt(sys.argv[1:],"ht:i:w:")
128252190Srpaulo
129252190Srpaulo	except getopt.GetoptError:
130252190Srpaulo		usage()
131252190Srpaulo		quit()
132252190Srpaulo
133252190Srpaulo	# If theres a switch, override default option
134252190Srpaulo	for key, value in options:
135252190Srpaulo		# Help
136252190Srpaulo		if (key == "-h"):
137252190Srpaulo			usage()
138252190Srpaulo			quit()
139252190Srpaulo		# Interface Name
140252190Srpaulo		elif (key == "-i"):
141252190Srpaulo			interface_name = value
142252190Srpaulo		# Dbus interface
143252190Srpaulo		elif (key == "-w"):
144252190Srpaulo			wpas_dbus_interface = value
145252190Srpaulo		else:
146252190Srpaulo			assert False, "unhandled option"
147252190Srpaulo
148252190Srpaulo	# Interface name is required and was not given
149252190Srpaulo	if (interface_name == None):
150252190Srpaulo		print "Error:\n  interface_name is required"
151252190Srpaulo		usage()
152252190Srpaulo		quit()
153252190Srpaulo
154252190Srpaulo	# Constructor
155252190Srpaulo	try:
156252190Srpaulo		p2p_stop_find_test = P2P_Stop_Find(interface_name,
157252190Srpaulo						wpas_dbus_interface,timeout)
158252190Srpaulo
159252190Srpaulo	except:
160252190Srpaulo		print "Error:\n  Invalid wpas_dbus_interface"
161252190Srpaulo		usage()
162252190Srpaulo		quit()
163252190Srpaulo
164252190Srpaulo	# Start P2P_Find
165252190Srpaulo	p2p_stop_find_test.start()
166252190Srpaulo
167252190Srpaulo	try:
168252190Srpaulo		time.sleep(int(p2p_stop_find_test.timeout))
169252190Srpaulo
170252190Srpaulo	except:
171252190Srpaulo		pass
172252190Srpaulo
173252190Srpaulo	print "p2p find stopped"
174252190Srpaulo	quit()
175