diff --git a/wpaspy/wpaspy.py b/wpaspy/wpaspy.py new file mode 100644 index 000000000..678695f19 --- /dev/null +++ b/wpaspy/wpaspy.py @@ -0,0 +1,70 @@ +#!/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) + self.s.connect(self.dest) + self.started = True + + def __del__(self): + self.close() + + def close(self): + if self.attached: + self.detach() + if self.started: + self.s.close() + os.unlink(self.local) + self.started = False + + def request(self, cmd): + self.s.send(cmd) + [r, w, e] = select.select([self.s], [], [], 10) + 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: + return None + raise Exception("ATTACH failed") + + def detach(self): + if not self.attached: + return None + res = self.request("DETACH") + if "OK" in res: + return None + raise Exception("DETACH failed") + + def pending(self): + [r, w, e] = select.select([self.s], [], [], 0) + if r: + return True + return False + + def recv(self): + res = self.s.recv(4096) + return res