Statistics
| Branch: | Tag: | Revision:

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