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