iro/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 11 Mar 2012 16:37:49 +0100
branchdevel
changeset 224 072de50834f9
parent 220 602720314930
child 228 944edbe51145
permissions -rw-r--r--
adding init function that only loads main options
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
     1
from ConfigParser import ConfigParser
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
     2
import signal
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
     3
from functools import partial
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
     4
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
     5
from validate import vInteger
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
     6
from error import NeededOption 
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
     8
class MyConfigParser(ConfigParser):
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
    def __init__(self):
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
        ConfigParser.__init__(self)
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
        self.reloadList=[]
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    13
    def read(self,files):
184
6b0ff82dff81 testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents: 179
diff changeset
    14
        from offer import getProvider
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    15
        r = ConfigParser.read(self, files)
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    16
        for s in self.sections():
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    17
            if s == "main":
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    18
                main.validate(self.items(s))
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    19
            else:
184
6b0ff82dff81 testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents: 179
diff changeset
    20
                getProvider("tmp", self.get(s,'typ'), self.items(s))
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    21
        return r
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    22
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    23
    def reload_(self):
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    24
        for f in self.reloadList:
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
            f()
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
    def registerReload(self, func):
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
        self.reloadList.append(func)
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    29
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    30
class Option():
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    31
    def __init__(self, validate, long="", help="", must=False, default=None):
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    32
        self.validate = validate
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    33
        self.long=long
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    34
        self.help = help
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    35
        self.must = must
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    36
        self.default = default
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    37
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    38
class Config:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    39
    def __init__(self, name):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    40
        self.name = name
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    41
        self.options={
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    42
            "port":Option(partial(vInteger,minv=0),long="Port under that twisted is running",must=True),
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    43
            "dburl":Option(lambda x,y:x,long="Connection URL to database",must=True),
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    44
        }
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    45
        self.order = ["dburl","port"]
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    46
        self._init = True
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    47
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    48
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    49
    def _read(self, cfg, write=False):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    50
        c = dict(cfg)
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    51
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    52
        for o in self.options:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    53
            option = self.options[o]
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    54
            try:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    55
                value = option.validate(c[o],o)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    56
                if write:
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    57
                    self._init = False
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    58
                    setattr(self,o,value)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    59
            except KeyError:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    60
                if option.must:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    61
                    raise NeededOption(self.name, o)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    62
                elif write and option.default is not None:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    63
                    setattr(self, o, option.default)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    64
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    65
    def validate(self, cfg):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    66
        self._read(cfg, False)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    67
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    68
    def load(self, cfg):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    69
        self._read(cfg, True)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    70
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    71
    def same(self, other):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    72
        for o in self.options:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    73
            if getattr(self,o) != getattr(other,o):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    74
                return False
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    75
        else:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    76
            return True
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    77
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    78
    def sampleConf(self):
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    79
        ret=[]
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    80
        for o in self.order:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    81
            opt=self.options[o]
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    82
            if opt.long:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    83
                ret.append("# "+opt.long)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    84
            if opt.must:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    85
                s= "%s = "%o
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    86
                if opt.default is not None:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    87
                    s += str(opt.default)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    88
                ret.append(s)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    89
            else:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    90
                ret.append("# %s = %s"%(o,opt.default))
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    91
            ret.append("")
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    92
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    93
        return ["[%s]"%self.name,]+ret
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    94
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    95
def readConfig():
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    96
    configParser.read(confFiles)
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    97
    configParser.reload_()
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
    98
    if main._init:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    99
        main.load(configParser.items("main"))
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   100
    else:
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   101
        m = Config("main")
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   102
        m.load(configParser.items("main"))
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   103
        if not main.same(m):
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   104
            raise Exception("Main options can't be reloaded, please restart your Application.")
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   105
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   106
def init():
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   107
    configParser.read(confFiles)
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   108
    main.load(configParser.items("main"))
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   109
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   110
def registerSignal():
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   111
    '''register readConfig to SIGUSR2'''
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   112
    def rC(signal, frame):
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   113
        readConfig()
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   114
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   115
    signal.signal(signal.SIGUSR2,rC)
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   116
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   117
configParser = MyConfigParser()
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   118
confFiles=["iro.conf", "~/iro.conf","/etc/iro/iro.conf"]
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   119
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   120
main = Config("main")