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:
Janusz Dziedzic 2016-03-04 10:20:32 +01:00 committed by Jouni Malinen
parent 3e67171846
commit a2c88a8025
2 changed files with 67 additions and 18 deletions

View file

@ -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()

View file

@ -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)