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