def shutdown(a=None, b=None): """ Function to shut down the agent. Do some clean up and close sockets.""" global dr amqp = PluginRegistry.getInstance("AMQPHandler") # Tell others that we're away now if hasattr(amqp, 'env'): e = EventMaker() goodbye = e.Event(e.NodeLeave(e.Id(amqp.env.id))) amqp.sendEvent(goodbye) # Shutdown plugins PluginRegistry.shutdown() dr.stop() logging.info("shut down") logging.shutdown()
def mainLoop(env): """ Main event loop which will process all registerd threads in a loop. It will run as long env.active is set to True.""" global dr # Enable DBus runner dr = DBusRunner() dr.start() log = logging.getLogger(__name__) try: while True: # Load plugins oreg = ObjectRegistry.getInstance() #@UnusedVariable pr = PluginRegistry() #@UnusedVariable cr = PluginRegistry.getInstance("CommandRegistry") amqp = PluginRegistry.getInstance("AMQPHandler") index = PluginRegistry.getInstance("ObjectIndex") wait = 2 notifyInterval = 10 interval = notifyInterval loadAvg = SystemLoad() # Sleep and slice while True: # Threading doesn't seem to work well with python... for p in env.threads: # Bail out if we're active in the meanwhile if not env.active: break # Check if we reached the notification interval interval += wait if interval > notifyInterval: interval = 0 load = loadAvg.getLoad() latency = 0 workers = len(env.threads) log.debug("load %s, latency %s, workers %s" % (load, latency, workers)) e = EventMaker() status = e.Event( e.NodeStatus( e.Id(env.id), e.Load(str(load)), e.Latency(str(latency)), e.Workers(str(workers)), e.Indexed("true" if index.index_active() else "false"), ) ) amqp.sendEvent(status) # Disable potentially dead nodes cr.updateNodes() p.join(wait) # No break, go to main loop else: continue # Leave the thread loop break # Break, leave main loop if not env.reset_requested: break # Wait for threads to shut down for t in env.threads: t.join(wait) if hasattr(t, 'stop'): t.stop() # Lets do an environment reset now PluginRegistry.shutdown() # Make us active and loop from the beginning env.reset_requested = False env.active = True # Catchall, pylint: disable=W0703 except Exception as detail: log.critical("unexpected error in mainLoop") log.exception(detail) except KeyboardInterrupt: log.info("console requested shutdown") finally: shutdown()