Пример #1
0
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 )