1#!/usr/bin/python 2# Tests P2P_Disconnect 3# Will perform disconnect on interface_name 4######### MAY NEED TO RUN AS SUDO ############# 5 6import dbus 7import sys, os 8import time 9import gobject 10import threading 11import getopt 12from dbus.mainloop.glib import DBusGMainLoop 13 14def usage(): 15 print("Usage:") 16 print(" %s -i <interface_name> \ " \ 17 % sys.argv[0]) 18 print(" [-w <wpas_dbus_interface>]") 19 print("Options:") 20 print(" -i = interface name") 21 print(" -w = wpas dbus interface = fi.w1.wpa_supplicant1") 22 print("Example:") 23 print(" %s -i p2p-wlan0-0" % sys.argv[0]) 24 25# Required Signals 26def GroupFinished(status, etc): 27 print("Disconnected") 28 os._exit(0) 29 30class P2P_Disconnect (threading.Thread): 31 # Needed Variables 32 global bus 33 global wpas_object 34 global interface_object 35 global p2p_interface 36 global interface_name 37 global wpas 38 global wpas_dbus_interface 39 global path 40 global timeout 41 42 # Dbus Paths 43 global wpas_dbus_opath 44 global wpas_dbus_interfaces_opath 45 global wpas_dbus_interfaces_interface 46 global wpas_dbus_interfaces_p2pdevice 47 48 # Constructor 49 def __init__(self,interface_name,wpas_dbus_interface,timeout): 50 # Initializes variables and threads 51 self.interface_name = interface_name 52 self.wpas_dbus_interface = wpas_dbus_interface 53 self.timeout = timeout 54 55 # Initializes thread and daemon allows for ctrl-c kill 56 threading.Thread.__init__(self) 57 self.daemon = True 58 59 # Generating interface/object paths 60 self.wpas_dbus_opath = "/" + \ 61 self.wpas_dbus_interface.replace(".","/") 62 self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \ 63 "/Interfaces" 64 self.wpas_dbus_interfaces_interface = \ 65 self.wpas_dbus_interface + ".Interface" 66 self.wpas_dbus_interfaces_p2pdevice = \ 67 self.wpas_dbus_interfaces_interface \ 68 + ".P2PDevice" 69 70 # Getting interfaces and objects 71 DBusGMainLoop(set_as_default=True) 72 self.bus = dbus.SystemBus() 73 self.wpas_object = self.bus.get_object( 74 self.wpas_dbus_interface, 75 self.wpas_dbus_opath) 76 self.wpas = dbus.Interface(self.wpas_object, 77 self.wpas_dbus_interface) 78 79 # Try to see if supplicant knows about interface 80 # If not, throw an exception 81 try: 82 self.path = self.wpas.GetInterface( 83 self.interface_name) 84 except dbus.DBusException as exc: 85 error = 'Error:\n Interface ' + self.interface_name \ 86 + ' was not found' 87 print(error) 88 usage() 89 os._exit(0) 90 91 self.interface_object = self.bus.get_object( 92 self.wpas_dbus_interface, self.path) 93 self.p2p_interface = dbus.Interface(self.interface_object, 94 self.wpas_dbus_interfaces_p2pdevice) 95 96 # Signals 97 self.bus.add_signal_receiver(GroupFinished, 98 dbus_interface=self.wpas_dbus_interfaces_p2pdevice, 99 signal_name="GroupFinished") 100 101 # Runs p2p_disconnect 102 def run(self): 103 # Allows other threads to keep working while MainLoop runs 104 # Required for timeout implementation 105 gobject.MainLoop().get_context().iteration(True) 106 gobject.threads_init() 107 self.p2p_interface.Disconnect() 108 gobject.MainLoop().run() 109 110 111if __name__ == "__main__": 112 113 timeout = 5 114 # Defaults for optional inputs 115 wpas_dbus_interface = 'fi.w1.wpa_supplicant1' 116 117 # interface_name is required 118 interface_name = None 119 120 # Using getopts to handle options 121 try: 122 options, args = getopt.getopt(sys.argv[1:],"hi:w:") 123 124 except getopt.GetoptError: 125 usage() 126 quit() 127 128 # If there's a switch, override default option 129 for key, value in options: 130 # Help 131 if (key == "-h"): 132 usage() 133 quit() 134 # Interface Name 135 elif (key == "-i"): 136 interface_name = value 137 # Dbus interface 138 elif (key == "-w"): 139 wpas_dbus_interface = value 140 else: 141 assert False, "unhandled option" 142 143 # Interface name is required and was not given 144 if (interface_name == None): 145 print("Error:\n interface_name is required") 146 usage() 147 quit() 148 149 # Constructor 150 try: 151 p2p_disconnect_test = P2P_Disconnect(interface_name, 152 wpas_dbus_interface,timeout) 153 154 except: 155 print("Error:\n Invalid wpas_dbus_interface") 156 usage() 157 quit() 158 159 # Start P2P_Disconnect 160 p2p_disconnect_test.start() 161 162 try: 163 time.sleep(int(p2p_disconnect_test.timeout)) 164 165 except: 166 pass 167 168 print("Disconnect timed out") 169 quit() 170