1#!/usr/bin/python
2# Tests P2P_Disconnect
3# Will perform disconnect on interface_name
4######### MAY NEED TO RUN AS SUDO #############
5
6import dbus
7import sys, os
8import time
9import gobject
10import threading
11import getopt
12from dbus.mainloop.glib import DBusGMainLoop
13
14def usage():
15	print("Usage:")
16	print("  %s -i <interface_name> \ " \
17		% sys.argv[0])
18	print("  		[-w <wpas_dbus_interface>]")
19	print("Options:")
20	print("  -i = interface name")
21	print("  -w = wpas dbus interface = fi.w1.wpa_supplicant1")
22	print("Example:")
23	print("  %s -i p2p-wlan0-0" % sys.argv[0])
24
25# Required Signals
26def GroupFinished(status, etc):
27	print("Disconnected")
28	os._exit(0)
29
30class P2P_Disconnect (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(GroupFinished,
98			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
99			signal_name="GroupFinished")
100
101	# Runs p2p_disconnect
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.Disconnect()
108		gobject.MainLoop().run()
109
110
111if __name__ == "__main__":
112
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 theres 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_disconnect_test = P2P_Disconnect(interface_name,
152						wpas_dbus_interface,timeout)
153
154	except:
155		print("Error:\n  Invalid wpas_dbus_interface")
156		usage()
157		quit()
158
159	# Start P2P_Disconnect
160	p2p_disconnect_test.start()
161
162	try:
163		time.sleep(int(p2p_disconnect_test.timeout))
164
165	except:
166		pass
167
168	print("Disconnect timed out")
169	quit()
170