iro/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 23 Feb 2012 16:58:58 +0100
branchdevel
changeset 184 6b0ff82dff81
parent 179 af65fcbd59d5
child 186 b381eaa774ab
permissions -rw-r--r--
testing Must argument and Provider section

from ConfigParser import ConfigParser, NoOptionError
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 getProvider
        ConfigParser.read(self, files)
        for s in self.sections():
            if s == "main":
                opts=main
                for o in opts:
                    try:
                        opts[o].validate(self.get(s,o),o)
                    except (ValidateException, NoOptionError):
                        if opts[o].must:
                            raise
            else:
                getProvider("tmp", self.get(s,'typ'), self.items(s))
           

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