Changeset 1152 for trunk

Show
Ignore:
Timestamp:
11/28/07 01:17:25 (1 year ago)
Author:
alban
Message:

Add configuration file support via --config option. Fixes #1

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/justrecord.py

    r1150 r1152  
    1111import time 
    1212import wave 
     13import optparse 
    1314from optparse import OptionParser 
    1415import pwd, grp 
    1516import syslog 
    1617import subprocess 
     18import ConfigParser 
    1719 
    1820class Recorder: 
    1921 
    20   def __init__(self, options): 
    21     self.channels = options.channels 
    22     self.rate = int(options.rate
    23     self.basename = options.basename 
    24     self.time_limit = options.time_limit 
    25     self.basedir = options.basedir 
    26     self.after_script = options.after_script 
     22  def __init__(self, config): 
     23    self.channels = config.int('channels') 
     24    self.rate = config.int('rate'
     25    self.basename = config['basename'] 
     26    self.time_limit = config.int('time_limit') 
     27    self.basedir = config['basedir'] 
     28    self.after_script = config['after_script'] 
    2729 
    2830    self.output_file_index = 0 
     
    144146class Daemon: 
    145147 
    146   def __init__(self, options, main): 
    147     self.uid = options['uid'] 
    148     self.gid = options['gid'] 
    149     self.pidfile = options['pidfile'] 
    150     self.basedir = options['basedir'] 
    151     self.logfile = options['logfile'] 
     148  def __init__(self, config, main): 
     149    self.uid = config['uid'] 
     150    self.gid = config['gid'] 
     151    self.pidfile = config['pidfile'] 
     152    self.basedir = config['basedir'] 
     153    self.logfile = config['logfile'] 
    152154    self.main = main 
    153155 
     
    239241      syslog.closelog() 
    240242 
     243class Config: 
     244 
     245  def __init__(self, default_options): 
     246    self.options = {} 
     247    self.update(default_options) 
     248 
     249  def update(self, options): 
     250    if isinstance(options, optparse.Values): 
     251      for entry in options.__dict__.iteritems(): 
     252        if entry[1] is not None: 
     253          self.options[entry[0]] = entry[1] 
     254    else: 
     255      self.options.update(options) 
     256 
     257    return self 
     258 
     259  def load_ini(self, inifile): 
     260    config_parser = ConfigParser.ConfigParser() 
     261    if config_parser.read([inifile]) is []: 
     262      return False 
     263 
     264    ini_options = {} 
     265    for config_section in config_parser.sections(): 
     266      for config_entry in config_parser.items(config_section): 
     267        ini_options[config_entry[0]] = config_entry[1] 
     268    self.update(ini_options) 
     269    return True 
     270 
     271  def __getitem__(self, key): 
     272    return self.options[key] 
     273 
     274  def string(self, key): 
     275    return self.options[key] 
     276 
     277  def int(self, key): 
     278    return int(self.options[key]) 
     279 
     280  def bool(self, key): 
     281    value = self.options[key] 
     282    if isinstance(value, basestring): 
     283      return value.lower() in [ 'true', 'on', '1' ] 
     284    return value is True 
     285 
    241286if __name__ == "__main__": 
     287 
     288  config = Config({ 
     289    'basename': 'record', 
     290    'channels': 2, 
     291    'after_script': None, 
     292    'rate': 44100, 
     293    'time_limit': 30 * 60, 
     294    'basedir': os.getcwd(), 
     295    'daemon': False, 
     296    'console': False, 
     297    'syslog': False, 
     298    'uid': os.getuid(), 
     299    'gid': os.getgid(), 
     300    'pidfile': None, 
     301    'logfile': None 
     302  }) 
     303 
    242304  parser = OptionParser() 
    243   parser.add_option("-o", "--output", dest="basename", default='record', 
     305  parser.add_option("-o", "--output", dest="basename", 
    244306                    help="The output basename. The default is 'record'.") 
    245   parser.add_option("-c", "--channels", dest="channels", default=2, type="int", 
    246                     help="The number of channels. The default is 2 channels.") 
    247   parser.add_option("-r", "--rate", dest="rate", default=44100, 
     307  parser.add_option("-c", "--config", dest="config", default=None, 
     308                    help="The configuration file.") 
     309  parser.add_option("-n", "--channels", dest="channels", type="int", 
     310                    help="The number of channels. The default is %d channels." % config['channels']) 
     311  parser.add_option("-r", "--rate", dest="rate", 
    248312                    choices=["48000", "44100", "22000"], 
    249                     help="The sampling rate in Hertz. The default rate is 44100 Hertz"
    250   parser.add_option("-t", "--time", dest="time_limit", type="int", default=30 * 60, 
     313                    help="The sampling rate in Hertz. The default rate is %d Hertz" % config['rate']
     314  parser.add_option("-t", "--time", dest="time_limit", type="int", 
    251315                    help="The time length of recording file in seconds. The default time length is 1800 seconds (30 minutes).") 
    252   parser.add_option("-b", "--base-dir", dest="basedir", default=os.getcwd(), 
     316  parser.add_option("-b", "--base-dir", dest="basedir", 
    253317                    help="The directory where the recording files are created. The default directory is the current one.") 
    254   parser.add_option("-d", "--daemon", action="store_true", dest="daemon", default=False, 
     318  parser.add_option("-d", "--daemon", action="store_true", dest="daemon", 
    255319                    help="Starts as daemon. Disabled by default") 
    256   parser.add_option("-C", "--console", action="store_true", dest="console", default=False, 
     320  parser.add_option("-C", "--console", action="store_true", dest="console", 
    257321                    help="Logs messages to the console even if a logfile is specified.") 
    258   parser.add_option("-s", "--syslog", action="store_true", dest="syslog", default=False, 
     322  parser.add_option("-s", "--syslog", action="store_true", dest="syslog", 
    259323                    help="Logs messages to syslog.") 
    260   parser.add_option("-u", "--uid", dest="uid", default=os.getuid(), 
     324  parser.add_option("-u", "--uid", dest="uid", 
    261325                    help="Change to this username/uid before starting the recorder in daemon mode. The default is the current user.") 
    262   parser.add_option("-g", "--gid", dest="gid", default=os.getgid(), 
     326  parser.add_option("-g", "--gid", dest="gid", 
    263327                    help="Change to this group/gid before starting the recorder in daemon mode. The default is the current group.") 
    264   parser.add_option("-p", "--pidfile", dest="pidfile", default=None, 
     328  parser.add_option("-p", "--pidfile", dest="pidfile", 
    265329                    help="The file used to store the pid in daemon mode.") 
    266   parser.add_option("-l", "--logfile", dest="logfile", default=None, 
     330  parser.add_option("-l", "--logfile", dest="logfile", 
    267331                    help="The file used to log messages.") 
    268   parser.add_option("-A", "--after-script", dest="after_script", default=None, 
     332  parser.add_option("-A", "--after-script", dest="after_script", 
    269333                    help="Specifies a script to be executed each time a recording file is finished.") 
    270   (options, args) = parser.parse_args() 
    271  
    272   logger = Logger(options.console, options.syslog, options.logfile) 
    273   recorder = Recorder(options) 
     334  (commandline_options, args) = parser.parse_args() 
     335 
     336  if commandline_options.config is not None: 
     337    if not config.load_ini(commandline_options.config): 
     338      log("error: can't read config file: %s" % commandline_options.config) 
     339      sys.exit(1) 
     340 
     341  config.update(commandline_options) 
     342 
     343  logger = Logger(config.bool('console'), config.bool('syslog'), config['logfile']) 
     344  recorder = Recorder(config) 
    274345 
    275346  def log(message): 
    276347    logger.log(message) 
     348 
     349  log("config: %s" % config.options) 
    277350 
    278351  def main(): 
     
    280353    logger.close() 
    281354 
    282   daemon = options.daemon 
     355  daemon = config.bool('daemon') 
    283356  if daemon: 
    284     daemon_options = { 
    285       'uid': options.uid, 'gid': options.gid, 'pidfile': options.pidfile, 
    286       'logfile': options.logfile, 'basedir': options.basedir 
    287     } 
    288     Daemon(daemon_options, main).start() 
     357    Daemon(config, main).start() 
    289358  else: 
    290359    main()