def __init__(self, message_queue): threading.Thread.__init__(self) self.name = "Process Message Listener" self.message_queue = message_queue self.stayalive = True self.statskeeper = Statskeeper() self.daemon = True
def fuglu_process_worker(queue, config, shared_state,child_to_server_messages, logQueue): signal.signal(signal.SIGHUP, signal.SIG_IGN) logtools.client_configurer(logQueue) logging.basicConfig(level=logging.DEBUG) workerstate = WorkerStateWrapper(shared_state,'loading configuration') logger = logging.getLogger('fuglu.process') logger.debug("New worker: %s" % logtools.createPIDinfo()) # load config and plugins controller = fuglu.core.MainController(config,logQueue) controller.load_extensions() controller.load_plugins() prependers = controller.prependers plugins = controller.plugins appenders = controller.appenders # forward statistics counters to parent process stats = Statskeeper() stats.stat_listener_callback.append(lambda event: child_to_server_messages.put(event.as_message())) logger.debug("%s: Enter service loop..." % logtools.createPIDinfo()) try: while True: workerstate.workerstate = 'waiting for task' logger.debug("%s: Child process waiting for task" % logtools.createPIDinfo()) task = queue.get() if task is None: # poison pill logger.debug("%s: Child process received poison pill - shut down" % logtools.createPIDinfo()) try: # it might be possible it does not work to properly set the workerstate # since this is a shared variable -> prevent exceptions workerstate.workerstate = 'ended' except Exception as e: pass finally: return workerstate.workerstate = 'starting scan session' logger.debug("%s: Child process starting scan session" % logtools.createPIDinfo()) sock, handler_modulename, handler_classname = fuglu_process_unpack(task) handler_class = getattr(importlib.import_module(handler_modulename), handler_classname) handler_instance = handler_class(sock, config) handler = SessionHandler(handler_instance, config,prependers, plugins, appenders) handler.handlesession(workerstate) except KeyboardInterrupt: workerstate.workerstate = 'ended' except: trb = traceback.format_exc() logger.error("Exception in child process: %s"%trb) print(trb) workerstate.workerstate = 'crashed' finally: controller.shutdown()
def __init__(self, protohandler, config, prependers, plugins, appenders): self.logger = logging.getLogger("fuglu.SessionHandler") self.action = DUNNO self.config = config self.prependers = prependers self.plugins = plugins self.appenders = appenders self.stats = Statskeeper() self.worker = None self.message = None self.protohandler = protohandler
def fuglu_process_worker(queue, config, shared_state, child_to_server_messages): logging.basicConfig(level=logging.DEBUG) workerstate = WorkerStateWrapper(shared_state, 'loading configuration') logger = logging.getLogger('fuglu.process') # load config and plugins controller = fuglu.core.MainController(config) controller.load_extensions() controller.load_plugins() prependers = controller.prependers plugins = controller.plugins appenders = controller.appenders # forward statistics counters to parent process stats = Statskeeper() stats.stat_listener_callback.append( lambda event: child_to_server_messages.put(event.as_message())) try: while True: workerstate.workerstate = 'waiting for task' task = queue.get() if task is None: # poison pill logger.debug("Child process received poison pill - shut down") workerstate.workerstate = 'ended' return workerstate.workerstate = 'starting scan session' pickled_socket, handler_modulename, handler_classname = task sock = pickle.loads(pickled_socket) handler_class = getattr( importlib.import_module(handler_modulename), handler_classname) handler_instance = handler_class(sock, config) handler = SessionHandler(handler_instance, config, prependers, plugins, appenders) handler.handlesession(workerstate) except KeyboardInterrupt: workerstate.workerstate = 'ended' except: trb = traceback.format_exc() logger.error("Exception in child process: %s" % trb) print(trb) workerstate.workerstate = 'crashed'
def fuglu_process_worker(queue, config, shared_state, child_to_server_messages, logQueue): signal.signal(signal.SIGHUP, signal.SIG_IGN) logtools.client_configurer(logQueue) logging.basicConfig(level=logging.DEBUG) workerstate = WorkerStateWrapper(shared_state, 'loading configuration') logger = logging.getLogger( 'fuglu.process.%s(%u)' % (workerstate.process.name, workerstate.process.pid)) logger.debug("New worker: %s" % logtools.createPIDinfo()) # Setup address compliance checker # -> Due to default linux forking behavior this should already # have the correct setup but it's better not to rely on this try: address_check = config.get('main', 'address_compliance_checker') except Exception as e: # might happen for some tests which do not propagate defaults address_check = "Default" Addrcheck().set(address_check) # load config and plugins logger.debug("Create MainController") controller = fuglu.core.MainController(config, logQueue=logQueue, nolog=True) controller.load_extensions() controller.load_plugins() prependers = controller.prependers plugins = controller.plugins appenders = controller.appenders # forward statistics counters to parent process stats = Statskeeper() stats.stat_listener_callback.append( lambda event: child_to_server_messages.put(event.as_message())) logger.debug("%s: Enter service loop..." % logtools.createPIDinfo()) try: while True: workerstate.workerstate = 'waiting for task' logger.debug("%s: Child process waiting for task" % logtools.createPIDinfo()) task = queue.get() if task is None: # poison pill logger.debug( "%s: Child process received poison pill - shut down" % logtools.createPIDinfo()) try: # it might be possible it does not work to properly set the workerstate # since this is a shared variable -> prevent exceptions workerstate.workerstate = 'ended (poison pill)' except Exception as e: logger.debug( "Exception setting workstate while getting poison pill" ) logger.exception(e) pass finally: return workerstate.workerstate = 'starting scan session' logger.debug("%s: Child process starting scan session" % logtools.createPIDinfo()) sock, handler_modulename, handler_classname, port = uncompress_task( task) handler_class = getattr( importlib.import_module(handler_modulename), handler_classname) handler_instance = handler_class(sock, config) handler = SessionHandler(handler_instance, config, prependers, plugins, appenders, port) handler.handlesession(workerstate) del handler del handler_instance del handler_class del handler_modulename del handler_classname del sock # developers only: # for debugging memory this can be enabled # Note this can NOT be copied to threadpool worker because # it will create a memory leak if OBJGRAPH_EXTENSION_ENABLED and False: debug_procpoolworkermemory(logger, config) except KeyboardInterrupt: workerstate.workerstate = 'ended (keyboard interrupt)' logger.debug("Keyboard interrupt") except Exception as e: logger.error("Exception in worker process: %s" % str(e)) workerstate.workerstate = 'crashed' finally: # this process will not put any object in queue queue.close() controller.shutdown()