pvl/args.py
changeset 29 8fcb140f1ee0
parent 28 69e1b91cd83f
child 34 603a823bf5df
equal deleted inserted replaced
28:69e1b91cd83f 29:8fcb140f1ee0
     9 import os
     9 import os
    10 import pwd
    10 import pwd
    11 import sys
    11 import sys
    12 
    12 
    13 import logging; log = logging.getLogger('pvl.args')
    13 import logging; log = logging.getLogger('pvl.args')
       
    14 
       
    15 CONFDIR = '/etc/pvl'
    14 
    16 
    15 def parser (parser, setuid=None) :
    17 def parser (parser, setuid=None) :
    16     """
    18     """
    17         Return an optparse.OptionGroup.
    19         Return an optparse.OptionGroup.
    18     """
    20     """
   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