summaryrefslogtreecommitdiff
path: root/sys/lib/python/factotum.py
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-05-09 18:03:42 +0000
committeraiju <aiju@phicode.de>2011-05-09 18:03:42 +0000
commitea0fe9a39bc3c217ef7c41b184d22f70ea7dabf6 (patch)
treeb70e1fd8e1788177b07ec5678318e61145eaa52e /sys/lib/python/factotum.py
parent16892e5e6c85e2562c5ac6e497efa45d7c4bfff1 (diff)
added factotum support for python and hg
Diffstat (limited to 'sys/lib/python/factotum.py')
-rw-r--r--sys/lib/python/factotum.py57
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()