Example #1
0
def main():
    parser = OptionParser()
    parser.add_option('-o', '--output', dest='output',
                      help='write messages to FILE', metavar='FILE')
    parser.add_option('-c', '--config', dest='config',
                      help='read config from FILE', metavar='FILE')
    parser.add_option('-d', '--debug', dest='debug', action='store_true',
                      help='print debug messages')
    parser.add_option('-v', '--version', dest='version', action='store_true',
                      help='print version number and exit')
    (options, args) = parser.parse_args()

    if options.version:
        print VERSION
        sys.exit(0)

    if not options.config:
        print >> sys.stderr, 'ERROR: Please provide a config file.'
        print parser.print_help()
        sys.exit(1)

    # Logging
    logger = logging.getLogger('Remidomo')
    if options.output:
        handler = logging.FileHandler(options.output)
    else:
        handler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    handler.setFormatter(formatter)
    if options.debug:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)
    logger.addHandler(handler)

    # Main loop
    logger.info('Démarrage')

    config_timestamp = None
    rfx_listener = None
    while 1:
        file_timestamp = os.path.getmtime(options.config)
        if config_timestamp is None or config_timestamp != file_timestamp:
            if rfx_listener is not None:
                rfx_listener.stop()
                time.sleep(15)
            config = Config(logger)
            config.read_file(options.config)
            database = Database(config, logger)
            database.connect()
            executor = Executor(config, logger)
            rfx_listener = RFXListener(config, database, executor, logger)
            rfx_listener.start()
            config_timestamp = file_timestamp
            executor.service_flag(1)

        try:
            executor.blink_activity()
            check_orders(logger, config, executor, database)
            if not rfx_listener.isAlive():
                raise Exception('RFX thread stopped')
            time.sleep(60)
        except KeyboardInterrupt:
            print >> sys.stderr, '\nExiting by user request.\n'
            executor.heating_poweroff()
            executor.service_flag(0)
            rfx_listener.stop()
            database.close()
            sys.exit(0)
        except Exception, e:
            logger.warning('Emergency shutdown ! %s' % e)
            executor.heating_poweroff()
            executor.service_flag(0)
            # If main thread crashes, we must also stop RFX thread !
            rfx_listener.stop()
            database.close()
            raise