1252190Srpaulo#!/usr/bin/python 2252190Srpaulo# Tests p2p_stop_find 3252190Srpaulo######### MAY NEED TO RUN AS SUDO ############# 4252190Srpaulo 5252190Srpauloimport dbus 6252190Srpauloimport sys, os 7252190Srpauloimport time 8252190Srpauloimport gobject 9252190Srpauloimport threading 10252190Srpauloimport getopt 11252190Srpaulofrom dbus.mainloop.glib import DBusGMainLoop 12252190Srpaulo 13252190Srpaulodef usage(): 14252190Srpaulo print "Usage:" 15252190Srpaulo print " %s -i <interface_name> \ " \ 16252190Srpaulo % sys.argv[0] 17252190Srpaulo print " [-w <wpas_dbus_interface>]" 18252190Srpaulo print "Options:" 19252190Srpaulo print " -i = interface name" 20252190Srpaulo print " -w = wpas dbus interface = fi.w1.wpa_supplicant1" 21252190Srpaulo print "Example:" 22252190Srpaulo print " %s -i wlan0" % sys.argv[0] 23252190Srpaulo 24252190Srpaulo# Required Signals 25252190Srpaulodef deviceLost(devicepath): 26252190Srpaulo print "Device lost: %s" % (devicepath) 27252190Srpaulo 28252190Srpaulodef p2pStateChange(status): 29252190Srpaulo print status 30252190Srpaulo os._exit(0) 31252190Srpaulo 32252190Srpauloclass P2P_Stop_Find (threading.Thread): 33252190Srpaulo # Needed Variables 34252190Srpaulo global bus 35252190Srpaulo global wpas_object 36252190Srpaulo global interface_object 37252190Srpaulo global p2p_interface 38252190Srpaulo global interface_name 39252190Srpaulo global wpas 40252190Srpaulo global wpas_dbus_interface 41252190Srpaulo global path 42252190Srpaulo global timeout 43252190Srpaulo 44252190Srpaulo # Dbus Paths 45252190Srpaulo global wpas_dbus_opath 46252190Srpaulo global wpas_dbus_interfaces_opath 47252190Srpaulo global wpas_dbus_interfaces_interface 48252190Srpaulo global wpas_dbus_interfaces_p2pdevice 49252190Srpaulo 50252190Srpaulo # Constructor 51252190Srpaulo def __init__(self,interface_name,wpas_dbus_interface,timeout): 52252190Srpaulo # Initializes variables and threads 53252190Srpaulo self.interface_name = interface_name 54252190Srpaulo self.wpas_dbus_interface = wpas_dbus_interface 55252190Srpaulo self.timeout = timeout 56252190Srpaulo 57252190Srpaulo # Initializes thread and daemon allows for ctrl-c kill 58252190Srpaulo threading.Thread.__init__(self) 59252190Srpaulo self.daemon = True 60252190Srpaulo 61252190Srpaulo # Generating interface/object paths 62252190Srpaulo self.wpas_dbus_opath = "/" + \ 63252190Srpaulo self.wpas_dbus_interface.replace(".","/") 64252190Srpaulo self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \ 65252190Srpaulo "/Interfaces" 66252190Srpaulo self.wpas_dbus_interfaces_interface = \ 67252190Srpaulo self.wpas_dbus_interface + ".Interface" 68252190Srpaulo self.wpas_dbus_interfaces_p2pdevice = \ 69252190Srpaulo self.wpas_dbus_interfaces_interface \ 70252190Srpaulo + ".P2PDevice" 71252190Srpaulo 72252190Srpaulo # Getting interfaces and objects 73252190Srpaulo DBusGMainLoop(set_as_default=True) 74252190Srpaulo self.bus = dbus.SystemBus() 75252190Srpaulo self.wpas_object = self.bus.get_object( 76252190Srpaulo self.wpas_dbus_interface, 77252190Srpaulo self.wpas_dbus_opath) 78252190Srpaulo self.wpas = dbus.Interface(self.wpas_object, 79252190Srpaulo self.wpas_dbus_interface) 80252190Srpaulo 81252190Srpaulo # Try to see if supplicant knows about interface 82252190Srpaulo # If not, throw an exception 83252190Srpaulo try: 84252190Srpaulo self.path = self.wpas.GetInterface( 85252190Srpaulo self.interface_name) 86252190Srpaulo except dbus.DBusException, exc: 87252190Srpaulo error = 'Error:\n Interface ' + self.interface_name \ 88252190Srpaulo + ' was not found' 89252190Srpaulo print error 90252190Srpaulo usage() 91252190Srpaulo os._exit(0) 92252190Srpaulo 93252190Srpaulo self.interface_object = self.bus.get_object( 94252190Srpaulo self.wpas_dbus_interface, self.path) 95252190Srpaulo self.p2p_interface = dbus.Interface(self.interface_object, 96252190Srpaulo self.wpas_dbus_interfaces_p2pdevice) 97252190Srpaulo 98252190Srpaulo # Signals 99252190Srpaulo self.bus.add_signal_receiver(deviceLost, 100252190Srpaulo dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 101252190Srpaulo signal_name="DeviceLost") 102252190Srpaulo self.bus.add_signal_receiver(p2pStateChange, 103252190Srpaulo dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 104252190Srpaulo signal_name="P2PStateChanged") 105252190Srpaulo 106252190Srpaulo # Runs p2p_stop_find 107252190Srpaulo def run(self): 108252190Srpaulo # Allows other threads to keep working while MainLoop runs 109252190Srpaulo # Required for timeout implementation 110252190Srpaulo gobject.MainLoop().get_context().iteration(True) 111252190Srpaulo gobject.threads_init() 112252190Srpaulo self.p2p_interface.StopFind() 113252190Srpaulo gobject.MainLoop().run() 114252190Srpaulo 115252190Srpaulo 116252190Srpauloif __name__ == "__main__": 117252190Srpaulo # Needed because P2PStateChanged signal is not caught 118252190Srpaulo timeout = 5 119252190Srpaulo # Defaults for optional inputs 120252190Srpaulo wpas_dbus_interface = 'fi.w1.wpa_supplicant1' 121252190Srpaulo 122252190Srpaulo # interface_name is required 123252190Srpaulo interface_name = None 124252190Srpaulo 125252190Srpaulo # Using getopts to handle options 126252190Srpaulo try: 127252190Srpaulo options, args = getopt.getopt(sys.argv[1:],"ht:i:w:") 128252190Srpaulo 129252190Srpaulo except getopt.GetoptError: 130252190Srpaulo usage() 131252190Srpaulo quit() 132252190Srpaulo 133252190Srpaulo # If theres a switch, override default option 134252190Srpaulo for key, value in options: 135252190Srpaulo # Help 136252190Srpaulo if (key == "-h"): 137252190Srpaulo usage() 138252190Srpaulo quit() 139252190Srpaulo # Interface Name 140252190Srpaulo elif (key == "-i"): 141252190Srpaulo interface_name = value 142252190Srpaulo # Dbus interface 143252190Srpaulo elif (key == "-w"): 144252190Srpaulo wpas_dbus_interface = value 145252190Srpaulo else: 146252190Srpaulo assert False, "unhandled option" 147252190Srpaulo 148252190Srpaulo # Interface name is required and was not given 149252190Srpaulo if (interface_name == None): 150252190Srpaulo print "Error:\n interface_name is required" 151252190Srpaulo usage() 152252190Srpaulo quit() 153252190Srpaulo 154252190Srpaulo # Constructor 155252190Srpaulo try: 156252190Srpaulo p2p_stop_find_test = P2P_Stop_Find(interface_name, 157252190Srpaulo wpas_dbus_interface,timeout) 158252190Srpaulo 159252190Srpaulo except: 160252190Srpaulo print "Error:\n Invalid wpas_dbus_interface" 161252190Srpaulo usage() 162252190Srpaulo quit() 163252190Srpaulo 164252190Srpaulo # Start P2P_Find 165252190Srpaulo p2p_stop_find_test.start() 166252190Srpaulo 167252190Srpaulo try: 168252190Srpaulo time.sleep(int(p2p_stop_find_test.timeout)) 169252190Srpaulo 170252190Srpaulo except: 171252190Srpaulo pass 172252190Srpaulo 173252190Srpaulo print "p2p find stopped" 174252190Srpaulo quit() 175