1 import os
2 import re
3 import die
4
5
7 if qc and len(s)>=2 and s[0]==qc and s[-1]==qc:
8 return s[1:-1]
9 return s
10
11
13 _bad = re.compile('[^a-zA-Z_0-9.-]')
14
16 self.fn = fn
17 self.data = None
18 self.modified = 0
19
20
25
26
31
32
33 - def get(self, key, default = None, qc=None):
34 if self.data is None:
35 self.read()
36 o = self.data.get(key, default)
37 if qc:
38 return uq(o, qc)
39 return o
40
41
42 - def set(self, key, value, qc=None):
43 if self.data is None:
44 self.read()
45 if self.has_key(key):
46 self.data['#%s' % key] = self.data[key]
47 if qc:
48 self.data[key] = '%s%s%s' % (qc, value, qc)
49 else:
50 self.data[key] = value
51 self.modified += 1
52
53
56
57
59 if not self.modified:
60 return
61 if self.data is None:
62 return
63 self.write()
64
65
66
67
69 fd = open('%s.tmp' % self.fn, "w")
70 tmp = self.data.items()
71 tmp.sort()
72 for (k, v) in tmp:
73 if self._bad.search(k) and not k.startswith('#'):
74 die.warn("Bad key will be ignored: %s" % k)
75 else:
76 fd.writelines("%s=%s\n" % (k, v))
77 fd.flush()
78 os.fsync(fd.fileno())
79 fd.close()
80 if os.access(self.fn, os.R_OK):
81 os.rename(self.fn, '%s.bak' % self.fn)
82 os.rename('%s.tmp' % self.fn, self.fn)
83 self.modified = 0
84
85
87 self.data = { 'FILENAME': self.fn}
88 die.note("file", self.fn)
89 n = 1
90 for x in open(self.fn, "r"):
91 die.note("line", n)
92 x = x.strip()
93 if x == '':
94 n += 1
95 continue
96 try:
97 k, v = x.split('=', 1)
98 self.data[k] = v
99 except:
100 if not x.startswith('#'):
101 raise
102 n += 1
103
104
105
106 if __name__ == '__main__':
107 import sys
108 x = hdr(sys.argv[1])
109 x.set("TEST", 1, qc=1)
110 x.write()
111