def main(): parser = argparse.ArgumentParser( 'doorbot', description='camera monitoring and activity detection' ) verbosity_grp = parser.add_mutually_exclusive_group() verbosity_grp.add_argument( '-v', '--verbose', action='store_true', help='show debug messages on stdout' ) verbosity_grp.add_argument( '-m', '--metric', action='store_true', help='show fps counts every so often on stdout' ) verbosity_grp.add_argument( '-q', '--quiet', action='store_true', help='be as silent as possible on stdout' ) parser.add_argument( '-c', '--config', action='store', default=None, help='manually specify a location for the config file to use' ) parser.add_argument( '-o', '--option', action='append', nargs=3, metavar=('section', 'option', 'value'), help='specify a manual override for the given option' ) parser.add_argument( '-f', '--fps', action='store', default=10.0, help='master loop FPS' ) args = parser.parse_args() if not args.option: args.option = [] config = DoorbotConfig( args.config, args.option ) if args.verbose: logging.basicConfig( level=logging.DEBUG ) #logging.getLogger( 'doorbot.run' ).setLevel( logging.INFO ) #logging.getLogger( 'doorbot.process' ).setLevel( logging.WARNING ) #logging.getLogger( 'camera.process' ).setLevel( logging.WARNING ) logging.getLogger( 'urllib3.connectionpool' ).setLevel( logging.WARNING ) logging.getLogger( 'fps.timer' ).setLevel( logging.WARNING ) logging.getLogger( 'framelock' ).setLevel( logging.ERROR ) elif args.quiet: logging.basicConfig( level=logging.ERROR ) else: logging.basicConfig( level=logging.INFO ) logging.getLogger( 'framelock' ).setLevel( logging.ERROR ) logging.getLogger( 'fps.timer' ).setLevel( logging.ERROR ) logger = logging.getLogger( 'main' ) if args.metric: logging.getLogger( 'fps.timer' ).setLevel( logging.DEBUG ) try: smtp_server = urlparse( config.parser['exceptions']['smtpserver'] ) smtp_handler = SMTPHandler( (smtp_server.hostname, smtp_server.port if smtp_server.port else 25), config.parser['exceptions']['smtpfrom'], config.parser['exceptions']['smtpto'].split( ',' ), '[doorbot] Exception Occurred' ) if smtp_server.username: smtp_handler.username = smtp_server.username if smtp_server.password: smtp_handler.password = smtp_server.password if 'smtps' == smtp_server.scheme: smtp_handler.secure = () smtp_handler.setLevel( logging.ERROR ) logging.getLogger( '' ).addHandler( smtp_handler ) logger.info( 'exception reporter initialized' ) except (NoOptionError, NoSectionError, KeyError) as exc: logger.info( 'could not setup exception reporter: %s', exc ) #app.start() #app.join() app = None try: app = Doorbot( config, fps=args.fps ) app.run() except KeyboardInterrupt: logger.info( 'quitting on ctrl-c' ) if app: for camera_key in app.cameras: app.cameras[camera_key].stop() app.overlay_thread.stop() for observer_key in app.observer_procs: app.observer_procs[observer_key].stop() sys.exit( 0 ) except Exception as exc: # pylint: disable=broad-except logger.exception( exc )