comparison TEisotools-1.1.a/commons/core/checker/ConfigChecker.py @ 13:feef9a0db09d draft

Uploaded
author urgi-team
date Wed, 20 Jul 2016 09:04:42 -0400
parents
children
comparison
equal deleted inserted replaced
12:22b0494ec883 13:feef9a0db09d
1 # Copyright INRA (Institut National de la Recherche Agronomique)
2 # http://www.inra.fr
3 # http://urgi.versailles.inra.fr
4 #
5 # This software is governed by the CeCILL license under French law and
6 # abiding by the rules of distribution of free software. You can use,
7 # modify and/ or redistribute the software under the terms of the CeCILL
8 # license as circulated by CEA, CNRS and INRIA at the following URL
9 # "http://www.cecill.info".
10 #
11 # As a counterpart to the access to the source code and rights to copy,
12 # modify and redistribute granted by the license, users are provided only
13 # with a limited warranty and the software's author, the holder of the
14 # economic rights, and the successive licensors have only limited
15 # liability.
16 #
17 # In this respect, the user's attention is drawn to the risks associated
18 # with loading, using, modifying and/or developing or reproducing the
19 # software by the user in light of its specific status of free software,
20 # that may mean that it is complicated to manipulate, and that also
21 # therefore means that it is reserved for developers and experienced
22 # professionals having in-depth computer knowledge. Users are therefore
23 # encouraged to load and test the software's suitability as regards their
24 # requirements in conditions enabling the security of their systems and/or
25 # data to be ensured and, more generally, to use and operate it in the
26 # same conditions as regards security.
27 #
28 # The fact that you are presently reading this means that you have had
29 # knowledge of the CeCILL license and that you accept its terms.
30
31
32 import re
33 import sys
34 from commons.core.utils.RepetConfigParser import RepetConfigParser
35 from commons.core.checker.ConfigValue import ConfigValue
36 from commons.core.checker.IChecker import IChecker
37 from commons.core.checker.RepetException import RepetException
38 from commons.core.utils.FileUtils import FileUtils
39
40 #TODO: add more tests!
41
42 class Rule(object):
43
44 def __init__(self, mandatory= False, isPattern=False, type="", set=(), help =""):
45 self.mandatory = mandatory
46 self.isPattern = isPattern
47 self.type = type
48 self.set = set
49 self.help = help
50
51 class ConfigRules(object):
52
53 def __init__(self, configName = "", configDescription = ""):
54 self.configName = configName
55 self.configDescription = configDescription
56 self.dRules4Sections={}
57
58 def _addRule(self, section, option="DEFAULT", mandatory=False, isPattern=False, type="", set=(), help =""):
59 if not self.dRules4Sections.has_key(section):
60 self.dRules4Sections[section] = {}
61 self.dRules4Sections[section][option]=Rule(mandatory, isPattern, type.lower(), set)
62
63 def addRuleSection(self, section, mandatory=False, isPattern=False, help = ""):
64 self._addRule(section = section, option = "DEFAULT", mandatory = mandatory, isPattern = isPattern, help = "")
65
66 def addRuleOption(self, section, option, mandatory=False, isPattern=False, type="", set=(), help = ""):
67 self._addRule(section = section, option = option, mandatory = mandatory, isPattern = isPattern, type = type, set=set , help = "")
68
69 def isSectionMandatory(self, section):
70 if self.dRules4Sections.has_key(section):
71 if self.dRules4Sections[section].has_key("DEFAULT"):
72 return self.dRules4Sections[section]["DEFAULT"].mandatory
73 return False
74
75 def isOptionMandatory(self, section, option):
76 if self.dRules4Sections.has_key(section):
77 if self.dRules4Sections[section].has_key(option):
78 return self.dRules4Sections[section][option].mandatory
79 return False
80
81 def getRule(self, section, option):
82 if self.dRules4Sections.has_key(section):
83 if self.dRules4Sections[section].has_key(option):
84 return self.dRules4Sections[section][option]
85 return None
86
87 class ConfigChecker(IChecker):
88
89 def __init__ (self, cfgFileName, iCfgRules):
90 self._configFileName = cfgFileName
91 self._iConfigRules = iCfgRules
92 self._iRawConfig = ConfigValue()
93 self._iExtendedConfigRules = ConfigRules()
94
95 def readConfigFile(self):
96 iConfig = RepetConfigParser()
97 try:
98 iConfig.readfp(open(self._configFileName))
99 return iConfig
100 # TODO USE OF CONFIG ERROR
101 # if DuplicateSectionError:
102 # raise Exception ("Duplicate section exist in config file %s" %(self._configFileName ))
103 except :
104 raise RepetException ("Unexpected error: %s" % sys.exc_info()[0])
105
106 def setRawConfig(self, iConfig ):
107 for sectionName in iConfig.sections():
108 for optionName in iConfig.options(sectionName):
109 optionValue = iConfig.get(sectionName, optionName)
110 self._iRawConfig.set(sectionName, optionName, optionValue)
111
112 def getOptionValueAccordingRule(self, iConfig, sectionName, optionName):
113 optionRule = self._iExtendedConfigRules.getRule(sectionName, optionName)
114 if optionRule == None :
115 return iConfig.get(sectionName, optionName)
116
117 if optionRule.type == "int":
118 optionValue = iConfig.getint(sectionName, optionName)
119 elif optionRule.type == "float":
120 optionValue = iConfig.getfloat(sectionName, optionName)
121 elif optionRule.type == "bool" or optionRule.type == "boolean":
122 optionValue = iConfig.getboolean(sectionName, optionName)
123 else:
124 optionValue = iConfig.get(sectionName, optionName)
125 if optionRule.set!=() and not(optionValue in optionRule.set):
126 raise RepetException ("value must be in '%s'" % str(optionRule.set))
127
128 return optionValue
129
130 def setConfig(self, iConfig ):
131 config = ConfigValue()
132 valueErr = ""
133 for sectionName in iConfig.sections():
134 for optionName in iConfig.options(sectionName):
135 try:
136 optionValue = self.getOptionValueAccordingRule(iConfig, sectionName, optionName )
137 config.set(sectionName, optionName, optionValue)
138 except RepetException, re :
139 valueErr += "\n\t- %s" % re.getMessage()
140 if valueErr == "":
141 self._iRawConfig = config
142 else:
143 raise RepetException ("Following errors occurred: %s\n" % valueErr)
144
145 def checkIfExistsConfigFile (self):
146 if not (FileUtils.isRessourceExists(self._configFileName)):
147 raise RepetException("CONFIG FILE not found - '%s'" % self._configFileName)
148
149 def checkMandatorySections (self):
150 missingSection = ""
151 for sectionName in self._iExtendedConfigRules.dRules4Sections.keys():
152 if self._iExtendedConfigRules.isSectionMandatory(sectionName) and not self._iRawConfig.has_section(sectionName):
153 missingSection += "\n - %s" %(sectionName)
154 if missingSection != "":
155 raise RepetException ("Error in configuration file %s, following sections are missing:%s\n" % (self._configFileName, missingSection))
156
157 def checkMandatoryOptions (self):
158 missingOption = ""
159 for sectionName in self._iExtendedConfigRules.dRules4Sections.keys():
160 if self._iExtendedConfigRules.isSectionMandatory(sectionName) or self._iRawConfig.has_section(sectionName) :
161 dRules4OptionsOfThisSection = self._iExtendedConfigRules.dRules4Sections[sectionName]
162 for optionName in dRules4OptionsOfThisSection.keys():
163 if optionName != "DEFAULT" and self._iExtendedConfigRules.isOptionMandatory(sectionName, optionName) and not self._iRawConfig.has_option(sectionName, optionName):
164 missingOption += "\n - [%s]: %s" % (sectionName, optionName)
165 if missingOption != "":
166 raise RepetException ("Error in configuration file %s, following options are missing: %s\n" % (self._configFileName, missingOption))
167
168 def getSectionNamesAccordingPatternRules (self, sectionWordOrPattern, isPattern):
169 lSectionsFoundAccordingPatternRules=[]
170 if isPattern == False:
171 if self._iRawConfig.has_section(sectionWordOrPattern):
172 lSectionsFoundAccordingPatternRules.append(sectionWordOrPattern)
173 else:
174 for sectionName in self._iRawConfig.sections():
175 if re.search(sectionWordOrPattern, sectionName, re.IGNORECASE):
176 lSectionsFoundAccordingPatternRules.append(sectionName)
177 return lSectionsFoundAccordingPatternRules
178
179 def getOptionsNamesAccordingPatternRules(self, sectionName, optionWordOrPattern, isPattern):
180 lOptionsFoundAccordingPatternRules=[]
181 if isPattern == False:
182 if self._iRawConfig.has_option(sectionName, optionWordOrPattern):
183 lOptionsFoundAccordingPatternRules.append(optionWordOrPattern)
184 else :
185 for optionName in self._iRawConfig.options(sectionName):
186 if re.search(optionWordOrPattern, optionName, re.IGNORECASE)!= None:
187 lOptionsFoundAccordingPatternRules.append(optionName)
188 return lOptionsFoundAccordingPatternRules
189
190 def extendConfigRulesWithPatternRules(self):
191 for sectionName in self._iConfigRules.dRules4Sections.keys():
192 dRules4OptionsOfThisSection = self._iConfigRules.dRules4Sections[sectionName]
193 lRawSections=[]
194 if dRules4OptionsOfThisSection.has_key("DEFAULT"):
195 mandatorySection = dRules4OptionsOfThisSection["DEFAULT"].mandatory
196 isPatternSection = dRules4OptionsOfThisSection["DEFAULT"].isPattern
197 lRawSections=self.getSectionNamesAccordingPatternRules(sectionName, isPatternSection)
198 for rawSectionName in lRawSections:
199 self._iExtendedConfigRules.addRuleSection(rawSectionName, "DEFAULT", mandatorySection )
200 if mandatorySection and (len(lRawSections)==0):
201 self._iExtendedConfigRules.addRuleSection(sectionName, "DEFAULT", mandatorySection )
202 else:
203 lRawSections.append(sectionName)
204 for optionName in dRules4OptionsOfThisSection.keys():
205 setOption = dRules4OptionsOfThisSection[optionName].set
206 isPatternOption = dRules4OptionsOfThisSection[optionName].isPattern
207 mandatoryOption = dRules4OptionsOfThisSection[optionName].mandatory
208 typeOption = dRules4OptionsOfThisSection[optionName].type
209 if optionName != "DEFAULT":
210 for rawSectionName in lRawSections:
211 lRawOptions=self.getOptionsNamesAccordingPatternRules(rawSectionName, optionName, isPatternOption)
212 for rawOptionName in lRawOptions:
213 self._iExtendedConfigRules.addRuleOption(rawSectionName, rawOptionName, mandatoryOption, False, typeOption, setOption)
214 if mandatoryOption and (len(lRawOptions)==0):
215 self._iExtendedConfigRules.addRuleOption(rawSectionName, optionName, mandatoryOption, False, typeOption, setOption)
216
217 def getConfig(self):
218 self.checkIfExistsConfigFile()
219 iConfig = self.readConfigFile()
220 self.setRawConfig(iConfig)
221 self.extendConfigRulesWithPatternRules()
222 self.checkMandatorySections()
223 self.checkMandatoryOptions()
224 self.setConfig(iConfig)
225 return self._iRawConfig