iro/config.py
branchdevel
changeset 179 af65fcbd59d5
parent 147 e96e50ae6352
child 184 6b0ff82dff81
--- 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),
+        }