@@ -93,12 +93,13 @@ def checkCAsettings(args):
93
93
94
94
def getSettings (argv ):
95
95
settings = {}
96
- defaults = ConfigManager ().defaults
97
96
args , msg = parse_cmd_args (argv )
97
+ customFile = vars (args ).get ('configFile' , None )
98
+ defaults = ConfigManager (customFile ).defaults
98
99
if args and defaults :
99
100
settings = merge_defaults_and_args (defaults , args )
100
101
elif args :
101
- settings = args
102
+ settings = vars ( args )
102
103
else :
103
104
return None , msg
104
105
# check application port
@@ -143,41 +144,25 @@ def merge_defaults_and_args(defaults, args):
143
144
class ConfigManager (object , metaclass = Singleton ):
144
145
''' A singleton class managing the application configuration defaults '''
145
146
146
- def __init__ (self ):
147
- self .__sectOptions = {}
147
+ def __init__ (self , custom_config_file = None ):
148
148
self .__defaults = {}
149
- self .configFiles = ['config.ini' ]
150
-
151
- @property
152
- def options (self ):
153
- if not self .__sectOptions :
154
- self .__sectOptions = self .reload ()
155
- return self .__sectOptions
149
+ self .customFile = custom_config_file
150
+ self .templateFile = self .get_template_path ()
156
151
157
152
@property
158
153
def defaults (self ):
159
154
if not self .__defaults :
160
155
self .__defaults = self .parse_defaults ()
161
156
return self .__defaults
162
157
163
- def reload (self ):
164
- options = {}
165
- self .__sectOptions = {}
166
- if self .configFiles :
167
- for config in self .configFiles :
168
- options .update (self .readConfigFile (config ))
169
- return options
170
-
171
158
def readConfigFile (self , fileName ):
172
159
'''parse config file and store values in a dict {section:{ key: value}}'''
173
160
options = {}
174
- dirname , filename = os .path .split (os .path .abspath (__file__ ))
175
- conf_file = os .path .join (dirname , fileName )
176
- if os .path .isfile (conf_file ):
161
+ if os .path .isfile (fileName ):
177
162
try :
178
163
config = configparser .ConfigParser ()
179
164
config .optionxform = str
180
- config .read (conf_file )
165
+ config .read (fileName )
181
166
for sect in config .sections ():
182
167
options [sect ] = {}
183
168
for name , value in config .items (sect ):
@@ -187,20 +172,48 @@ def readConfigFile(self, fileName):
187
172
except Exception as e :
188
173
print (f"cannot read config file { fileName } Exception { e } " )
189
174
else :
190
- print (f"cannot find config file { fileName } in { dirname } " )
175
+ print (f"cannot find config file { fileName } " )
191
176
return options
192
177
178
+ def get_template_path (self ):
179
+ '''parse config.ini to a simple key:value dict'''
180
+ dirname , _ = os .path .split (os .path .abspath (__file__ ))
181
+ return os .path .join (dirname , 'config.ini' )
182
+
183
+ def parse_file (self , file ):
184
+ '''parse file to a simple key:value dict'''
185
+ settings = {}
186
+ section_names = set ()
187
+ sections = self .readConfigFile (file )
188
+ if sections :
189
+ section_names = set (sections .keys ())
190
+ for _ , sect_values in sections .items ():
191
+ for name , value in sect_values .items ():
192
+ settings [name ] = value
193
+ return section_names , settings
194
+
193
195
def parse_defaults (self ):
194
- '''parse all sections parameters to a simple key:value dict'''
195
- defaults = {}
196
- for sect_name , sect_values in self .options .items ():
197
- for name , value in sect_values .items ():
198
- defaults [name ] = value
196
+ """Retuns a dictionary of parameter names and values parsed from config file
197
+
198
+ If no custom config file provided the values will be parsed from template
199
+ file (.config.ini)
200
+ """
201
+
202
+ default_sections , defaults = self .parse_file (self .templateFile )
203
+ if not self .customFile :
204
+ return defaults
205
+
206
+ custom_sections , customs = self .parse_file (self .customFile )
207
+ sect = default_sections .intersection (custom_sections )
208
+ if not sect :
209
+ return defaults
210
+
211
+ defaults .update (customs )
199
212
return defaults
200
213
201
214
202
215
class Password (argparse .Action ):
203
- defaults = ConfigManager ().defaults
216
+ # defaults = ConfigManager().defaults
204
217
205
218
def __call__ (self , parser , namespace , values , option_string ):
206
219
if values is None :
@@ -226,6 +239,8 @@ def parse_cmd_args(argv):
226
239
parser .add_argument ('-f' , '--logFile' , action = "store" , default = None ,
227
240
help = 'Name of the log file (Default from config.ini: zserver.log). If no log file name specified \
228
241
all traces will be printed out directly on the command line' )
242
+ parser .add_argument ('-F' , '--configFile' , action = "store" , default = None ,
243
+ help = 'Absolute path to the custom config file that should be used instead of the default config.ini file (optional)' )
229
244
parser .add_argument ('-c' , '--logLevel' , action = "store" , type = int , default = None ,
230
245
help = 'log level. Available levels: 10 (DEBUG), 15 (MOREINFO), 20 (INFO), 30 (WARN), 40 (ERROR) (Default from config.ini: 15)' )
231
246
parser .add_argument ('-e' , '--prometheus' , action = "store" , default = None ,
0 commit comments