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