Home | History | Annotate | Download | only in p2p
      1 #!/usr/bin/python
      2 # Tests P2P_Disconnect
      3 # Will perform disconnect on interface_name
      4 ######### MAY NEED TO RUN AS SUDO #############
      5 
      6 import dbus
      7 import sys, os
      8 import time
      9 import gobject
     10 import threading
     11 import getopt
     12 from dbus.mainloop.glib import DBusGMainLoop
     13 
     14 def 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
     26 def GroupFinished(status, etc):
     27 	print "Disconnected"	
     28 	os._exit(0)
     29 
     30 class 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, 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 
    111 if __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 theres 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