wpaspy: Add support for UDP connection
hostname and port can now be specified when using wpaspy.Ctrl, so we can connect to remote clients now. This can also be tested using test.py application with ./test.py <hostname> <port> Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
This commit is contained in:
parent
3e67171846
commit
a2c88a8025
2 changed files with 67 additions and 18 deletions
|
@ -7,13 +7,23 @@
|
|||
# See README for more details.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import wpaspy
|
||||
|
||||
wpas_ctrl = '/var/run/wpa_supplicant'
|
||||
|
||||
def wpas_connect():
|
||||
def wpas_connect(host=None, port=9877):
|
||||
ifaces = []
|
||||
|
||||
if host != None:
|
||||
try:
|
||||
wpas = wpaspy.Ctrl(host, port)
|
||||
return wpas
|
||||
except:
|
||||
print "Could not connect to host: ", host
|
||||
return None
|
||||
|
||||
if os.path.isdir(wpas_ctrl):
|
||||
try:
|
||||
ifaces = [os.path.join(wpas_ctrl, i) for i in os.listdir(wpas_ctrl)]
|
||||
|
@ -34,15 +44,15 @@ def wpas_connect():
|
|||
return None
|
||||
|
||||
|
||||
def main():
|
||||
def main(host=None, port=9877):
|
||||
print "Testing wpa_supplicant control interface connection"
|
||||
wpas = wpas_connect()
|
||||
wpas = wpas_connect(host, port)
|
||||
if wpas is None:
|
||||
return
|
||||
print "Connected to wpa_supplicant"
|
||||
print wpas.request('PING')
|
||||
|
||||
mon = wpas_connect()
|
||||
mon = wpas_connect(host, port)
|
||||
if mon is None:
|
||||
print "Could not open event monitor connection"
|
||||
return
|
||||
|
@ -66,4 +76,7 @@ def main():
|
|||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
if len(sys.argv) > 2:
|
||||
main(host=sys.argv[1], port=int(sys.argv[2]))
|
||||
else:
|
||||
main()
|
||||
|
|
|
@ -7,27 +7,59 @@
|
|||
# See README for more details.
|
||||
|
||||
import os
|
||||
import stat
|
||||
import socket
|
||||
import select
|
||||
|
||||
counter = 0
|
||||
|
||||
class Ctrl:
|
||||
def __init__(self, path):
|
||||
def __init__(self, path, port=9877):
|
||||
global counter
|
||||
self.started = False
|
||||
self.attached = False
|
||||
self.s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
|
||||
self.dest = path
|
||||
self.local = "/tmp/wpa_ctrl_" + str(os.getpid()) + '-' + str(counter)
|
||||
counter += 1
|
||||
self.s.bind(self.local)
|
||||
self.path = path
|
||||
self.port = port
|
||||
|
||||
try:
|
||||
self.s.connect(self.dest)
|
||||
except Exception, e:
|
||||
self.s.close()
|
||||
os.unlink(self.local)
|
||||
raise
|
||||
mode = os.stat(path).st_mode
|
||||
if stat.S_ISSOCK(mode):
|
||||
self.udp = False
|
||||
else:
|
||||
self.udp = True
|
||||
except:
|
||||
self.udp = True
|
||||
|
||||
if not self.udp:
|
||||
self.s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
|
||||
self.dest = path
|
||||
self.local = "/tmp/wpa_ctrl_" + str(os.getpid()) + '-' + str(counter)
|
||||
counter += 1
|
||||
self.s.bind(self.local)
|
||||
try:
|
||||
self.s.connect(self.dest)
|
||||
except Exception, e:
|
||||
self.s.close()
|
||||
os.unlink(self.local)
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
ai_list = socket.getaddrinfo(path, port, socket.AF_INET,
|
||||
socket.SOCK_DGRAM)
|
||||
for af, socktype, proto, cn, sockaddr in ai_list:
|
||||
self.sockaddr = sockaddr
|
||||
break
|
||||
self.s = socket.socket(af, socktype)
|
||||
self.s.settimeout(5)
|
||||
self.s.sendto("GET_COOKIE", sockaddr)
|
||||
reply, server = self.s.recvfrom(4096)
|
||||
self.cookie = reply
|
||||
self.port = port
|
||||
except:
|
||||
print "connect exception ", path, str(port)
|
||||
if self.s != None:
|
||||
self.s.close()
|
||||
raise
|
||||
self.started = True
|
||||
|
||||
def __del__(self):
|
||||
|
@ -43,11 +75,15 @@ class Ctrl:
|
|||
pass
|
||||
if self.started:
|
||||
self.s.close()
|
||||
os.unlink(self.local)
|
||||
if not self.udp:
|
||||
os.unlink(self.local)
|
||||
self.started = False
|
||||
|
||||
def request(self, cmd, timeout=10):
|
||||
self.s.send(cmd)
|
||||
if self.udp:
|
||||
self.s.sendto(self.cookie + cmd, self.sockaddr)
|
||||
else:
|
||||
self.s.send(cmd)
|
||||
[r, w, e] = select.select([self.s], [], [], timeout)
|
||||
if r:
|
||||
return self.s.recv(4096)
|
||||
|
|
Loading…
Reference in a new issue