| #!/usr/bin/python |
| # |
| # wpa_supplicant/hostapd control interface using Python |
| # Copyright (c) 2013, Jouni Malinen <j@w1.fi> |
| # |
| # This software may be distributed under the terms of the BSD license. |
| # See README for more details. |
| |
| import os |
| import socket |
| import select |
| |
| counter = 0 |
| |
| class Ctrl: |
| def __init__(self, path): |
| 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) |
| try: |
| self.s.connect(self.dest) |
| except Exception, e: |
| self.s.close() |
| os.unlink(self.local) |
| raise |
| self.started = True |
| |
| def __del__(self): |
| self.close() |
| |
| def close(self): |
| if self.attached: |
| try: |
| self.detach() |
| except Exception, e: |
| # Need to ignore this allow the socket to be closed |
| self.attached = False |
| pass |
| if self.started: |
| self.s.close() |
| os.unlink(self.local) |
| self.started = False |
| |
| def request(self, cmd, timeout=10): |
| self.s.send(cmd) |
| [r, w, e] = select.select([self.s], [], [], timeout) |
| if r: |
| return self.s.recv(4096) |
| raise Exception("Timeout on waiting response") |
| |
| def attach(self): |
| if self.attached: |
| return None |
| res = self.request("ATTACH") |
| if "OK" in res: |
| self.attached = True |
| return None |
| raise Exception("ATTACH failed") |
| |
| def detach(self): |
| if not self.attached: |
| return None |
| while self.pending(): |
| ev = self.recv() |
| res = self.request("DETACH") |
| if "FAIL" not in res: |
| self.attached = False |
| return None |
| raise Exception("DETACH failed") |
| |
| def pending(self, timeout=0): |
| [r, w, e] = select.select([self.s], [], [], timeout) |
| if r: |
| return True |
| return False |
| |
| def recv(self): |
| res = self.s.recv(4096) |
| return res |