def main(): parser = OptionParser() parser.add_option("-v", "--verbose", dest="verbose", help="verbose log output", default=False) parser.add_option("-l", "--label", dest="label", help="label of the agent", default=None) parser.add_option("--zk-quorum", dest=Constants.ZK_QUORUM, help="Zookeeper Quorum", default=None) parser.add_option("--zk-reg-path", dest=Constants.ZK_REG_PATH, help="Zookeeper Registry Path", default=None) parser.add_option("--debug", dest="debug", help="Agent debug hint", default="") (options, args) = parser.parse_args() if not Constants.AGENT_WORK_ROOT in os.environ and not 'PWD' in os.environ: parser.error("AGENT_WORK_ROOT environment variable or PWD must be set.") if Constants.AGENT_WORK_ROOT in os.environ: options.root_folder = os.environ[Constants.AGENT_WORK_ROOT] else: # some launch environments do not end up setting all environment variables options.root_folder = os.environ['PWD'] if not 'AGENT_LOG_ROOT' in os.environ: parser.error("AGENT_LOG_ROOT environment variable must be set.") options.log_folder = os.environ['AGENT_LOG_ROOT'] all_log_folders = [x.strip() for x in options.log_folder.split(',')] if len(all_log_folders) > 1: options.log_folder = all_log_folders[0] # If there are multiple log folder, separate by comma, pick one if not options.label: parser.error("label is required."); if not IS_WINDOWS: bind_signal_handlers() # Check for configuration file. agentConfig = AgentConfig(options.root_folder, options.log_folder, options.label) update_config_from_file(agentConfig) # update configurations if needed if options.zk_quorum: agentConfig.set(AgentConfig.SERVER_SECTION, Constants.ZK_QUORUM, options.zk_quorum) if options.zk_reg_path: agentConfig.set(AgentConfig.SERVER_SECTION, Constants.ZK_REG_PATH, options.zk_reg_path) if options.debug: agentConfig.set(AgentConfig.AGENT_SECTION, AgentConfig.APP_DBG_CMD, options.debug) logFile = posixpath.join(agentConfig.getResolvedPath(AgentConfig.LOG_DIR), logFileName) setup_logging(options.verbose, logFile) update_log_level(agentConfig, logFile) secDir = posixpath.join(agentConfig.getResolvedPath(AgentConfig.RUN_DIR), "security") logger.info("Security/Keys directory: " + secDir) agentConfig.set(AgentConfig.SECURITY_SECTION, "keysdir", secDir) perform_prestart_checks(agentConfig) ensure_folder_layout(agentConfig) # create security dir if necessary ensure_path_exists(secDir) write_pid() logger.info("Using AGENT_WORK_ROOT = " + options.root_folder) logger.info("Using AGENT_LOG_ROOT = " + options.log_folder) if len(all_log_folders) > 1: logger.info("Selected log folder from available: " + ",".join(all_log_folders)) # Extract the AM hostname and secured port from ZK registry zk_lookup_tries = 0 while zk_lookup_tries < Constants.MAX_AM_CONNECT_RETRIES: registry = Registry(options.zk_quorum, options.zk_reg_path) amHost, amUnsecuredPort, amSecuredPort = registry.readAMHostPort() tryConnect = True if not amHost or not amSecuredPort or not amUnsecuredPort: logger.info("Unable to extract AM host details from ZK, retrying ...") tryConnect = False time.sleep(NetUtil.CONNECT_SERVER_RETRY_INTERVAL_SEC) if tryConnect: if amHost: agentConfig.set(AgentConfig.SERVER_SECTION, "hostname", amHost) if amSecuredPort: agentConfig.set(AgentConfig.SERVER_SECTION, "secured_port", amSecuredPort) if amUnsecuredPort: agentConfig.set(AgentConfig.SERVER_SECTION, "port", amUnsecuredPort) server_url = SERVER_STATUS_URL.format( agentConfig.get(AgentConfig.SERVER_SECTION, 'hostname'), agentConfig.get(AgentConfig.SERVER_SECTION, 'port'), agentConfig.get(AgentConfig.SERVER_SECTION, 'check_path')) print("Connecting to the server at " + server_url + "...") logger.info('Connecting to the server at: ' + server_url) # Wait until server is reachable and continue to query ZK netutil = NetUtil() retries = netutil.try_to_connect(server_url, 3, logger) if retries < 3: break; pass pass zk_lookup_tries += 1 pass # Launch Controller communication global controller controller = Controller(agentConfig) controller.start() try: while controller.is_alive(): controller.join(timeout=1.0) except (KeyboardInterrupt, SystemExit): logger.info("... agent interrupted") pass