def register_server(url, ca, secret, address=None): if _service_is_running() is True: console_log.warning( "chroma-agent service was running before registration, stopping.") agent_service.stop() crypto = Crypto(config.path) # Call delete in case we are over-writing a previous configuration that wasn't removed properly crypto.delete() crypto.install_authority(ca) agent_client = AgentClient(url + "register/%s/" % secret, ActionPluginManager(), DevicePluginManager(), ServerProperties(), crypto) registration_result = agent_client.register(address) crypto.install_certificate(registration_result['certificate']) config.set('settings', 'server', {'url': url}) console_log.info("Enabling chroma-agent service") agent_service.enable() console_log.info("Starting chroma-agent service") agent_service.start() return registration_result
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 reregister_server(url, address): """ Update manager url and register agent address with manager """ if _service_is_running() is True: console_log.warning( "chroma-agent service was running before registration, stopping.") agent_service.stop() config.set('settings', 'server', {'url': url}) crypto = Crypto(config.path) agent_client = AgentClient(url + 'reregister/', ActionPluginManager(), DevicePluginManager(), ServerProperties(), crypto) data = {'address': address, 'fqdn': agent_client._fqdn} try: result = agent_client.post(data) except HttpError: console_log.error("Reregistration failed to %s with request %s" % (agent_client.url, data)) raise console_log.info("Starting chroma-agent service") agent_service.start() return result
def reregister_server(url, address): """ Update manager url and register agent address with manager """ if _service_is_running() is True: console_log.warning( "chroma-agent service was running before registration, stopping.") agent_service.stop() conf.set_server_url(url) crypto = Crypto(conf.ENV_PATH) agent_client = AgentClient( url + "reregister/", ActionPluginManager(), DevicePluginManager(), ServerProperties(), crypto, ) data = {"address": address, "fqdn": agent_client._fqdn} try: result = agent_client.post(data) except HttpError: console_log.error("Reregistration failed to %s with request %s" % (agent_client.url, data)) raise console_log.info("Starting chroma-agent service") agent_service.start() return result
def configure_repo(filename, file_contents): crypto = Crypto(config.path) full_filename = os.path.join(REPO_PATH, filename) temp_full_filename = full_filename + '.tmp' file_contents = file_contents.format(crypto.AUTHORITY_FILE, crypto.PRIVATE_KEY_FILE, crypto.CERTIFICATE_FILE) try: file_handle = os.fdopen(os.open(temp_full_filename, os.O_WRONLY | os.O_CREAT, 0644), 'w') file_handle.write(file_contents) file_handle.close() os.rename(temp_full_filename, full_filename) except OSError as error: return agent_error(str(error)) return agent_result_ok
def configure_repo(filename, file_contents): crypto = Crypto(ENV_PATH) full_filename = os.path.join(REPO_PATH, filename) temp_full_filename = full_filename + ".tmp" # this format needs to match create_repo() in manager agent-bootstrap-script file_contents = file_contents.format(crypto.AUTHORITY_FILE, crypto.PRIVATE_KEY_FILE, crypto.CERTIFICATE_FILE) try: file_handle = os.fdopen( os.open(temp_full_filename, os.O_WRONLY | os.O_CREAT, 0o644), "w") file_handle.write(file_contents) file_handle.close() os.rename(temp_full_filename, full_filename) except OSError as error: return agent_error(str(error)) return agent_result_ok
def main(): parser = ArgumentParser( description="Intel® Manager for Lustre* software Copytool Monitor") parser.add_argument("copytool_id", action=GetCopytoolAction) args = parser.parse_args() copytool_log_setup() try: manager_url = config.get('settings', 'server')['url'] + "copytool_event/" except KeyError: copytool_log.error( "No configuration found (must be configured before starting a copytool monitor)" ) sys.exit(1) client = CryptoClient(manager_url, Crypto(config.path)) monitor = CopytoolMonitor(client, args.copytool) def teardown_callback(*args, **kwargs): monitor.stop() signal.signal(signal.SIGTERM, teardown_callback) signal.signal(signal.SIGINT, teardown_callback) signal.signal(signal.SIGUSR1, decrease_loglevel) signal.signal(signal.SIGUSR2, increase_loglevel) try: monitor.start() while not monitor.stopping.is_set(): monitor.stopping.wait(timeout=10) monitor.join() except Exception as e: copytool_log.exception() sys.stderr.write("Unhandled exception: %s\n" % e) sys.exit(1) copytool_log.info("Terminating")
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(conf['url'] + "message/", ActionPluginManager(), DevicePluginManager(), ServerProperties(), Crypto(config.path)) def teardown_callback(*args, **kwargs): agent_client.stop() agent_client.join() [function() for function in agent_daemon_teardown_functions] if not args.foreground: handlers = { signal.SIGTERM: teardown_callback, signal.SIGUSR1: decrease_loglevel, signal.SIGUSR2: increase_loglevel } set_signal_handlers(handlers) else: signal.signal(signal.SIGINT, teardown_callback)
def __init__(self, simulator, fake_cluster, server_id, fqdn, nodename, nid_tuples_or_network_interfaces, worker=False, client_mounts=None): self.fqdn = fqdn super(FakeServer, self).__init__(simulator.folder) self.nodename = nodename # When reloaded from a file the network interfaces are presented as a dict but when created from code they # are represented as nid_tuples. if type(nid_tuples_or_network_interfaces) is dict: self.network_interfaces = nid_tuples_or_network_interfaces else: self.network_interfaces = {} interface_no = 0 for nid in nid_tuples_or_network_interfaces: self.network_interfaces[nid[0]] = { 'interface_no': interface_no, 'type': nid[1], 'lnd_type': nid[1], 'lnd_network': nid[2] } interface_no += 1 self.boot_time = IMLDateTime.utcnow() self.id = server_id self.log_rate = 0 self._log_messages = [] self._simulator = simulator self._devices = simulator.devices self._cluster = fake_cluster self._lock = threading.Lock() self._agent_client = None self._cluster.join(nodename, fqdn=fqdn) if simulator.folder: # If simulator is persistent, save Crypto in same place crypto_folder = os.path.join(simulator.folder, "%s_crypto" % self.fqdn) else: # If simulator is ephemeral, create temp dir for Crypto crypto_folder = tempfile.mkdtemp() if not os.path.exists(crypto_folder): os.makedirs(crypto_folder) self.crypto = Crypto(crypto_folder) if not client_mounts: client_mounts = {} self.state['id'] = server_id self.state['network_interfaces'] = self.network_interfaces self.state['nodename'] = nodename self.state['fqdn'] = fqdn self.state['worker'] = worker self.state['client_mounts'] = client_mounts self.state['packages'][ 'chroma-agent'] = self._simulator.available_packages( self.node_type)[ 'chroma-agent'] # The agent is installed at this point. self.save()