143 Custom optparse.Values implementation. |
145 Custom optparse.Values implementation. |
144 |
146 |
145 Passed to OptionParser.parse_args(), called by Option.take_action(): |
147 Passed to OptionParser.parse_args(), called by Option.take_action(): |
146 setattr(values, dest, ...) |
148 setattr(values, dest, ...) |
147 values.ensure_value(dest, ...) |
149 values.ensure_value(dest, ...) |
|
150 |
|
151 Implements _merge(...) to merge in options from multiple sources. |
148 """ |
152 """ |
149 |
153 |
150 def __init__ (self, parser, defaults={ }) : |
154 def __init__ (self, parser, defaults={ }) : |
151 self._parser = parser |
155 self._parser = parser |
152 self._defaults = defaults |
156 self._defaults = defaults |
228 # apply in actual options |
232 # apply in actual options |
229 config_options._merge(options) |
233 config_options._merge(options) |
230 |
234 |
231 return config_options |
235 return config_options |
232 |
236 |
233 def parse (parser, argv) : |
237 def apply_core (options) : |
|
238 """ |
|
239 Apply the optparse options. |
|
240 """ |
|
241 |
|
242 # configure |
|
243 logging.basicConfig( |
|
244 # XXX: log Class.__init__ as Class, not __init__? |
|
245 format = '%(levelname)8s %(name)20s.%(funcName)s: %(message)s', |
|
246 level = options.loglevel, |
|
247 filename = options.log_file, |
|
248 ) |
|
249 |
|
250 # enable debugging for specific targets |
|
251 for logger in options.debug_module : |
|
252 logging.getLogger(logger).setLevel(logging.DEBUG) |
|
253 |
|
254 def parse (parser, argv, package=None, module=None) : |
234 """ |
255 """ |
235 Parse options, args from argv. |
256 Parse options, args from argv. |
236 """ |
257 """ |
237 |
258 |
|
259 prog = os.path.basename(argv[0]) |
|
260 |
238 options, args = parser.parse_args(argv[1:], values=Options(parser, parser.defaults)) |
261 options, args = parser.parse_args(argv[1:], values=Options(parser, parser.defaults)) |
239 |
262 |
|
263 # XXX: apply the core logging parts... |
|
264 apply_core(options) |
|
265 |
|
266 if package and module: |
|
267 conf_path = os.path.join(CONFDIR, package, module + '.conf') |
|
268 |
|
269 if os.path.exists(conf_path): |
|
270 log.info("%s", conf_path) |
|
271 options = apply_config(options, parser, conf_path) |
|
272 else: |
|
273 log.debug("%s: skip", conf_path) |
|
274 |
240 for config in options.config : |
275 for config in options.config : |
|
276 log.info("%s", config) |
241 options = apply_config(options, parser, config) |
277 options = apply_config(options, parser, config) |
242 |
278 |
243 return options, args |
279 return options, args |
244 |
280 |
245 def apply (options, logname=None, rootok=True) : |
281 def apply (options, logname=None, rootok=True) : |
260 filename = options.log_file, |
296 filename = options.log_file, |
261 ) |
297 ) |
262 |
298 |
263 # TODO: use --quiet for stdout output? |
299 # TODO: use --quiet for stdout output? |
264 options.quiet = options.loglevel > logging.WARN |
300 options.quiet = options.loglevel > logging.WARN |
265 |
301 |
266 if options.setuid : |
302 if options.setuid : |
267 if options.uid or options.gid or not rootok : |
303 if options.uid or options.gid or not rootok : |
268 # set uid/gid |
304 # set uid/gid |
269 apply_setid(options, rootok=rootok) |
305 apply_setid(options, rootok=rootok) |
270 |
306 |
271 # enable debugging for specific targets |
307 # enable debugging for specific targets |
272 for logger in options.debug_module : |
308 for logger in options.debug_module : |
273 logging.getLogger(logger).setLevel(logging.DEBUG) |
309 logging.getLogger(logger).setLevel(logging.DEBUG) |
274 |
310 |
|
311 |
275 def main (main) : |
312 def main (main) : |
276 """ |
313 """ |
277 Run given main func. |
314 Run given main func. |
278 """ |
315 """ |
279 |
316 |