Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
    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)