--- a/iro/config.py Wed Feb 22 03:47:25 2012 +0100
+++ b/iro/config.py Wed Feb 22 03:48:10 2012 +0100
@@ -1,15 +1,59 @@
from ConfigParser import ConfigParser
+import signal
+from functools import partial
+
+from validate import vInteger
+from error import ValidateException
class Config(ConfigParser):
def __init__(self):
ConfigParser.__init__(self)
self.reloadList=[]
- def reload(self):
- for f in self.reloadlist:
+ def read(self,files):
+ from offer import providers
+ ConfigParser.read(self, files)
+ for s in self.sections():
+ if s == "main":
+ opts=main
+ else:
+ opts=providers[self.get(s,'typ')].options
+
+ for o in opts:
+ try:
+ opts[o].validate(self.get(s,o),o)
+ except ValidateException:
+ if opts[o].must:
+ raise
+
+ def reload_(self):
+ for f in self.reloadList:
f()
def registerReload(self, func):
self.reloadList.append(func)
-
+
+class Option():
+ def __init__(self, validate, long="", help="", must=False, default=None):
+ self.validate = validate
+ self.long=long
+ self.help = help
+ self.must = must
+ self.default = default
+
+def readConfig():
+ config.read(confFiles)
+ config.reload()
+
+def registerSignal():
+ '''register readConfig to SIGUSR2'''
+ def rC(signal, frame):
+ readConfig()
+
+ signal.signal(signal.SIGUSR2,rC)
+
config=Config()
+confFiles=["iro.conf", "~/iro.conf","/etc/iro/iro.conf"]
+main={"hostname":Option(lambda x,y:x,long="Hostname under that twisted is running",must=True),
+ "port":Option(partial(vInteger,minv=0),long="Port under that twisted is running",must=True),
+ }