diff options
author | aiju <aiju@phicode.de> | 2011-05-09 18:03:42 +0000 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2011-05-09 18:03:42 +0000 |
commit | ea0fe9a39bc3c217ef7c41b184d22f70ea7dabf6 (patch) | |
tree | b70e1fd8e1788177b07ec5678318e61145eaa52e /sys/lib/python/factotum.py | |
parent | 16892e5e6c85e2562c5ac6e497efa45d7c4bfff1 (diff) |
added factotum support for python and hg
Diffstat (limited to 'sys/lib/python/factotum.py')
-rw-r--r-- | sys/lib/python/factotum.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/sys/lib/python/factotum.py b/sys/lib/python/factotum.py new file mode 100644 index 000000000..4971459c0 --- /dev/null +++ b/sys/lib/python/factotum.py @@ -0,0 +1,57 @@ +'''factotum for py''' + +import subprocess + +class FactotumError(Exception): + pass + +class PhaseError(Exception): + pass + +class NeedkeyError(Exception): + pass + +class Factotum: + def start(self, **args): + self.f = open('/mnt/factotum/rpc', 'r+', 0) + msg = 'start' + for k, v in args.iteritems(): + msg += ' ' + k + '=\'' + v + '\'' + self.f.write(msg) + ret = self.f.read(4096) + if ret == "ok": return + if ret[:5] == "error": raise FactotumError(ret[6:]) + raise FactotumError("unexpected " + ret) + def needkey(self, string): + subprocess.call(['/bin/auth/factotum', '-g', string]) + def read(self): + while True: + self.f.write('read') + ret = self.f.read(4096) + if ret[:7] != "needkey": break + self.needkey(ret[8:]) + if ret == "ok": return "" + if ret[:3] == "ok ": return ret[3:] + if ret[:5] == "error": raise FactotumError(ret[6:]) + if ret[:5] == "phase": raise PhaseError(ret[6:]) + raise FactotumError("unexpected " + ret) + def write(self, data): + while True: + self.f.write('write ' + data) + ret = self.f.read(4096) + if ret[:7] != "needkey": break + self.needkey(ret[8:]) + if ret == "ok": return 0 + if ret[:3] == "toosmall ": return int(ret[4:]) + if ret[:5] == "error": raise FactotumError(ret[6:]) + if ret[:5] == "phase": raise PhaseError(ret[6:]) + raise FactotumError("unexpected " + ret) + def close(self): + self.f.close() + def delkey(self, **args): + f = open('/mnt/factotum/ctl', 'w', 0) + msg = 'delkey' + for k, v in args.iteritems(): + msg += ' ' + k + '=\'' + v + '\'' + f.write(msg) + f.close() |