root / commissioning / servers / quotaholder_django / pvdata.py @ 9f1a1bd0
History | View | Annotate | Download (3.9 kB)
1 |
#!/usr/bin/env python
|
---|---|
2 |
|
3 |
from os.path import expanduser, exists |
4 |
from os import getenv, fsync, unlink |
5 |
from errno import ENOENT |
6 |
from shutil import move |
7 |
|
8 |
stripchars = '"\' '
|
9 |
|
10 |
_pvpath_default = getenv('PVDATA_PATH')
|
11 |
if not _pvpath_default: |
12 |
_pvpath_default = expanduser('~/.pvdata')
|
13 |
|
14 |
_pvpath = None
|
15 |
_pvdict = None
|
16 |
_pvdata_counter = 0
|
17 |
_pvdirty = 0
|
18 |
|
19 |
def _pvopen(pvpath=_pvpath_default): |
20 |
global _pvdict
|
21 |
if _pvdict is not None: |
22 |
return _pvdict
|
23 |
|
24 |
try:
|
25 |
with open(pvpath) as f: |
26 |
pvdata = f.read() |
27 |
except IOError, e: |
28 |
if e.errno != ENOENT:
|
29 |
m = "Cannot open pvdata file '%s'" % (pvpath,)
|
30 |
raise ValueError(m, e) |
31 |
|
32 |
with open(pvpath, "w") as f: |
33 |
pass
|
34 |
pvdata = ''
|
35 |
|
36 |
global _pvpath
|
37 |
_pvpath = pvpath |
38 |
|
39 |
pvdict = {} |
40 |
for line in pvdata.splitlines(): |
41 |
key, sep, val = line.partition('=')
|
42 |
if not key or key[0] == '#': |
43 |
continue
|
44 |
|
45 |
key = key.strip() |
46 |
val = val.strip() |
47 |
|
48 |
if len(key) > 1 and key[0] == "'" and key[-1] == "'": |
49 |
key = key[1:-1] |
50 |
|
51 |
if len(val) > 1 and val[0] == "'" and val[-1] == "'": |
52 |
val = val[1:-1] |
53 |
|
54 |
pvdict[key] = val |
55 |
|
56 |
_pvdict = pvdict |
57 |
return pvdict
|
58 |
|
59 |
|
60 |
def pvsave(pvpath=None, force=0): |
61 |
|
62 |
if _pvdict is None or not (force or _pvdirty): |
63 |
return
|
64 |
|
65 |
if pvpath is None: |
66 |
pvpath = _pvpath |
67 |
|
68 |
pvdata_list = [] |
69 |
append = pvdata_list.append |
70 |
|
71 |
for key, val in _pvdict.items(): |
72 |
if not key or '\n' in key or '\n' in val: |
73 |
continue
|
74 |
|
75 |
if key[0] == ' ' or key[-1] == ' ': |
76 |
key = "'%s'" % (key,)
|
77 |
|
78 |
if val[0] == ' ' or val[-1] == ' ': |
79 |
val = "'%s'" % (val,)
|
80 |
|
81 |
append("%s = %s" % (key, val))
|
82 |
|
83 |
pvdata = '\n'.join(pvdata_list) + '\n' |
84 |
|
85 |
global _pvdata_counter
|
86 |
|
87 |
while 1: |
88 |
pvpath_old = '%s.old.%d' % (pvpath, _pvdata_counter)
|
89 |
if not exists(pvpath_old): |
90 |
break
|
91 |
|
92 |
_pvdata_counter += 1
|
93 |
continue
|
94 |
|
95 |
move(pvpath, pvpath_old) |
96 |
|
97 |
try:
|
98 |
with open(pvpath, "w") as f: |
99 |
f.write(pvdata) |
100 |
f.flush() |
101 |
fsync(f.fileno()) |
102 |
except IOError, e: |
103 |
m = "Cannot open pvdata file '%s'" % (pvpath,)
|
104 |
raise ValueError(m, e) |
105 |
|
106 |
unlink(pvpath_old) |
107 |
|
108 |
|
109 |
def getpv(key): |
110 |
pvdict = _pvopen() |
111 |
return pvdict[key] if key in pvdict else '' |
112 |
|
113 |
def setpv(key, val): |
114 |
pvdict = _pvopen() |
115 |
global _pvdirty
|
116 |
_pvdirty = 1
|
117 |
pvdict[key] = val |
118 |
|
119 |
def delpv(key): |
120 |
pvdict = _pvopen() |
121 |
if key in pvdict: |
122 |
del pvdict[key]
|
123 |
|
124 |
def savepv(key, val): |
125 |
setpv(key, val) |
126 |
pvsave() |
127 |
|
128 |
def listpv(): |
129 |
pvdict = _pvopen() |
130 |
return pvdict.keys()
|
131 |
|
132 |
def showpv(): |
133 |
pvdict = _pvopen() |
134 |
return pvdict.items()
|
135 |
|
136 |
|
137 |
def main(argv): |
138 |
argc = len(argv)
|
139 |
if argc < 2: |
140 |
usage = """
|
141 |
./pvdata <command> [<args...>]
|
142 |
|
143 |
Manipulate a simplistic private value store.
|
144 |
|
145 |
Commands:
|
146 |
|
147 |
list -- lists available keys
|
148 |
values -- lists keys with values
|
149 |
get <key>... -- retrieve key values
|
150 |
set <key=value>... -- set key values
|
151 |
del <key>... -- delete keys
|
152 |
|
153 |
Environment Variable Options:
|
154 |
|
155 |
PVDATA_PATH=<filepath> -- use file at <filepath>
|
156 |
default: ~/.pvdata
|
157 |
"""
|
158 |
print(usage) |
159 |
raise SystemExit |
160 |
|
161 |
cmd = argv[1]
|
162 |
args = argv[2:]
|
163 |
|
164 |
if cmd == 'list': |
165 |
for x in listpv(): |
166 |
print(x) |
167 |
|
168 |
elif cmd == 'values': |
169 |
for k, v in showpv(): |
170 |
print("%s=%s" % (k, v))
|
171 |
|
172 |
elif cmd == 'get': |
173 |
for k in args: |
174 |
print(getpv[k]) |
175 |
|
176 |
elif cmd == 'set': |
177 |
for kv in args: |
178 |
k, sep, v = kv.partition('=')
|
179 |
if not k or not v: |
180 |
continue
|
181 |
setpv(k, v) |
182 |
pvsave() |
183 |
|
184 |
elif cmd == 'del': |
185 |
for k in args: |
186 |
delpv(k) |
187 |
pvsave() |
188 |
|
189 |
|
190 |
if __name__ == '__main__': |
191 |
from sys import argv |
192 |
main(argv) |
193 |
|