5 class FactotumError(Exception):
8 class PhaseError(Exception):
11 class NeedkeyError(Exception):
15 def start(self, **args):
16 self.f = open('/mnt/factotum/rpc', 'r+', 0)
18 for k, v in args.iteritems():
19 msg += ' ' + k + '=\'' + v + '\''
22 ret = self.f.read(4096)
23 if ret[:7] != "needkey": break
25 if ret == "ok": return
26 if ret[:5] == "error": raise FactotumError(ret[6:])
27 raise FactotumError("start: unexpected " + ret)
28 def needkey(self, string):
29 subprocess.call(['/bin/auth/factotum', '-g', string])
33 ret = self.f.read(4096)
34 if ret[:7] != "needkey": break
36 if ret == "ok": return ""
37 if ret[:3] == "ok ": return ret[3:]
38 if ret[:5] == "error": raise FactotumError(ret[6:])
39 if ret[:5] == "phase": raise PhaseError(ret[6:])
40 raise FactotumError("read: unexpected " + ret)
41 def write(self, data):
43 self.f.write('write ' + data)
44 ret = self.f.read(4096)
45 if ret[:7] != "needkey": break
47 if ret == "ok": return 0
48 if ret[:3] == "toosmall ": return int(ret[4:])
49 if ret[:5] == "error": raise FactotumError(ret[6:])
50 if ret[:5] == "phase": raise PhaseError(ret[6:])
51 raise FactotumError("write: unexpected " + ret)
54 ret = self.f.read(4096)
55 if ret[:5] == "error": raise FactotumError(ret[6:])
89 if ret != "": ret = ret[1:]
93 raise FactotumError("unexpected " + ret)
96 def delkey(self, **args):
97 f = open('/mnt/factotum/ctl', 'w', 0)
99 for k, v in args.iteritems():
100 msg += ' ' + k + '=\'' + v + '\''