#!/usr/bin/python # # wpa_supplicant/hostapd control interface using Python # Copyright (c) 2013, Jouni Malinen # # 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