# Copyright (c) 2018 Ansible by Red Hat # All Rights Reserved. import os import logging import signal import time from django import db from awx.main.utils.redis import get_redis_client from awx.main.dispatch.pool import WorkerPool logger = logging.getLogger('awx.main.commands.run_callback_receiver') def signame(sig): return dict((k, v) for v, k in signal.__dict__.items() if v.startswith('SIG') and not v.startswith('SIG_'))[sig] class WorkerSignalHandler: def __init__(self): self.kill_now = False signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGINT, self.exit_gracefully) def exit_gracefully(self, *args, **kwargs): self.kill_now = True class AWXConsumerBase(object): last_stats = time.time() def __init__(self, name, worker, queues=[], pool=None): self.should_stop = False self.name = name self.total_messages = 0 self.queues = queues self.worker = worker self.pool = pool if pool is None: self.pool = WorkerPool() self.pool.init_workers(self.worker.work_loop) self.redis = get_redis_client() def run(self, *args, **kwargs): signal.signal(signal.SIGINT, self.stop) signal.signal(signal.SIGTERM, self.stop) # Child should implement other things here def stop(self, signum, frame): self.should_stop = True logger.warning('received {}, stopping'.format(signame(signum))) raise SystemExit() class AWXConsumerRedis(AWXConsumerBase): def run(self, *args, **kwargs): super(AWXConsumerRedis, self).run(*args, **kwargs) logger.info(f'Callback receiver started with pid={os.getpid()}') db.connection.close() # logs use database, so close connection while True: time.sleep(60)