xref: /freebsd/contrib/wpa/wpa_supplicant/examples/p2p/p2p_stop_find.py (revision e32fecd0c2c3ee37c47ee100f169e7eb0282a873)
1#!/usr/bin/python
2# Tests p2p_stop_find
3######### MAY NEED TO RUN AS SUDO #############
4
5import dbus
6import sys, os
7import time
8import gobject
9import threading
10import getopt
11from dbus.mainloop.glib import DBusGMainLoop
12
13def usage():
14	print("Usage:")
15	print("  %s -i <interface_name> \ " \
16		% sys.argv[0])
17	print("  		[-w <wpas_dbus_interface>]")
18	print("Options:")
19	print("  -i = interface name")
20	print("  -w = wpas dbus interface = fi.w1.wpa_supplicant1")
21	print("Example:")
22	print("  %s -i wlan0" % sys.argv[0])
23
24# Required Signals
25def deviceLost(devicepath):
26	print("Device lost: %s" % (devicepath))
27
28def p2pStateChange(status):
29	print(status)
30	os._exit(0)
31
32class P2P_Stop_Find (threading.Thread):
33	# Needed Variables
34	global bus
35	global wpas_object
36	global interface_object
37	global p2p_interface
38	global interface_name
39	global wpas
40	global wpas_dbus_interface
41	global path
42	global timeout
43
44	# Dbus Paths
45	global wpas_dbus_opath
46	global wpas_dbus_interfaces_opath
47	global wpas_dbus_interfaces_interface
48	global wpas_dbus_interfaces_p2pdevice
49
50	# Constructor
51	def __init__(self,interface_name,wpas_dbus_interface,timeout):
52		# Initializes variables and threads
53		self.interface_name = interface_name
54		self.wpas_dbus_interface = wpas_dbus_interface
55		self.timeout = timeout
56
57		# Initializes thread and daemon allows for ctrl-c kill
58		threading.Thread.__init__(self)
59		self.daemon = True
60
61		# Generating interface/object paths
62		self.wpas_dbus_opath = "/" + \
63				self.wpas_dbus_interface.replace(".","/")
64		self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \
65				"/Interfaces"
66		self.wpas_dbus_interfaces_interface = \
67				self.wpas_dbus_interface + ".Interface"
68		self.wpas_dbus_interfaces_p2pdevice = \
69				self.wpas_dbus_interfaces_interface \
70				+ ".P2PDevice"
71
72		# Getting interfaces and objects
73		DBusGMainLoop(set_as_default=True)
74		self.bus = dbus.SystemBus()
75		self.wpas_object = self.bus.get_object(
76				self.wpas_dbus_interface,
77				self.wpas_dbus_opath)
78		self.wpas = dbus.Interface(self.wpas_object,
79				self.wpas_dbus_interface)
80
81		# Try to see if supplicant knows about interface
82		# If not, throw an exception
83		try:
84			self.path = self.wpas.GetInterface(
85					self.interface_name)
86		except dbus.DBusException as exc:
87			error = 'Error:\n  Interface ' + self.interface_name \
88				+ ' was not found'
89			print(error)
90			usage()
91			os._exit(0)
92
93		self.interface_object = self.bus.get_object(
94				self.wpas_dbus_interface, self.path)
95		self.p2p_interface = dbus.Interface(self.interface_object,
96				self.wpas_dbus_interfaces_p2pdevice)
97
98		# Signals
99		self.bus.add_signal_receiver(deviceLost,
100			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
101			signal_name="DeviceLost")
102		self.bus.add_signal_receiver(p2pStateChange,
103			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
104			signal_name="P2PStateChanged")
105
106	# Runs p2p_stop_find
107	def run(self):
108		# Allows other threads to keep working while MainLoop runs
109		# Required for timeout implementation
110		gobject.MainLoop().get_context().iteration(True)
111		gobject.threads_init()
112		self.p2p_interface.StopFind()
113		gobject.MainLoop().run()
114
115
116if __name__ == "__main__":
117	# Needed because P2PStateChanged signal is not caught
118	timeout = 5
119	# Defaults for optional inputs
120	wpas_dbus_interface = 'fi.w1.wpa_supplicant1'
121
122	# interface_name is required
123	interface_name = None
124
125	# Using getopts to handle options
126	try:
127		options, args = getopt.getopt(sys.argv[1:],"ht:i:w:")
128
129	except getopt.GetoptError:
130		usage()
131		quit()
132
133	# If there's a switch, override default option
134	for key, value in options:
135		# Help
136		if (key == "-h"):
137			usage()
138			quit()
139		# Interface Name
140		elif (key == "-i"):
141			interface_name = value
142		# Dbus interface
143		elif (key == "-w"):
144			wpas_dbus_interface = value
145		else:
146			assert False, "unhandled option"
147
148	# Interface name is required and was not given
149	if (interface_name == None):
150		print("Error:\n  interface_name is required")
151		usage()
152		quit()
153
154	# Constructor
155	try:
156		p2p_stop_find_test = P2P_Stop_Find(interface_name,
157						wpas_dbus_interface,timeout)
158
159	except:
160		print("Error:\n  Invalid wpas_dbus_interface")
161		usage()
162		quit()
163
164	# Start P2P_Find
165	p2p_stop_find_test.start()
166
167	try:
168		time.sleep(int(p2p_stop_find_test.timeout))
169
170	except:
171		pass
172
173	print("p2p find stopped")
174	quit()
175