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()
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()