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