1252190Srpaulo#!/usr/bin/python
2252190Srpaulo# Tests p2p_invite
3252190Srpaulo######### MAY NEED TO RUN AS SUDO #############
4252190Srpaulo
5252190Srpauloimport dbus
6252190Srpauloimport sys, os
7252190Srpauloimport time
8252190Srpauloimport gobject
9252190Srpauloimport getopt
10252190Srpauloimport threading
11252190Srpaulofrom dbus.mainloop.glib import DBusGMainLoop
12252190Srpaulo
13252190Srpaulodef usage():
14252190Srpaulo	print "Usage:"
15252190Srpaulo	print "  %s -i <interface_name> -a <addr> \ " \
16252190Srpaulo		% sys.argv[0]
17252190Srpaulo	print "		[-o <persistent_group_object>] [-w <wpas_dbus_interface>]"
18252190Srpaulo	print "Options:"
19252190Srpaulo	print "  -i = interface name"
20252190Srpaulo	print "  -a = address of peer"
21252190Srpaulo	print "  -o = persistent group object path"
22252190Srpaulo	print "  -w = wpas dbus interface = fi.w1.wpa_supplicant1"
23252190Srpaulo	print "Example:"
24252190Srpaulo	print "  %s -i p2p-wlan0-0 -a 00150083523c" % sys.argv[0]
25252190Srpaulo
26252190Srpaulo# Required Signals
27252190Srpaulodef InvitationResult(invite_result):
28252190Srpaulo	print "Inviation Result signal :"
29252190Srpaulo	status = invite_result['status']
30252190Srpaulo	print "status = ", status
31252190Srpaulo	if invite_result.has_key('BSSID'):
32252190Srpaulo		bssid = invite_result['BSSID']
33252190Srpaulo		print "BSSID = ", hex(bssid[0]) , ":" , \
34252190Srpaulo		 hex(bssid[1]) , ":" , hex(bssid[2]) , ":", \
35252190Srpaulo		 hex(bssid[3]) , ":" , hex(bssid[4]) , ":" , \
36252190Srpaulo		hex(bssid[5])
37252190Srpaulo	os._exit(0)
38252190Srpaulo
39252190Srpauloclass P2P_Invite (threading.Thread):
40252190Srpaulo	# Needed Variables
41252190Srpaulo	global bus
42252190Srpaulo	global wpas_object
43252190Srpaulo	global interface_object
44252190Srpaulo	global p2p_interface
45252190Srpaulo	global interface_name
46252190Srpaulo	global wpas
47252190Srpaulo	global wpas_dbus_interface
48252190Srpaulo	global path
49252190Srpaulo	global addr
50252190Srpaulo	global persistent_group_object
51252190Srpaulo
52252190Srpaulo	# Dbus Paths
53252190Srpaulo	global wpas_dbus_opath
54252190Srpaulo	global wpas_dbus_interfaces_opath
55252190Srpaulo	global wpas_dbus_interfaces_interface
56252190Srpaulo	global wpas_dbus_interfaces_p2pdevice
57252190Srpaulo
58252190Srpaulo	# Arguements
59252190Srpaulo	global P2PDictionary
60252190Srpaulo
61252190Srpaulo	# Constructor
62252190Srpaulo	def __init__(self,interface_name,wpas_dbus_interface,addr,
63252190Srpaulo						persistent_group_object):
64252190Srpaulo		# Initializes variables and threads
65252190Srpaulo		self.interface_name = interface_name
66252190Srpaulo		self.wpas_dbus_interface = wpas_dbus_interface
67252190Srpaulo		self.addr = addr
68252190Srpaulo		self.persistent_group_object = persistent_group_object
69252190Srpaulo
70252190Srpaulo		# Initializes thread and daemon allows for ctrl-c kill
71252190Srpaulo		threading.Thread.__init__(self)
72252190Srpaulo		self.daemon = True
73252190Srpaulo
74252190Srpaulo		# Generating interface/object paths
75252190Srpaulo		self.wpas_dbus_opath = "/" + \
76252190Srpaulo				self.wpas_dbus_interface.replace(".","/")
77252190Srpaulo		self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \
78252190Srpaulo				"/Interfaces"
79252190Srpaulo		self.wpas_dbus_interfaces_interface = \
80252190Srpaulo				self.wpas_dbus_interface + ".Interface"
81252190Srpaulo		self.wpas_dbus_interfaces_p2pdevice = \
82252190Srpaulo				self.wpas_dbus_interfaces_interface \
83252190Srpaulo				+ ".P2PDevice"
84252190Srpaulo
85252190Srpaulo		# Getting interfaces and objects
86252190Srpaulo		DBusGMainLoop(set_as_default=True)
87252190Srpaulo		self.bus = dbus.SystemBus()
88252190Srpaulo		self.wpas_object = self.bus.get_object(
89252190Srpaulo				self.wpas_dbus_interface,
90252190Srpaulo				self.wpas_dbus_opath)
91252190Srpaulo		self.wpas = dbus.Interface(self.wpas_object,
92252190Srpaulo				self.wpas_dbus_interface)
93252190Srpaulo
94252190Srpaulo		# Try to see if supplicant knows about interface
95252190Srpaulo		# If not, throw an exception
96252190Srpaulo		try:
97252190Srpaulo			self.path = self.wpas.GetInterface(
98252190Srpaulo					self.interface_name)
99252190Srpaulo		except dbus.DBusException, exc:
100252190Srpaulo			error = 'Error:\n  Interface ' + self.interface_name \
101252190Srpaulo				+ ' was not found'
102252190Srpaulo			print error
103252190Srpaulo			usage()
104252190Srpaulo			os._exit(0)
105252190Srpaulo
106252190Srpaulo		self.interface_object = self.bus.get_object(
107252190Srpaulo				self.wpas_dbus_interface, self.path)
108252190Srpaulo		self.p2p_interface = dbus.Interface(self.interface_object,
109252190Srpaulo				self.wpas_dbus_interfaces_p2pdevice)
110252190Srpaulo
111252190Srpaulo		#Adds listeners
112252190Srpaulo		self.bus.add_signal_receiver(InvitationResult,
113252190Srpaulo			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
114252190Srpaulo			signal_name="InvitationResult")
115252190Srpaulo
116252190Srpaulo	# Sets up p2p_invite dictionary
117252190Srpaulo	def constructArguements(self):
118252190Srpaulo		self.P2PDictionary = \
119252190Srpaulo			{'peer':dbus.ObjectPath(self.path+'/Peers/'+self.addr)}
120252190Srpaulo		if (self.persistent_group_object != None):
121252190Srpaulo			self.P2PDictionary.update({"persistent_group_object":
122252190Srpaulo					self.persistent_group_object})
123252190Srpaulo
124252190Srpaulo	# Run p2p_invite
125252190Srpaulo	def run(self):
126252190Srpaulo		try:
127252190Srpaulo			self.p2p_interface.Invite(self.P2PDictionary)
128252190Srpaulo
129252190Srpaulo		except:
130252190Srpaulo			print "Error:\n  Invalid Arguements"
131252190Srpaulo			usage()
132252190Srpaulo			os._exit(0)
133252190Srpaulo
134252190Srpaulo		# Allows other threads to keep working while MainLoop runs
135252190Srpaulo		# Required for timeout implementation
136252190Srpaulo		gobject.MainLoop().get_context().iteration(True)
137252190Srpaulo		gobject.threads_init()
138252190Srpaulo		gobject.MainLoop().run()
139252190Srpaulo
140252190Srpauloif __name__ == "__main__":
141252190Srpaulo	# Defaults for optional inputs
142252190Srpaulo	addr = None
143252190Srpaulo	persistent_group_object = None
144252190Srpaulo	wpas_dbus_interface = 'fi.w1.wpa_supplicant1'
145252190Srpaulo
146252190Srpaulo	# interface_name is required
147252190Srpaulo	interface_name = None
148252190Srpaulo
149252190Srpaulo	# Using getopts to handle options
150252190Srpaulo	try:
151252190Srpaulo		options, args = getopt.getopt(sys.argv[1:],"hi:o:w:a:")
152252190Srpaulo
153252190Srpaulo	except getopt.GetoptError:
154252190Srpaulo		usage()
155252190Srpaulo		quit()
156252190Srpaulo
157252190Srpaulo	# If theres a switch, override default option
158252190Srpaulo	for key, value in options:
159252190Srpaulo		# Help
160252190Srpaulo		if (key == "-h"):
161252190Srpaulo			usage()
162252190Srpaulo			quit()
163252190Srpaulo		# Interface Name
164252190Srpaulo		elif (key == "-i"):
165252190Srpaulo			interface_name = value
166252190Srpaulo		elif (key == "-a"):
167252190Srpaulo			addr = value
168252190Srpaulo		# Persistent group object path
169252190Srpaulo		elif (key == "-o"):
170252190Srpaulo			persistent_group_object = value
171252190Srpaulo		# Dbus interface
172252190Srpaulo		elif (key == "-w"):
173252190Srpaulo			wpas_dbus_interface = value
174252190Srpaulo		else:
175252190Srpaulo			assert False, "unhandled option"
176252190Srpaulo
177252190Srpaulo	# Interface name is required and was not given
178252190Srpaulo	if (interface_name == None):
179252190Srpaulo		print "Error:\n  interface_name is required"
180252190Srpaulo		usage()
181252190Srpaulo		quit()
182252190Srpaulo
183252190Srpaulo	if (addr == None):
184252190Srpaulo		print "Error:\n  peer address is required"
185252190Srpaulo		usage()
186252190Srpaulo		quit()
187252190Srpaulo
188252190Srpaulo	try:
189252190Srpaulo		p2p_invite_test = \
190252190Srpaulo			P2P_Invite(interface_name,wpas_dbus_interface,
191252190Srpaulo					addr,persistent_group_object)
192252190Srpaulo	except:
193252190Srpaulo		print "Error:\n  Invalid Arguements"
194252190Srpaulo		usage()
195252190Srpaulo		os._exit(1)
196252190Srpaulo
197252190Srpaulo	p2p_invite_test.constructArguements()
198252190Srpaulo	p2p_invite_test.start()
199252190Srpaulo	time.sleep(10)
200252190Srpaulo	print "Error:\n  p2p_invite timed out"
201252190Srpaulo	os._exit(0)
202