| author | Sandro Knauß <knauss@netzguerilla.net> |
| Sat, 10 Mar 2012 19:01:31 +0100 | |
| branch | devel |
| changeset 220 | 602720314930 |
| parent 188 | 4d6130d91e56 |
| child 224 | 072de50834f9 |
| permissions | -rw-r--r-- |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
1 |
from ConfigParser import ConfigParser |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
2 |
import signal |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
3 |
from functools import partial |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
4 |
|
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
5 |
from validate import vInteger |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
6 |
from error import NeededOption |
| 147 | 7 |
|
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
8 |
class MyConfigParser(ConfigParser): |
| 147 | 9 |
def __init__(self): |
10 |
ConfigParser.__init__(self) |
|
11 |
self.reloadList=[] |
|
12 |
||
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
13 |
def read(self,files): |
|
184
6b0ff82dff81
testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents:
179
diff
changeset
|
14 |
from offer import getProvider |
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
15 |
r = ConfigParser.read(self, files) |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
16 |
for s in self.sections(): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
17 |
if s == "main": |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
18 |
main.validate(self.items(s)) |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
19 |
else: |
|
184
6b0ff82dff81
testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents:
179
diff
changeset
|
20 |
getProvider("tmp", self.get(s,'typ'), self.items(s)) |
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
21 |
return r |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
22 |
|
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
23 |
def reload_(self): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
24 |
for f in self.reloadList: |
| 147 | 25 |
f() |
26 |
||
27 |
def registerReload(self, func): |
|
28 |
self.reloadList.append(func) |
|
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
29 |
|
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
30 |
class Option(): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
31 |
def __init__(self, validate, long="", help="", must=False, default=None): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
32 |
self.validate = validate |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
33 |
self.long=long |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
34 |
self.help = help |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
35 |
self.must = must |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
36 |
self.default = default |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
37 |
|
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
38 |
class Config: |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
39 |
def __init__(self, name): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
40 |
self.name = name |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
41 |
self.options={ |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
42 |
"port":Option(partial(vInteger,minv=0),long="Port under that twisted is running",must=True), |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
43 |
"dburl":Option(lambda x,y:x,long="Connection URL to database",must=True), |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
44 |
} |
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
45 |
self.order = ["dburl","port"] |
|
188
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
46 |
self._init=True |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
47 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
48 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
49 |
def _read(self, cfg, write=False): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
50 |
c = dict(cfg) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
51 |
for o in self.options: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
52 |
option = self.options[o] |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
53 |
try: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
54 |
value = option.validate(c[o],o) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
55 |
if write: |
|
188
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
56 |
self.init = False |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
57 |
setattr(self,o,value) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
58 |
except KeyError: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
59 |
if option.must: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
60 |
raise NeededOption(self.name, o) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
61 |
elif write and option.default is not None: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
62 |
setattr(self, o, option.default) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
63 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
64 |
def validate(self, cfg): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
65 |
self._read(cfg, False) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
66 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
67 |
def load(self, cfg): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
68 |
self._read(cfg, True) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
69 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
70 |
def same(self, other): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
71 |
for o in self.options: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
72 |
if getattr(self,o) != getattr(other,o): |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
73 |
return False |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
74 |
else: |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
75 |
return True |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
76 |
|
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
77 |
def sampleConf(self): |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
78 |
ret=[] |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
79 |
for o in self.order: |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
80 |
opt=self.options[o] |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
81 |
if opt.long: |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
82 |
ret.append("# "+opt.long) |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
83 |
if opt.must: |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
84 |
s= "%s = "%o |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
85 |
if opt.default is not None: |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
86 |
s += str(opt.default) |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
87 |
ret.append(s) |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
88 |
else: |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
89 |
ret.append("# %s = %s"%(o,opt.default)) |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
90 |
ret.append("") |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
91 |
|
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
92 |
return ["[%s]"%self.name,]+ret |
|
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
188
diff
changeset
|
93 |
|
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
94 |
def readConfig(): |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
95 |
configParser.read(confFiles) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
96 |
configParser.reload() |
|
188
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
97 |
if main._init: |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
98 |
main.load(configParser.items("main")) |
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
99 |
else: |
|
188
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
100 |
m = Config("main") |
|
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
101 |
m.load(configParser.items("main")) |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
102 |
if not main.same(m): |
|
188
4d6130d91e56
test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents:
187
diff
changeset
|
103 |
raise Exception("Main options can't be reloaded, please restart your Application.") |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
104 |
|
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
105 |
def registerSignal(): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
106 |
'''register readConfig to SIGUSR2''' |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
107 |
def rC(signal, frame): |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
108 |
readConfig() |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
109 |
|
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
110 |
signal.signal(signal.SIGUSR2,rC) |
|
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
111 |
|
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
112 |
configParser = MyConfigParser() |
|
179
af65fcbd59d5
start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
147
diff
changeset
|
113 |
confFiles=["iro.conf", "~/iro.conf","/etc/iro/iro.conf"] |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
114 |
|
|
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
184
diff
changeset
|
115 |
main = Config("main") |