Revision 665f2326

/dev/null
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

  
/dev/null
1

  
2
def pyconf(filename, keys=None):
3
    execfile(filename)
4
    opts = {}
5
    variables = locals()
6
    if keys is None:
7
        keys = variables.keys()
8

  
9
    keyset = set(k for k in keys if (k and k[0] != '_' and k.isupper()))
10
    for k in keyset:
11
        if k in variables:
12
            opts[k] = variables[k]
13

  
14
    return opts
15

  
16
def pyconf_vars(filename, variables):
17
    variables.update(pyconf(filename, variables.keys()))
18

  

Also available in: Unified diff