def main(): """handle unexpected exceptions""" parser = argparse.ArgumentParser( description="Integrated Manager for Lustre software Agent") parser.add_argument("--publish-zconf", action="store_true") parser.parse_args() signal.signal(signal.SIGHUP, signal.SIG_IGN) daemon_log_setup() console_log_setup() daemon_log.info("Starting") try: daemon_log.info("Entering main loop") try: url = urljoin(os.environ["IML_MANAGER_URL"], "agent/message/") except KeyError as e: daemon_log.error( "No configuration found (must be registered before running the agent service), " "details: %s" % e) return if config.profile_managed is False: # This is kind of terrible. The design of DevicePluginManager is # such that it can be called with either class methods or # instantiated and then called with instance methods. As such, # we can't pass in a list of excluded plugins to the instance # constructor. Well, we could, but it would only work some # of the time and that would be even more awful. import chroma_agent.plugin_manager chroma_agent.plugin_manager.EXCLUDED_PLUGINS += ['corosync'] agent_client = AgentClient(url, ActionPluginManager(), DevicePluginManager(), ServerProperties(), Crypto(ENV_PATH)) def teardown_callback(*args, **kwargs): agent_client.stop() agent_client.join() [function() for function in agent_daemon_teardown_functions] signal.signal(signal.SIGINT, teardown_callback) signal.signal(signal.SIGTERM, teardown_callback) signal.signal(signal.SIGUSR1, decrease_loglevel) signal.signal(signal.SIGUSR2, increase_loglevel) # Call any agent daemon startup methods that were registered. [function() for function in agent_daemon_startup_functions] agent_client.start() # Waking-wait to pick up signals while not agent_client.stopped.is_set(): agent_client.stopped.wait(timeout=10) agent_client.join() except Exception, e: backtrace = '\n'.join(traceback.format_exception(*(sys.exc_info()))) daemon_log.error("Unhandled exception: %s" % backtrace)
def main(): """Daemonize and handle unexpected exceptions""" parser = argparse.ArgumentParser( description="IntelĀ® Manager for Lustre* software Agent") parser.add_argument("--foreground", action="store_true") parser.add_argument("--publish-zconf", action="store_true") parser.add_argument("--pid-file", default="/var/run/chroma-agent.pid") args = parser.parse_args() # FIXME: at startup, if there is a PID file hanging around, find any # processes which are children of that old PID, and kill them: prevent # orphaned processes from an old agent run hanging around where they # could cause trouble (think of a 2 hour mkfs) if not args.foreground: if os.path.exists(args.pid_file): pid = None try: pid = int(open(args.pid_file).read()) os.kill(pid, 0) except (ValueError, OSError, IOError): # Not running, delete stale PID file sys.stderr.write("Removing stale PID file\n") try: os.remove(args.pid_file) os.remove(args.pid_file + ".lock") except OSError, e: import errno if e.errno != errno.ENOENT: raise e if pid is not None: kill_orphans_of(pid) else: # Running, we should refuse to run raise RuntimeError("Daemon is already running (PID %s)" % pid) else: if os.path.exists(args.pid_file + ".lock"): sys.stderr.write("Removing stale lock file\n") os.remove(args.pid_file + ".lock") signal.signal(signal.SIGHUP, signal.SIG_IGN) context = DaemonContext(pidfile=PIDLockFile(args.pid_file)) context.open() daemon_log_setup() console_log_setup() daemon_log.info("Starting in the background")
raise RuntimeError("Daemon is already running (PID %s)" % pid) else: if os.path.exists(args.pid_file + ".lock"): sys.stderr.write("Removing stale lock file\n") os.remove(args.pid_file + ".lock") signal.signal(signal.SIGHUP, signal.SIG_IGN) context = DaemonContext(pidfile=PIDLockFile(args.pid_file)) context.open() daemon_log_setup() console_log_setup() daemon_log.info("Starting in the background") else: context = None daemon_log_setup() daemon_log.addHandler(logging.StreamHandler()) console_log_setup() try: daemon_log.info("Entering main loop") try: conf = config.get('settings', 'server') except (KeyError, TypeError) as e: daemon_log.error( "No configuration found (must be registered before running the agent service), " "details: %s" % e) return if config.profile_managed is False: