8 from StringIO import StringIO
9 from util.xml import Xml
16 return v.lower() in ("true", "false")
19 return v.lower() in ("true", "1")
23 def __init__(self, config_file='/opt/planetstack/plstackapi_config'):
25 self.config_path = os.path.dirname(config_file)
26 self.config = ConfigParser.ConfigParser()
27 self.filename = config_file
28 if not os.path.isfile(self.filename):
29 self.create(self.filename)
30 self.load(self.filename)
35 DO NOT EDIT. This file was automatically generated at
39 """ % (time.asctime(), os.linesep.join(self._files))
41 # Get rid of the surrounding newlines
42 return header.strip().split(os.linesep)
44 def create(self, filename):
45 if not os.path.exists(os.path.dirname(filename)):
46 os.makedirs(os.path.dirname(filename))
47 configfile = open(filename, 'w')
48 configfile.write(default_config)
52 def load(self, filename):
55 self.config.read(filename)
56 except ConfigParser.MissingSectionHeaderError:
57 if filename.endswith('.xml'):
58 self.load_xml(filename)
60 self.load_shell(filename)
61 self._files.append(filename)
64 def load_xml(self, filename):
66 categories = xml.xpath('//configuration/variables/category')
67 for category in categories:
68 section_name = category.get('id')
69 if not self.config.has_section(section_name):
70 self.config.add_section(section_name)
71 options = category.xpath('./variablelist/variable')
72 for option in options:
73 option_name = option.get('id')
74 value = option.xpath('./value')[0].text
77 self.config.set(section_name, option_name, value)
79 def load_shell(self, filename):
80 f = open(filename, 'r')
83 if line.startswith('#'):
85 parts = line.strip().split("=")
89 value = parts[1].replace('"', '').replace("'","")
90 section, var = self.locate_varname(option, strict=False)
92 self.set(section, var, value)
97 def locate_varname(self, varname, strict=True):
98 varname = varname.lower()
99 sections = self.config.sections()
102 for section in sections:
103 if varname.startswith(section.lower()) and len(section) > len(section_name):
104 section_name = section.lower()
105 var_name = varname.replace(section_name, "")[1:]
106 if strict and not self.config.has_option(section_name, var_name):
107 raise ConfigParser.NoOptionError(var_name, section_name)
108 return (section_name, var_name)
110 def set_attributes(self):
111 sections = self.config.sections()
112 for section in sections:
113 for item in self.config.items(section):
114 name = "%s_%s" % (section, item[0])
117 value = str2bool(value)
118 elif value.isdigit():
120 setattr(self, name, value)
121 setattr(self, name.upper(), value)
124 def verify(self, config1, config2, validate_method):
127 def validate_type(self, var_type, value):
131 def is_xml(config_file):
139 def is_ini(config_file):
141 c = ConfigParser.ConfigParser()
144 except ConfigParser.MissingSectionHeaderError:
148 def dump(self, sections = []):
149 sys.stdout.write(output_python())
151 def output_python(self, encoding = "utf-8"):
152 buf = codecs.lookup(encoding)[3](StringIO())
153 buf.writelines(["# " + line + os.linesep for line in self._header()])
155 for section in self.sections():
156 buf.write("[%s]%s" % (section, os.linesep))
157 for (name,value) in self.items(section):
158 buf.write("%s=%s%s" % (name,value,os.linesep))
159 buf.write(os.linesep)
160 return buf.getvalue()
162 def output_shell(self, show_comments = True, encoding = "utf-8"):
164 Return variables as a shell script.
167 buf = codecs.lookup(encoding)[3](StringIO())
168 buf.writelines(["# " + line + os.linesep for line in self._header()])
170 for section in self.sections():
171 for (name,value) in self.items(section):
172 # bash does not have the concept of NULL
174 option = "%s_%s" % (section.upper(), name.upper())
176 value = str(str2bool(value))
177 elif not value.isdigit():
178 value = '"%s"' % value
179 buf.write(option + "=" + value + os.linesep)
180 return buf.getvalue()
182 def output_php(self, encoding = "utf-8"):
184 Return variables as a PHP script.
187 buf = codecs.lookup(encoding)[3](StringIO())
188 buf.write("<?php" + os.linesep)
189 buf.writelines(["// " + line + os.linesep for line in self._header()])
191 for section in self.sections():
192 for (name,value) in self.items(section):
193 option = "%s_%s" % (section, name)
194 buf.write(os.linesep)
195 buf.write("// " + option + os.linesep)
198 buf.write("define('%s', %s);" % (option, value) + os.linesep)
200 buf.write("?>" + os.linesep)
202 return buf.getvalue()
204 def output_xml(self, encoding = "utf-8"):
207 def output_variables(self, encoding="utf-8"):
209 Return list of all variable names.
212 buf = codecs.lookup(encoding)[3](StringIO())
213 for section in self.sections():
214 for (name,value) in self.items(section):
215 option = "%s_%s" % (section,name)
216 buf.write(option + os.linesep)
218 return buf.getvalue()
221 def write(self, filename=None):
223 filename = self.filename
224 configfile = open(filename, 'w')
225 self.config.write(configfile)
227 def save(self, filename=None):
230 def __getattr__(self, attr):
231 return getattr(self.config, attr)
233 if __name__ == '__main__':
235 if len(sys.argv) > 1:
236 filename = sys.argv[1]
237 config = Config(filename)