def main(): """Parse CLI arguments and launches main program.""" args = docopt(__doc__, version=VERSION) config = ConfigParser(interpolation=ExtendedInterpolation()) # Set defaults for all sections config.read_dict(copy.copy(DEFAULT_OPTIONS)) try: config.read(args['--file']) except ParsingError as exc: sys.exit(str(exc)) incoming_dir = config.get('process', 'src-dir') if args['--print']: for section in sorted(DEFAULT_OPTIONS): if section == 'pull': continue print("[{}]".format(section)) for key, value in sorted(DEFAULT_OPTIONS[section].items()): print("{k} = {v}".format(k=key, v=value)) print() sys.exit(0) if args['--print-conf']: for section in sorted(config): if section == 'pull': continue print("[{}]".format(section)) for key, value in sorted(config[section].items()): print("{k} = {v}".format(k=key, v=value)) print() sys.exit(0) try: configuration_check(config, 'paths') configuration_check(config, 'process') configuration_check(config, 'graphite') read_write_access(config.get('process', 'src-dir')) check_metrics(config) except ValueError as exc: sys.exit(str(exc)) tasks = multiprocessing.Queue() handler = EventHandler(tasks=tasks) notifier = pyinotify.Notifier(watcher, handler) num_consumers = config.getint('process', 'workers') incoming_dir = config.get('process', 'src-dir') loglevel =\ config.get('process', 'loglevel').upper() # pylint: disable=no-member log.setLevel(getattr(logging, loglevel, None)) log.info('haproxystats-processs %s version started', VERSION) # process incoming data which were retrieved while processing was stopped for pathname in glob.iglob(incoming_dir + '/*'): if os.path.isdir(pathname): log.info('putting %s in queue', pathname) tasks.put(pathname) def shutdown(signalnb=None, frame=None): """Signal processes to exit. It adds STOP_SIGNAL to the queue, which causes processes to exit in a clean way. Arguments: signalnb (int): The ID of signal frame (obj): Frame object at the time of receiving the signal """ log.info('received %s at %s', signalnb, frame) notifier.stop() for _ in range(num_consumers): log.info('sending stop signal to worker') tasks.put(STOP_SIGNAL) log.info('waiting for workers to finish their work') for consumer in consumers: consumer.join() log.info('exiting') sys.exit(0) # Register our graceful shutdown process to termination signals signal.signal(signal.SIGHUP, shutdown) signal.signal(signal.SIGTERM, shutdown) # Add our watcher while True: try: log.info('adding a watch for %s', incoming_dir) watcher.add_watch(incoming_dir, MASK, quiet=False, rec=False) except pyinotify.WatchManagerError as error: log.error('received error (%s), going to retry in few seconds', error) time.sleep(3) else: break log.info('creating %d consumers', num_consumers) consumers = [Consumer(tasks, config) for i in range(num_consumers)] for consumer in consumers: consumer.start() log.info('watching %s directory for incoming data', incoming_dir) notifier.loop(daemonize=False)