Пример #1
0
    def start(self):
        debug("Performing startup checks...")

        if self.config.single_instance:
            self.check_single_instance(
            )  # don't allow more than one service at a time

        if self._started:
            raise RuntimeWarning("Not allowed to start Poller twice")
        self._started = True

        debug("Starting up queue managers...")

        # initialize and start the worker pools
        self.poller_manager = LibreNMS.PollerQueueManager(
            self.config, self._lm)
        self.queue_managers['poller'] = self.poller_manager
        self.discovery_manager = LibreNMS.DiscoveryQueueManager(
            self.config, self._lm)
        self.queue_managers['discovery'] = self.discovery_manager
        if self.config.alerting.enabled:
            self.queue_managers['alerting'] = LibreNMS.AlertQueueManager(
                self.config, self._lm)
        if self.config.services.enabled:
            self.queue_managers['services'] = LibreNMS.ServicesQueueManager(
                self.config, self._lm)
        if self.config.billing.enabled:
            self.queue_managers['billing'] = LibreNMS.BillingQueueManager(
                self.config, self._lm)
        if self.config.ping.enabled:
            self.queue_managers['ping'] = LibreNMS.PingQueueManager(
                self.config, self._lm)
        if self.config.update_enabled:
            self.daily_timer.start()
        self.stats_timer.start()
        if self.config.watchdog_enabled:
            self.watchdog_timer.start()

        info("LibreNMS Service: {} started!".format(self.config.unique_name))
        info("Poller group {}. Using Python {} and {} locks and queues".format(
            '0 (default)' if self.config.group == [0] else self.config.group,
            python_version(), 'redis'
            if isinstance(self._lm, LibreNMS.RedisLock) else 'internal'))
        if self.config.update_enabled:
            info("Maintenance tasks will be run every {}".format(
                timedelta(seconds=self.config.update_frequency)))
        else:
            warning("Maintenance tasks are disabled.")

        # Main dispatcher loop
        try:
            while not self.terminate_flag:
                if self.reload_flag:
                    info("Picked up reload flag, calling the reload process")
                    self.restart()

                if self.reap_flag:
                    self.reap_psutil()

                    # Re-arm the signal handler
                    signal(SIGCHLD, self.reap)
                    self.reap_flag = False

                master_lock = self._acquire_master()
                if master_lock:
                    if not self.is_master:
                        info("{} is now the master dispatcher".format(
                            self.config.name))
                        self.is_master = True
                        self.start_dispatch_timers()

                    devices = self.fetch_immediate_device_list()
                    for device in devices:
                        device_id = device[0]
                        group = device[1]

                        if device[2]:  # polling
                            self.dispatch_immediate_polling(device_id, group)

                        if device[3]:  # discovery
                            self.dispatch_immediate_discovery(device_id, group)
                else:
                    if self.is_master:
                        info("{} is no longer the master dispatcher".format(
                            self.config.name))
                        self.stop_dispatch_timers()
                        self.is_master = False  # no longer master
                sleep(self.config.master_resolution)
        except KeyboardInterrupt:
            pass

        info("Dispatch loop terminated")
        self.shutdown()
Пример #2
0
    def start(self):
        debug("Performing startup checks...")

        if self.config.single_instance:
            self.check_single_instance(
            )  # don't allow more than one service at a time

        if self._started:
            raise RuntimeWarning("Not allowed to start Poller twice")
        self._started = True

        debug("Starting up queue managers...")

        # initialize and start the worker pools
        self.poller_manager = LibreNMS.QueueManager(self.config, 'poller',
                                                    self.poll_device)
        self.alerting_manager = LibreNMS.TimedQueueManager(
            self.config, 'alerting', self.poll_alerting,
            self.dispatch_alerting)
        self.services_manager = LibreNMS.TimedQueueManager(
            self.config, 'services', self.poll_services,
            self.dispatch_services)
        self.discovery_manager = LibreNMS.TimedQueueManager(
            self.config, 'discovery', self.discover_device,
            self.dispatch_discovery)
        self.billing_manager = LibreNMS.BillingQueueManager(
            self.config, self.poll_billing, self.dispatch_poll_billing,
            self.dispatch_calculate_billing)

        self.daily_timer.start()
        self.stats_timer.start()

        info("LibreNMS Service: {} started!".format(self.config.unique_name))
        info("Poller group {}. Using Python {} and {} locks and queues".format(
            '0 (default)' if self.config.group == [0] else self.config.group,
            python_version(), 'redis'
            if isinstance(self._lm, LibreNMS.RedisLock) else 'internal'))
        info("Maintenance tasks will be run every {}".format(
            timedelta(seconds=self.config.update_frequency)))

        # Main dispatcher loop
        try:
            while not self.terminate_flag:
                master_lock = self._lm.lock('dispatch.master',
                                            self.config.unique_name,
                                            self.config.master_timeout, True)
                if master_lock:
                    if not self.is_master:
                        info("{} is now the master dispatcher".format(
                            self.config.name))
                        self.is_master = True
                        self.start_dispatch_timers()

                    devices = self.fetch_immediate_device_list()
                    for device in devices:
                        device_id = device[0]
                        group = device[1]

                        if device[2]:  # polling
                            self.dispatch_immediate_polling(device_id, group)

                        if device[3]:  # discovery
                            self.dispatch_immediate_discovery(device_id, group)
                else:
                    if self.is_master:
                        info("{} is no longer the master dispatcher".format(
                            self.config.name))
                        self.stop_dispatch_timers()
                        self.is_master = False  # no longer master
                sleep(self.config.master_resolution)
        except KeyboardInterrupt:
            pass

        info("Dispatch loop terminated")
        self.shutdown()