iro/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 23 Feb 2012 16:57:57 +0100
branchdevel
changeset 183 07ee5543751b
parent 179 af65fcbd59d5
child 184 6b0ff82dff81
permissions -rw-r--r--
offer.provider now handles the options dict and loadConfig is only in Provider class

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