fix out output_shell handles bools
[sfa.git] / sfa / util / config.py
1 #!/usr/bin/python
2 import sys
3 import os
4 import time
5 import ConfigParser
6 import tempfile
7 import codecs
8 from StringIO import StringIO
9 from sfa.util.xml import XML
10
11 default_config = \
12 """
13 """
14
15 class Config:
16   
17     def __init__(self, config_file='/etc/sfa/sfa_config'):
18         self._files = []
19         self.config_path = os.path.dirname(config_file)
20         self.config = ConfigParser.ConfigParser()  
21         self.filename = config_file
22         if not os.path.isfile(self.filename):
23             self.create(self.filename)
24         self.load(self.filename)
25         
26
27     def _header(self):
28         header = """
29 DO NOT EDIT. This file was automatically generated at
30 %s from:
31
32 %s
33 """ % (time.asctime(), os.linesep.join(self._files))
34
35         # Get rid of the surrounding newlines
36         return header.strip().split(os.linesep)
37
38     def create(self, filename):
39         if not os.path.exists(os.path.dirname(filename)):
40             os.makedirs(os.path.dirname(filename))
41         configfile = open(filename, 'w')
42         configfile.write(default_config)
43         configfile.close()
44         
45
46     def load(self, filename):
47         if filename:
48             try:
49                 self.config.read(filename)
50             except ConfigParser.MissingSectionHeaderError:
51                 if filename.endswith('.xml'):
52                     self.load_xml(filename)
53                 else:
54                     self.load_shell(filename)
55             self._files.append(filename)
56             self.set_attributes()
57
58     def load_xml(self, filename):
59         xml = XML(filename)
60         categories = xml.xpath('//configuration/variables/category')
61         for category in categories:
62             section_name = category.get('id')
63             if not self.config.has_section(section_name):
64                 self.config.add_section(section_name)
65             options = category.xpath('./variablelist/variable')
66             for option in options:
67                 option_name = option.get('id')
68                 value = option.xpath('./value')[0].text
69                 if not value:
70                     value = ""
71                 self.config.set(section_name, option_name, value)
72          
73     def load_shell(self, filename):
74         f = open(filename, 'r')
75         for line in f:
76             try:
77                 if line.startswith('#'):
78                     continue
79                 parts = line.strip().split("=")
80                 if len(parts) < 2:
81                     continue
82                 option = parts[0]
83                 value = parts[1].replace('"', '').replace("'","")
84                 section, var = self.locate_varname(option, strict=False)
85                 if section and var:
86                     self.set(section, var, value)
87             except:
88                 pass
89         f.close()               
90
91     def locate_varname(self, varname, strict=True):
92         varname = varname.lower()
93         sections = self.config.sections()
94         section_name = ""
95         var_name = ""
96         for section in sections:
97             if varname.startswith(section.lower()) and len(section) > len(section_name):
98                 section_name = section.lower()
99                 var_name = varname.replace(section_name, "")[1:]
100         if strict and not self.config.has_option(section_name, var_name):
101             raise ConfigParser.NoOptionError(var_name, section_name)
102         return (section_name, var_name)             
103
104     def set_attributes(self):
105         sections = self.config.sections()
106         for section in sections:
107             for item in self.config.items(section):
108                 name = "%s_%s" % (section, item[0])
109                 value = item[1]
110                 setattr(self, name, value)
111                 setattr(self, name.upper(), value)
112         
113
114     def verify(self, config1, config2, validate_method):
115         return True
116
117     def validate_type(self, var_type, value):
118         return True
119
120     @staticmethod
121     def is_xml(config_file):
122         try:
123             x = Xml(config_file)
124             return True     
125         except:
126             return False
127
128     @staticmethod
129     def is_ini(config_file):
130         try:
131             c = ConfigParser.ConfigParser()
132             c.read(config_file)
133             return True
134         except ConfigParser.MissingSectionHeaderError:
135             return False
136
137
138     def dump(self, sections = []):
139         sys.stdout.write(output_python())
140
141     def output_python(self, encoding = "utf-8"):
142         buf = codecs.lookup(encoding)[3](StringIO())
143         buf.writelines(["# " + line + os.linesep for line in self._header()]) 
144         
145         for section in self.sections():
146             buf.write("[%s]%s" % (section, os.linesep))
147             for (name,value) in self.items(section):
148                 buf.write("%s=%s%s" % (name,value,os.linesep))
149             buf.write(os.linesep)
150         return buf.getvalue()
151                 
152     def output_shell(self, show_comments = True, encoding = "utf-8"):
153         """
154         Return variables as a shell script.
155         """
156
157         buf = codecs.lookup(encoding)[3](StringIO())
158         buf.writelines(["# " + line + os.linesep for line in self._header()])
159
160         for section in self.sections():
161             for (name,value) in self.items(section):
162                 # bash does not have the concept of NULL
163                 if value:
164                     option = "%s_%s" % (section.upper(), name.upper())
165                     if bool(value) and not value.isdigit():
166                         value = str(bool(value))  
167                     buf.write(option + "=" + value + os.linesep)
168         return buf.getvalue()        
169
170     def output_php(selfi, encoding = "utf-8"):
171         """
172         Return variables as a PHP script.
173         """
174
175         buf = codecs.lookup(encoding)[3](StringIO())
176         buf.write("<?php" + os.linesep)
177         buf.writelines(["// " + line + os.linesep for line in self._header()])
178
179         for section in self.sections():
180             for (name,value) in self.items(section):
181                 option = "%s_%s" % (section, name)
182                 buf.write(os.linesep)
183                 buf.write("// " + option + os.linesep)
184                 if value is None:
185                     value = 'NULL'
186                 buf.write("define('%s', %s);" % (option, value) + os.linesep)
187
188         buf.write("?>" + os.linesep)
189
190         return buf.getvalue()    
191
192     def output_xml(self, encoding = "utf-8"):
193         pass
194
195     def output_variables(self, encoding="utf-8"):
196         """
197         Return list of all variable names.
198         """
199
200         buf = codecs.lookup(encoding)[3](StringIO())
201         for section in self.sections():
202             for (name,value) in self.items(section):
203                 option = "%s_%s" % (section,name) 
204                 buf.write(option + os.linesep)
205
206         return buf.getvalue()
207         pass 
208         
209     def write(self, filename=None):
210         if not filename:
211             filename = self.filename
212         configfile = open(filename, 'w') 
213         self.config.write(configfile)
214     
215     def save(self, filename=None):
216         self.write(filename)
217
218
219     def get_trustedroots_dir(self):
220         return self.config_path + os.sep + 'trusted_roots'
221
222     def get_openflow_aggrMgr_info(self):
223         aggr_mgr_ip = 'localhost'
224         if (hasattr(self,'openflow_aggregate_manager_ip')):
225             aggr_mgr_ip = self.OPENFLOW_AGGREGATE_MANAGER_IP
226
227         aggr_mgr_port = 2603
228         if (hasattr(self,'openflow_aggregate_manager_port')):
229             aggr_mgr_port = self.OPENFLOW_AGGREGATE_MANAGER_PORT
230
231         return (aggr_mgr_ip,aggr_mgr_port)
232
233     def get_interface_hrn(self):
234         if (hasattr(self,'sfa_interface_hrn')):
235             return self.SFA_INTERFACE_HRN
236         else:
237             return "plc"
238
239     def __getattr__(self, attr):
240         return getattr(self.config, attr)
241
242 if __name__ == '__main__':
243     filename = None
244     if len(sys.argv) > 1:
245         filename = sys.argv[1]
246         config = Config(filename)
247     else:    
248         config = Config()
249     config.dump()
250