Changeset 1152
- Timestamp:
- 11/28/07 01:17:25 (1 year ago)
- Files:
-
- trunk/justrecord.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/justrecord.py
r1150 r1152 11 11 import time 12 12 import wave 13 import optparse 13 14 from optparse import OptionParser 14 15 import pwd, grp 15 16 import syslog 16 17 import subprocess 18 import ConfigParser 17 19 18 20 class Recorder: 19 21 20 def __init__(self, options):21 self.channels = options.channels22 self.rate = int(options.rate)23 self.basename = options.basename24 self.time_limit = options.time_limit25 self.basedir = options.basedir26 self.after_script = options.after_script22 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'] 27 29 28 30 self.output_file_index = 0 … … 144 146 class Daemon: 145 147 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'] 152 154 self.main = main 153 155 … … 239 241 syslog.closelog() 240 242 243 class 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 241 286 if __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 242 304 parser = OptionParser() 243 parser.add_option("-o", "--output", dest="basename", default='record',305 parser.add_option("-o", "--output", dest="basename", 244 306 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", 248 312 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", 251 315 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", 253 317 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", 255 319 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", 257 321 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", 259 323 help="Logs messages to syslog.") 260 parser.add_option("-u", "--uid", dest="uid", default=os.getuid(),324 parser.add_option("-u", "--uid", dest="uid", 261 325 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", 263 327 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", 265 329 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", 267 331 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", 269 333 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) 274 345 275 346 def log(message): 276 347 logger.log(message) 348 349 log("config: %s" % config.options) 277 350 278 351 def main(): … … 280 353 logger.close() 281 354 282 daemon = options.daemon355 daemon = config.bool('daemon') 283 356 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() 289 358 else: 290 359 main()
