]>
Commit | Line | Data |
---|---|---|
2ce70336 MN |
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) | |
bab493b9 | 84 | except dbus.DBusException as exc: |
2ce70336 MN |
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() |