]> git.lizzy.rs Git - plan9front.git/blob - sys/lib/python/factotum.py
merge
[plan9front.git] / sys / lib / python / factotum.py
1 '''factotum for py'''
2
3 import subprocess
4
5 class FactotumError(Exception):
6         pass
7
8 class PhaseError(Exception):
9         pass
10
11 class NeedkeyError(Exception):
12         pass
13
14 class Factotum:
15         def start(self, **args):
16                 self.f = open('/mnt/factotum/rpc', 'r+', 0)
17                 msg = 'start'
18                 for k, v in args.iteritems():
19                         msg += ' ' + k + '=\'' + v + '\''
20                 while True:
21                         self.f.write(msg)
22                         ret = self.f.read(4096)
23                         if ret[:7] != "needkey": break
24                         self.needkey(ret[8:])
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])
30         def read(self):
31                 while True:
32                         self.f.write('read')
33                         ret = self.f.read(4096)
34                         if ret[:7] != "needkey": break
35                         self.needkey(ret[8:])
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):
42                 while True:
43                         self.f.write('write ' + data)
44                         ret = self.f.read(4096)
45                         if ret[:7] != "needkey": break
46                         self.needkey(ret[8:])
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)
52         def attr(self):
53                 self.f.write('attr')
54                 ret = self.f.read(4096)
55                 if ret[:5] == "error": raise FactotumError(ret[6:])
56                 if ret[:3] == "ok ":
57                         dict = {}
58                         ret = ret[3:]
59                         mode = 0
60                         key = ""
61                         value = ""
62                         while ret != "":
63                                 if mode == 0:
64                                         if ret[0] == '=':
65                                                 if ret[1] == '\'':
66                                                         mode = 2
67                                                         ret = ret[1:]
68                                                 else:
69                                                         mode = 1
70                                         else:
71                                                 key += ret[0]
72                                 elif mode == 1:
73                                         if ret[0] == ' ':
74                                                 dict[key] = value
75                                                 key = ""
76                                                 value = ""
77                                                 mode = 0
78                                         else:
79                                                 value += ret[0]
80                                 elif mode == 2:
81                                         if ret[0] == '\'':
82                                                 ret = ret[1:]
83                                                 dict[key] = value
84                                                 key = ""
85                                                 value = ""
86                                                 mode = 0
87                                         else:
88                                                 value += ret[0]
89                                 if ret != "": ret = ret[1:]
90                         if key != "":
91                                 dict[key] = value
92                         return dict
93                 raise FactotumError("unexpected " + ret)
94         def close(self):
95                 self.f.close()
96         def delkey(self, **args):
97                 f = open('/mnt/factotum/ctl', 'w', 0)
98                 msg = 'delkey'
99                 for k, v in args.iteritems():
100                         msg += ' ' + k + '=\'' + v + '\''
101                 f.write(msg)
102                 f.close()