def run(self): # Changes the process name shown by ps for instance setProcTitle ("agentcluster master [version: %s] [monitoring: %d seconds]" % (__version__,self.monitoring_period) ); try: logger.info ( 'Agent cluster server starting' ); logger.info ( 'Configurations will be scanned in directories:' ); for directory in confdir.data: logger.info ( ' o %s', os.path.abspath(directory) ); self.watchdog = Watchdog(self.monitoring_period) self.watchdog.start() # Generates a deadlock to enter in sleep mode # Only an external signal can break this deadlock logger.info ( 'Agent cluster server started' ); queue = JoinableQueue() queue.put(object()); queue.join(); except KeyboardInterrupt: logger.info ( 'Agent cluster server interrupted' ); except Exception: logger.error ( 'Exception catched in main process: %s', sys.exc_info()[1] ); logger.debug ( "", exc_info=True ); finally: # First stop the monitoring to avoid restarting killed agents if self.watchdog is not None: self.watchdog.shutdown = True self.watchdog.join() logger.info ( 'Agent cluster server end' ); logging.shutdown()
def run(self): transportDispatcher = None try: # Initialize the engine self.tokens_start.get() if self.active is not None and self.active.lower() == "false": # Changes the process name shown by ps for instance setProcTitle("agentcluster agent [active: False] [name: %s]" % self.name) logger.info('Agent "%s": inactive', self.name) # Generates a deadlock to enter in sleep mode # Only an external signal can break this deadlock self.tokens_start.task_done() queue = JoinableQueue() queue.put(object()) queue.join() # Changes the process name shown by ps for instance setProcTitle("agentcluster agent [active: True ] [name: %s]" % self.name) logger.info('Agent "%s": run', self.name) logger.debug('EngineID="%s"', self.engineID) engineID_bin = None if self.engineID != None: try: engineID_bin = self.engineID.decode("hex") except Exception: logger.warn( "Cannot convert configured engine ID to byte array, engine ID ignored: %s", self.engineID ) logger.debug("", exc_info=True) else: logger.debug("No context engineID specified, let pysnmp generate one") snmpEngine = engine.SnmpEngine(snmpEngineID=engineID_bin) logger.debug('Agent "%s": Configure transport layer', self.name) for protocol, params in self.listen.__dict__.items(): if type(params) is list: for param in params: (domain, socket) = self.socketHelper.openSocket(protocol, param.encode("ascii")) config.addSocketTransport(snmpEngine, domain, socket) else: (domain, socket) = self.socketHelper.openSocket(protocol, params.encode("ascii")) config.addSocketTransport(snmpEngine, domain, socket) logger.debug('Agent "%s": Configure application layer', self.name) snmpContext = context.SnmpContext(snmpEngine) if self.snmpv1 is not None: SnmpConfHelperV1().configure(snmpEngine, snmpContext, self.snmpv1) if self.snmpv2c is not None: SnmpConfHelperV2().configure(snmpEngine, snmpContext, self.snmpv2c) if self.snmpv3 is not None: SnmpConfHelperV3().configure(snmpEngine, snmpContext, self.snmpv3) cmdrsp.GetCommandResponder(snmpEngine, snmpContext) cmdrsp.SetCommandResponder(snmpEngine, snmpContext) cmdrsp.NextCommandResponder(snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(snmpEngine, snmpContext) logger.debug('Agent "%s": Configured', self.name) self.tokens_start.task_done() logger.debug("Starting parent and database watchdog") self.monitor = Watchdog(self.parent_pid, self.monitoring_period) self.monitor.start() # Job will never end unless killed logger.debug('Agent "%s": Running dispatcher', self.name) transportDispatcher = snmpEngine.transportDispatcher transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() except KeyboardInterrupt: logger.debug('Agent "%s": interrupted', self.name) except Exception: logger.error("Unexpected exception catched in agent: %s", sys.exc_info()[1]) logger.error("", exc_info=True) finally: if transportDispatcher != None: transportDispatcher.closeDispatcher() logger.info('Agent "%s": end', self.name) logging.shutdown() try: # Issue #3: Python 2.7.6 releases the parent process if children is killed # not Python 2.6.6 so we must still release the token. self.tokens_start.task_done() except: pass # Issue #3: This agent is no longer usable so commit suicide to be sure # This process won't become a zombie and that parent will start a new agent os.kill(os.getpid(), signal.SIGKILL)