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