1252190Srpaulo#!/usr/bin/python 2252190Srpaulo# Tests P2P_Find 3252190Srpaulo# Will listen 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 5" % sys.argv[0]) 26252190Srpaulo 27252190Srpaulo# Required Signals 28252190Srpaulodef p2pStateChange(status): 29346981Scy print(status) 30252190Srpaulo 31252190Srpauloclass P2P_Listen(threading.Thread): 32252190Srpaulo # Needed Variables 33252190Srpaulo global bus 34252190Srpaulo global wpas_object 35252190Srpaulo global interface_object 36252190Srpaulo global p2p_interface 37252190Srpaulo global interface_name 38252190Srpaulo global wpas 39252190Srpaulo global wpas_dbus_interface 40252190Srpaulo global path 41252190Srpaulo global timeout 42252190Srpaulo 43252190Srpaulo # Dbus Paths 44252190Srpaulo global wpas_dbus_opath 45252190Srpaulo global wpas_dbus_interfaces_opath 46252190Srpaulo global wpas_dbus_interfaces_interface 47252190Srpaulo global wpas_dbus_interfaces_p2pdevice 48252190Srpaulo 49252190Srpaulo # Constructor 50252190Srpaulo def __init__(self,interface_name,wpas_dbus_interface,timeout): 51252190Srpaulo # Initializes variables and threads 52252190Srpaulo self.timeout = int(timeout) 53252190Srpaulo self.interface_name = interface_name 54252190Srpaulo self.wpas_dbus_interface = wpas_dbus_interface 55252190Srpaulo 56252190Srpaulo # Initializes thread and daemon allows for ctrl-c kill 57252190Srpaulo threading.Thread.__init__(self) 58252190Srpaulo self.daemon = True 59252190Srpaulo 60252190Srpaulo # Generating interface/object paths 61252190Srpaulo self.wpas_dbus_opath = "/" + \ 62252190Srpaulo self.wpas_dbus_interface.replace(".","/") 63252190Srpaulo self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \ 64252190Srpaulo "/Interfaces" 65252190Srpaulo self.wpas_dbus_interfaces_interface = \ 66252190Srpaulo self.wpas_dbus_interface + ".Interface" 67252190Srpaulo self.wpas_dbus_interfaces_p2pdevice = \ 68252190Srpaulo self.wpas_dbus_interfaces_interface \ 69252190Srpaulo + ".P2PDevice" 70252190Srpaulo 71252190Srpaulo # Getting interfaces and objects 72252190Srpaulo DBusGMainLoop(set_as_default=True) 73252190Srpaulo self.bus = dbus.SystemBus() 74252190Srpaulo self.wpas_object = self.bus.get_object( 75252190Srpaulo self.wpas_dbus_interface, 76252190Srpaulo self.wpas_dbus_opath) 77252190Srpaulo self.wpas = dbus.Interface(self.wpas_object, 78252190Srpaulo self.wpas_dbus_interface) 79252190Srpaulo 80252190Srpaulo # Try to see if supplicant knows about interface 81252190Srpaulo # If not, throw an exception 82252190Srpaulo try: 83252190Srpaulo self.path = self.wpas.GetInterface( 84252190Srpaulo self.interface_name) 85346981Scy except dbus.DBusException as exc: 86252190Srpaulo error = 'Error:\n Interface ' + self.interface_name \ 87252190Srpaulo + ' was not found' 88346981Scy print(error) 89252190Srpaulo usage() 90252190Srpaulo os._exit(0) 91252190Srpaulo 92252190Srpaulo self.interface_object = self.bus.get_object( 93252190Srpaulo self.wpas_dbus_interface, self.path) 94252190Srpaulo self.p2p_interface = dbus.Interface(self.interface_object, 95252190Srpaulo self.wpas_dbus_interfaces_p2pdevice) 96252190Srpaulo 97252190Srpaulo self.bus.add_signal_receiver(p2pStateChange, 98252190Srpaulo dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 99252190Srpaulo signal_name="P2PStateChanged") 100252190Srpaulo 101252190Srpaulo # Run p2p_find 102252190Srpaulo def run(self): 103252190Srpaulo # Sets up p2p_listen 104252190Srpaulo self.p2p_interface.Listen(int(self.timeout)) 105252190Srpaulo 106252190Srpaulo # Allows other threads to keep working while MainLoop runs 107252190Srpaulo # Required for timeout implementation 108252190Srpaulo gobject.MainLoop().get_context().iteration(True) 109252190Srpaulo gobject.threads_init() 110252190Srpaulo gobject.MainLoop().run() 111252190Srpaulo 112252190Srpauloif __name__ == "__main__": 113252190Srpaulo 114252190Srpaulo # Defaults for optional inputs 115252190Srpaulo timeout = 0 116252190Srpaulo wpas_dbus_interface = 'fi.w1.wpa_supplicant1' 117252190Srpaulo 118252190Srpaulo # interface_name is required 119252190Srpaulo interface_name = None 120252190Srpaulo 121252190Srpaulo # Using getopts to handle options 122252190Srpaulo try: 123252190Srpaulo options, args = getopt.getopt(sys.argv[1:],"hi:t:w:") 124252190Srpaulo 125252190Srpaulo except getopt.GetoptError: 126252190Srpaulo usage() 127252190Srpaulo quit() 128252190Srpaulo 129252190Srpaulo # If theres a switch, override default option 130252190Srpaulo for key, value in options: 131252190Srpaulo # Help 132252190Srpaulo if (key == "-h"): 133252190Srpaulo usage() 134252190Srpaulo quit() 135252190Srpaulo # Interface Name 136252190Srpaulo elif (key == "-i"): 137252190Srpaulo interface_name = value 138252190Srpaulo # Timeout 139252190Srpaulo elif (key == "-t"): 140252190Srpaulo if ( int(value) >= 0): 141252190Srpaulo timeout = value 142252190Srpaulo else: 143346981Scy print("Error:\n Timeout cannot be negative") 144252190Srpaulo usage() 145252190Srpaulo quit() 146252190Srpaulo # Dbus interface 147252190Srpaulo elif (key == "-w"): 148252190Srpaulo wpas_dbus_interface = value 149252190Srpaulo else: 150252190Srpaulo assert False, "unhandled option" 151252190Srpaulo 152252190Srpaulo # Interface name is required and was not given 153252190Srpaulo if (interface_name == None): 154346981Scy print("Error:\n interface_name is required") 155252190Srpaulo usage() 156252190Srpaulo quit() 157252190Srpaulo 158252190Srpaulo # Constructor 159252190Srpaulo try: 160252190Srpaulo p2p_listen_test = P2P_Listen(interface_name, wpas_dbus_interface, timeout) 161252190Srpaulo 162252190Srpaulo except: 163346981Scy print("Error:\n Invalid wpas_dbus_interface") 164252190Srpaulo usage() 165252190Srpaulo quit() 166252190Srpaulo 167252190Srpaulo # Start P2P_Find 168252190Srpaulo p2p_listen_test.start() 169252190Srpaulo 170252190Srpaulo try: 171252190Srpaulo # If timeout is 0, then run forever 172252190Srpaulo if (int(p2p_listen_test.timeout) == 0): 173252190Srpaulo while(True): 174252190Srpaulo pass 175252190Srpaulo # Else sleep for (timeout) 176252190Srpaulo else: 177252190Srpaulo time.sleep(int(p2p_listen_test.timeout)) 178252190Srpaulo 179252190Srpaulo except: 180252190Srpaulo pass 181252190Srpaulo 182252190Srpaulo quit() 183