iro/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 22 Feb 2012 03:48:10 +0100
branchdevel
changeset 179 af65fcbd59d5
parent 147 e96e50ae6352
child 184 6b0ff82dff81
permissions -rw-r--r--
start with implementing iro.config

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 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),
        }