1252190Srpaulo#!/usr/bin/python 2252190Srpaulo# Tests p2p_find 3252190Srpaulo# Will list all devices found/lost within a time frame (timeout) 4252190Srpaulo# Then Program will exit 5252190Srpaulo######### MAY NEED TO RUN AS SUDO ############# 6252190Srpaulo 7252190Srpauloimport dbus 8252190Srpauloimport sys, os 9252190Srpauloimport time 10252190Srpauloimport gobject 11252190Srpauloimport threading 12252190Srpauloimport getopt 13252190Srpaulofrom dbus.mainloop.glib import DBusGMainLoop 14252190Srpaulo 15252190Srpaulodef usage(): 16346981Scy print("Usage:") 17346981Scy print(" %s -i <interface_name> [-t <timeout>] \ " \ 18346981Scy % sys.argv[0]) 19346981Scy print(" [-w <wpas_dbus_interface>]") 20346981Scy print("Options:") 21346981Scy print(" -i = interface name") 22346981Scy print(" -t = timeout = 0s (infinite)") 23346981Scy print(" -w = wpas dbus interface = fi.w1.wpa_supplicant1") 24346981Scy print("Example:") 25346981Scy print(" %s -i wlan0 -t 10" % sys.argv[0]) 26252190Srpaulo 27252190Srpaulo# Required Signals 28252190Srpaulodef deviceFound(devicepath): 29346981Scy print("Device found: %s" % (devicepath)) 30252190Srpaulo 31252190Srpaulodef deviceLost(devicepath): 32346981Scy print("Device lost: %s" % (devicepath)) 33252190Srpaulo 34252190Srpauloclass P2P_Find (threading.Thread): 35252190Srpaulo # Needed Variables 36252190Srpaulo global bus 37252190Srpaulo global wpas_object 38252190Srpaulo global interface_object 39252190Srpaulo global p2p_interface 40252190Srpaulo global interface_name 41252190Srpaulo global wpas 42252190Srpaulo global wpas_dbus_interface 43252190Srpaulo global timeout 44252190Srpaulo global path 45252190Srpaulo 46252190Srpaulo # Dbus Paths 47252190Srpaulo global wpas_dbus_opath 48252190Srpaulo global wpas_dbus_interfaces_opath 49252190Srpaulo global wpas_dbus_interfaces_interface 50252190Srpaulo global wpas_dbus_interfaces_p2pdevice 51252190Srpaulo 52252190Srpaulo # Constructor 53252190Srpaulo def __init__(self,interface_name,wpas_dbus_interface,timeout): 54252190Srpaulo # Initializes variables and threads 55252190Srpaulo self.timeout = int(timeout) 56252190Srpaulo self.interface_name = interface_name 57252190Srpaulo self.wpas_dbus_interface = wpas_dbus_interface 58252190Srpaulo 59252190Srpaulo # Initializes thread and daemon allows for ctrl-c kill 60252190Srpaulo threading.Thread.__init__(self) 61252190Srpaulo self.daemon = True 62252190Srpaulo 63252190Srpaulo # Generating interface/object paths 64252190Srpaulo self.wpas_dbus_opath = "/" + \ 65252190Srpaulo self.wpas_dbus_interface.replace(".","/") 66252190Srpaulo self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \ 67252190Srpaulo "/Interfaces" 68252190Srpaulo self.wpas_dbus_interfaces_interface = \ 69252190Srpaulo self.wpas_dbus_interface + ".Interface" 70252190Srpaulo self.wpas_dbus_interfaces_p2pdevice = \ 71252190Srpaulo self.wpas_dbus_interfaces_interface \ 72252190Srpaulo + ".P2PDevice" 73252190Srpaulo 74252190Srpaulo # Getting interfaces and objects 75252190Srpaulo DBusGMainLoop(set_as_default=True) 76252190Srpaulo self.bus = dbus.SystemBus() 77252190Srpaulo self.wpas_object = self.bus.get_object( 78252190Srpaulo self.wpas_dbus_interface, 79252190Srpaulo self.wpas_dbus_opath) 80252190Srpaulo self.wpas = dbus.Interface(self.wpas_object, 81252190Srpaulo self.wpas_dbus_interface) 82252190Srpaulo 83252190Srpaulo # Try to see if supplicant knows about interface 84252190Srpaulo # If not, throw an exception 85252190Srpaulo try: 86252190Srpaulo self.path = self.wpas.GetInterface( 87252190Srpaulo self.interface_name) 88346981Scy except dbus.DBusException as exc: 89252190Srpaulo error = 'Error:\n Interface ' + self.interface_name \ 90252190Srpaulo + ' was not found' 91346981Scy print(error) 92252190Srpaulo usage() 93252190Srpaulo os._exit(0) 94252190Srpaulo 95252190Srpaulo self.interface_object = self.bus.get_object( 96252190Srpaulo self.wpas_dbus_interface, self.path) 97252190Srpaulo self.p2p_interface = dbus.Interface(self.interface_object, 98252190Srpaulo self.wpas_dbus_interfaces_p2pdevice) 99252190Srpaulo 100252190Srpaulo #Adds listeners for find and lost 101252190Srpaulo self.bus.add_signal_receiver(deviceFound, 102252190Srpaulo dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 103252190Srpaulo signal_name="DeviceFound") 104252190Srpaulo self.bus.add_signal_receiver(deviceLost, 105252190Srpaulo dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 106252190Srpaulo signal_name="DeviceLost") 107252190Srpaulo 108252190Srpaulo 109252190Srpaulo # Sets up p2p_find 110252190Srpaulo P2PFindDict = dbus.Dictionary( 111252190Srpaulo {'Timeout':int(self.timeout)}) 112252190Srpaulo self.p2p_interface.Find(P2PFindDict) 113252190Srpaulo 114252190Srpaulo # Run p2p_find 115252190Srpaulo def run(self): 116252190Srpaulo # Allows other threads to keep working while MainLoop runs 117252190Srpaulo # Required for timeout implementation 118252190Srpaulo gobject.MainLoop().get_context().iteration(True) 119252190Srpaulo gobject.threads_init() 120252190Srpaulo gobject.MainLoop().run() 121252190Srpaulo 122252190Srpauloif __name__ == "__main__": 123252190Srpaulo 124252190Srpaulo # Defaults for optional inputs 125252190Srpaulo timeout = 0 126252190Srpaulo wpas_dbus_interface = 'fi.w1.wpa_supplicant1' 127252190Srpaulo 128252190Srpaulo # interface_name is required 129252190Srpaulo interface_name = None 130252190Srpaulo 131252190Srpaulo # Using getopts to handle options 132252190Srpaulo try: 133252190Srpaulo options, args = getopt.getopt(sys.argv[1:],"hi:t:w:") 134252190Srpaulo 135252190Srpaulo except getopt.GetoptError: 136252190Srpaulo usage() 137252190Srpaulo quit() 138252190Srpaulo 139252190Srpaulo # If theres a switch, override default option 140252190Srpaulo for key, value in options: 141252190Srpaulo # Help 142252190Srpaulo if (key == "-h"): 143252190Srpaulo usage() 144252190Srpaulo quit() 145252190Srpaulo # Interface Name 146252190Srpaulo elif (key == "-i"): 147252190Srpaulo interface_name = value 148252190Srpaulo # Timeout 149252190Srpaulo elif (key == "-t"): 150252190Srpaulo if ( int(value) >= 0): 151252190Srpaulo timeout = value 152252190Srpaulo else: 153346981Scy print("Error:\n Timeout cannot be negative") 154252190Srpaulo usage() 155252190Srpaulo quit() 156252190Srpaulo # Dbus interface 157252190Srpaulo elif (key == "-w"): 158252190Srpaulo wpas_dbus_interface = value 159252190Srpaulo else: 160252190Srpaulo assert False, "unhandled option" 161252190Srpaulo 162252190Srpaulo # Interface name is required and was not given 163252190Srpaulo if (interface_name == None): 164346981Scy print("Error:\n interface_name is required") 165252190Srpaulo usage() 166252190Srpaulo quit() 167252190Srpaulo 168252190Srpaulo # Constructor 169252190Srpaulo try: 170252190Srpaulo p2p_find_test = P2P_Find(interface_name, wpas_dbus_interface, timeout) 171252190Srpaulo 172252190Srpaulo except: 173346981Scy print("Error:\n Invalid wpas_dbus_interface") 174252190Srpaulo usage() 175252190Srpaulo quit() 176252190Srpaulo 177252190Srpaulo # Start P2P_Find 178252190Srpaulo p2p_find_test.start() 179252190Srpaulo 180252190Srpaulo try: 181252190Srpaulo # If timeout is 0, then run forever 182252190Srpaulo if (timeout == 0): 183252190Srpaulo while(True): 184252190Srpaulo pass 185252190Srpaulo # Else sleep for (timeout) 186252190Srpaulo else: 187252190Srpaulo time.sleep(p2p_find_test.timeout) 188252190Srpaulo 189252190Srpaulo except: 190252190Srpaulo pass 191252190Srpaulo 192252190Srpaulo quit() 193