def main(): action, args_json = sys.argv[1:] args_dict = json.loads(args_json) log = common.Logger({"remote": log_remote_level}) if not os.path.exists(rollback_dir): os.makedirs(rollback_dir, exist_ok=1) func_dict = { "code_update": code_update, "db_update": db_update, "code_backup": code_backup, "db_backup": db_backup } sys.exit(func_dict[action](args_dict, log))
def main(): softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) log = common.Logger({"remote": log_remote_level}) flag = 0 # 安装 if action == "install": located = conf_dict.get("located") pkg_file = conf_dict["pkg_file"] value, msg = common.install(pkg_file, jdk_src, jdk_dst, jdk_pkg_dir, located) if not value: flag = 1 log.logger.error(msg) sys.exit(flag) # 配置 jdk_dir = f"{located}/{jdk_dst}" jdk_sh_context = f"""\ export JAVA_HOME={jdk_dir} export PATH=$JAVA_HOME/bin:$PATH """ config_dict = { "jdk_sh": { "config_file": "/etc/profile.d/jdk.sh", "config_context": jdk_sh_context, "mode": "w" } } log.logger.debug(f"写入配置文件: {json.dumps(config_dict)=}") result, msg = common.config(config_dict) if not result: log.logger.error(msg) flag = 1 sys.exit(flag) elif action == "run" or action == "start" or action == "stop": sys.exit(flag)
#return common.soft_monitor("localhost", port_list) return common.soft_monitor("localhost", [volume_port]) elif server_flag == 2: if os.path.ismount(mounted_dir): return activated_code else: return stopped_code if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict.get("located") glusterfs_dir = f"{located}/{glusterfs_dst}" log = common.Logger({"remote": log_remote_level}, loggger_name="glusterfs") glusterfs_info_dict = conf_dict[f"{softname}_info"] if softname == "glusterfs-server": server_flag = 1 # 软件标志: 1: server, 2: client, 3 all pkg_dir = glusterfs_all_pkg_dir glusterd_port = glusterfs_info_dict["port"].get("glusterd_port") volume_port = glusterfs_info_dict["port"].get("volume_port") port_list = [glusterd_port, volume_port] elif softname == "glusterfs-client": server_flag = 2 pkg_dir = glusterfs_client_pkg_dir mounted_host = glusterfs_info_dict.get("mounted_host") mounted_dir = glusterfs_info_dict.get("mounted_dir") if action == "install": sys.exit(install())
return_value = error_code return return_value def monitor(): """监控 return: 启动, 未启动, 启动但不正常 """ return common.soft_monitor("localhost", port_list) if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) log = common.Logger({"remote": log_remote_level}, loggger_name="dps") located = conf_dict["located"] if dps_dst is None: dps_dir = f"{located}/{dps_src}" else: dps_dir = f"{located}/{dps_dst}" dps_info_dict = conf_dict["dps_info"] vhosts_info_dict = dps_info_dict["vhosts_info"] port_list = [int(port) for port in vhosts_info_dict] if action == "install": sys.exit(install()) elif action == "run": sys.exit(run()) elif action == "start":
return normal_code def start(): """启动 """ return normal_code def stop(): """关闭 """ return normal_code def monitor(): """监控 """ return activated_code if __name__ == "__main__": softname, action, conf_json=sys.argv[1:] conf_dict=json.loads(conf_json) log=common.Logger({"remote": log_remote_level}, loggger_name="ffmpeg") func_dict={ "install": install, "run": run, "start": start, "stop": stop, "monitor": monitor, } sys.exit(func_dict[action]())
"""发送巡检信息 """ command = f"cd {autocheck_dir} ; {remote_python_exec} ./main.py sendmail" log.logger.debug(f"{command=}") result, msg = common.exec_command(command) if not result: log.logger.error(msg) return error_code return normal_code if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict["located"] log = common.Logger({"remote": log_remote_level}, loggger_name="autocheck") autocheck_dir = f"{located}/{autocheck_dst}" autocheck_info_dict = conf_dict["autocheck_info"] if action == "install": sys.exit(install()) elif action == "run": sys.exit(run()) elif action == "start": status_value = monitor() if status_value == activated_code: sys.exit(activated_code) elif status_value == stopped_code: sys.exit(start()) elif status_value == abnormal_code:
"""备份 """ backup_version = conf_dict["backup_version"] result, msg = common.tar_backup(backup_version, backup_dir, softname, frontend_dir, []) if result: return normal_code else: log.logger.error(msg) return error_code if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) log = common.Logger({"remote": log_remote_level}, loggger_name="frontend") frontend_dir = conf_dict[f"{softname}_info"]["frontend_dir"] if action == "install": sys.exit(install()) elif action == "run": sys.exit(run()) elif action == "start": status_value = monitor() if status_value == activated_code: sys.exit(activated_code) elif status_value == stopped_code: sys.exit(start()) elif status_value == abnormal_code: if stop() == normal_code: sys.exit(start())
return normal_code def monitor(): """监控 return: 启动, 未启动, 启动但不正常 """ return common.soft_monitor("localhost", port_list) if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) log = common.Logger({"remote": log_remote_level}, loggger_name=softname) localization_info_dict = conf_dict.get(f"{softname}_info") db_port = localization_info_dict["db_port"] port_list = [db_port] sql_file = test_sql_file % softname if softname == "dameng": system_user = localization_info_dict["system_user"] dba_user = localization_info_dict["dba_user"] dba_password = localization_info_dict["dba_password"] db_port = localization_info_dict["db_port"] start_command = localization_info_dict["start_command"] stop_command = localization_info_dict["stop_command"] if action == "test": sys.exit(test()) if action == "install":
return normal_code def start(): """启动 """ return normal_code def stop(): """关闭 """ return normal_code def monitor(): """监控 """ return normal_code if __name__ == "__main__": softname, action, conf_json=sys.argv[1:] conf_dict=json.loads(conf_json) log=common.Logger({"remote": log_remote_level}) func_dict={ "install": install, "run": run, "start": start, "stop": stop, "monitor": monitor, } sys.exit(func_dict[action]())
def main(): parser=argparse.ArgumentParser() parser.add_argument("--mode", type=str, choices=["console", "platform"], help="更新方式") parser.add_argument("--type", type=str, choices=["mysql"], help="数据库类型") parser.add_argument("--id", type=str, help="项目id") parser.add_argument("--sql", type=str, help="数据库更新文件, 以'tar.gz'或'sql'结尾, 须绝对路径") parser.add_argument("--host", type=str, help="更新主机. <host1>:<port>") parser.add_argument("--user", type=str, help="数据库用户") parser.add_argument("--password", type=str, help="数据库密码") parser.add_argument("--db", type=str, help="库名") args=parser.parse_args() mode_level_dict={ # 定义日志级别 "file": log_update_level } if args.mode.lower()=="console": mode_level_dict["console"]=log_console_level update_mode="file" update_stats_addr=db_update_stats_file elif args.mode.lower()=="platform": mode_level_dict["platform"]=log_platform_level update_mode="platform" update_stats_addr="平台" project_id=args.id log=common.Logger(mode_level_dict, log_file=log_update_file, project_id=project_id) db_type=args.type user=args.user password=args.password db_name=args.db try: sql_package=args.sql.strip() if not sql_package.startswith("/"): log.logger.error("更新包必须为绝对路径") sys.exit(1) hostname_and_port=args.host.split(":") host=hostname_and_port[0] try: port=int(hostname_and_port[1]) except IndexError: port=3306 except Exception as e: log.logger.error(f"参数解析错误. {str(e)}") sys.exit(1) update_stats_dict={ "project_id": project_id, "mode": "db_update", "stats":{} } if sql_package.endswith("tar.gz"): try: with tarfile.open(sql_package, "r") as tar: log.logger.info(f"解压数据包...") log.logger.debug(remote_pkgs_dir) sql_file_name=tar.getmembers()[0].name tar.extractall(remote_pkgs_dir) sql_file=f"{remote_pkgs_dir}/{sql_file_name}" except Exception as e: log.logger.error(f"解压失败: {str(e)}") sys.exit(1) elif sql_package.endswith("sql"): sql_file=sql_package log.logger.info("开始更新:") db=DB(db_type, host, port, user, password, db_name) log.logger.info(f"'{host}'主机更新:") sql_list=[] try: log.logger.debug(f"读取数据文件{sql_file}") with open(sql_file, "rb") as f: log.logger.info(f"数据更新中...") for line in f: line=line.decode("utf8", "ignore").strip() if line=="" or line.startswith("--"): continue if line[-1]==";": if len(sql_list)==0: sql_statement=line else: sql_list.append(line) sql_statement=" ".join(sql_list) else: sql_list.append(line) continue #log.logger.debug(sql_statement) db.exec(sql_statement) sql_list=[] else: db.commit() flag=True log.logger.info(f"'{host}'更新完成\n") except Exception as e: flag=False log.logger.error(f"'{host}'更新失败: {e}") update_stats_dict["stats"][host]=flag log.logger.debug(f"更新信息: {json.dumps(update_stats_dict)}") result, message=common.post_info(update_mode, update_stats_dict, update_stats_addr) if result: log.logger.info(f"更新信息已生成至'{update_stats_addr}'") else: log.logger.error(f"更新信息生成失败: {message}")
"""关闭 """ return normal_code def monitor(): """监控 """ return activated_code if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict.get("located") log = common.Logger({"remote": log_remote_level}, loggger_name="backup") backup_tool_dir = f"{located}/{backup_tool_src}" backup_tool_config_dir = f"{backup_tool_dir}/config" backup_crontab_file = f"{backup_tool_config_dir}/crontab" backup_tool_info_dict = conf_dict[f"{softname}_info"] func_dict = { "install": install, "run": run, "start": start, "stop": stop, "monitor": monitor, } sys.exit(func_dict[action]())
def main(): softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict.get("located") log = common.Logger({"remote": log_remote_level}, loggger_name="tomcat") tomcat_dir = f"{located}/{tomcat_dst}" tomcat_info_dict = conf_dict["tomcat_info"] http_port = tomcat_info_dict["port"].get("http_port") shutdown_port = tomcat_info_dict["port"].get("shutdown_port") #ajp_port=tomcat_info_dict["port"].get("ajp_port") ajp_port = 8009 port_list = [http_port, shutdown_port] flag = 0 # 安装 if action == "install": pkg_file = conf_dict["pkg_file"] value, msg = common.install(pkg_file, tomcat_src, tomcat_dst, tomcat_pkg_dir, located) if not value: log.logger.error(msg) flag = 1 sys.exit(flag) # 配置 try: # 删除tomcat原有程序目录 log.logger.debug("删除默认程序") webapps_dir = f"{tomcat_dir}/webapps" for i in os.listdir(webapps_dir): shutil.rmtree(f"{webapps_dir}/{i}") except Exception as e: log.logger.error(str(e)) jvm_mem = tomcat_info_dict.get("jvm_mem") min_threads, max_threads = tomcat_info_dict.get("threads") max_connections = tomcat_info_dict.get("max_connections") tomcat_sh_context = f"""\ export CATALINA_HOME={tomcat_dir} export PATH=$CATALINA_HOME/bin:$PATH """ server_xml_context = f"""\ <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --> <Server port="{shutdown_port}" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> <Connector port="{http_port}" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="{max_threads}" minSpareThreads="{min_threads}" enableLookups="false" compression="on" compressionMinSize="2048" URIEncoding="utf-8" acceptCount="300" disableUploadTimeout="true" maxConnections="{max_connections}" connectionTimeout="20000" redirectPort="8443" /> <!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation. The default SSLImplementation will depend on the presence of the APR/native library and the useOpenSSL attribute of the AprLifecycleListener. Either JSSE or OpenSSL style configuration may be used regardless of the SSLImplementation selected. JSSE style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 This connector uses the APR/native implementation which always uses OpenSSL for TLS. Either JSSE or OpenSSL style configuration may be used. OpenSSL style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <!-- <Connector protocol="AJP/1.3" address="::1" port="{ajp_port}" redirectPort="8443" /> --> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server> """ setevn_sh_context = f"""\ #!/bin/bash # sky JAVA_OPTS="-server -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true" JAVA_OPTS="$JAVA_OPTS -Xms{jvm_mem} -Xmx{jvm_mem} -Xss512k -XX:LargePageSizeInBytes=128M -XX:MaxTenuringThreshold=11 -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=256m -XX:MaxNewSize=256m" UMASK=0022 CATALINA_PID=$CATALINA_HOME/bin/catalina.pid """ config_dict = { "server_xml": { "config_file": f"{tomcat_dir}/conf/server.xml", "config_context": server_xml_context, "mode": "w" }, "setenv_sh": { "config_file": f"{tomcat_dir}/bin/setenv.sh", "config_context": setevn_sh_context, "mode": "w" }, "tomcat_sh": { "config_file": f"/etc/profile.d/tomcat.sh", "config_context": tomcat_sh_context, "mode": "w" } } log.logger.debug(f"写入配置文件: {json.dumps(config_dict)=}") result, msg = common.config(config_dict) if result: command = f"{tomcat_dir}/bin/catalina.sh configtest" log.logger.debug(f"配置文件检测: {command=}") status, result = common.exec_command(command) # 返回值32512为apr未安装报错, 忽略 if status: if result.returncode != 0 and result.returncode != 32512: log.logger.error(result.stderr) flag = 1 else: log.logger.error(msg) flag = 1 else: log.logger.error(msg) flag = 1 sys.exit(flag) elif action == "run": command = f"set -m ; {tomcat_dir}/bin/catalina.sh start" log.logger.debug(f"{command=}") status, result = common.exec_command(command) if status: if result.returncode != 0: log.logger.error(result.stderr) flag = 1 else: log.logger.debug(f"检测端口: {port_list=}") if not common.port_exist(port_list): flag = 2 else: log.logger.error(result) flag = 1 sys.exit(flag) elif action == "start": pass elif action == "stop": pass
elif action == "stop": pass def install(): """安装 """ pass if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict.get("located") log = common.Logger({"remote": log_remote_level}, loggger_name="tomcat") tomcat_dir = f"{located}/{tomcat_dst}" tomcat_info_dict = conf_dict["tomcat_info"] http_port = tomcat_info_dict["port"].get("http_port") shutdown_port = tomcat_info_dict["port"].get("shutdown_port") #ajp_port=tomcat_info_dict["port"].get("ajp_port") ajp_port = 8009 port_list = [http_port, shutdown_port] if action == "install": sys.exit(install()) elif action == "run": sys.exit(run()) elif action == "start": status_value = monitor() if status_value == activated_code:
def main(): parser = argparse.ArgumentParser() parser.add_argument("--mode", type=str, choices=["console", "platform"], help="更新方式") parser.add_argument("--id", type=str, help="项目id") parser.add_argument("--package", type=str, help="更新包. 压缩格式为tar.gz且必须为绝对路径") parser.add_argument("--host", type=str, help="更新主机. <host1>:<port>,<host2>:<port>") parser.add_argument("--dest", type=str, help="更新地址. /path") parser.add_argument("--version", type=str, help="版本") args = parser.parse_args() project_id = args.id version = args.version mode_level_dict = { # 定义日志级别 "file": log_update_level } if args.mode.lower() == "console": mode_level_dict["console"] = log_console_level update_mode = "file" update_stats_addr = code_update_stats_file elif args.mode.lower() == "platform": mode_level_dict["platform"] = log_platform_level update_mode = "platform" update_stats_addr = "平台" log = common.Logger(mode_level_dict, log_file=log_update_file, project_id=project_id) try: package = args.package.strip() if not package.startswith("/"): log.logger.error("更新包必须为绝对路径") sys.exit(1) package_all_name = package.split("/")[-1] dest = args.dest host_list = [] for host_str in args.host.split(","): host_port = host_str.split(":") host = host_port[0] try: port = int(host_port[1]) except IndexError: port = 22 host_list.append((host, port)) except Exception as e: log.logger.error(f"参数解析错误. {str(e)}") sys.exit(1) update_stats_dict = { "project_id": project_id, "mode": "code_update", "version": version, "stats": {} } log.logger.info("开始更新:") for node in host_list: host = node[0] port = node[1] log.logger.info(f"'{host}'主机更新:") ssh = remote.ssh() remote_update_package = f"{remote_pkgs_dir}/{package_all_name}" update_py_file = "update.py" remote_update_py = f"{remote_code_dir}/{update_py_file}" try: log.logger.info(f"传输更新包...") log.logger.debug(f"{package} --> {host}:{remote_update_package}") ssh.scp(host, port, "root", package, remote_update_package) ssh.scp(host, port, "root", f"./bin/{update_py_file}", remote_update_py) if test_mode: ssh.scp(host, port, "root", f"./libs/common.py", f"{remote_code_dir}/libs/common.py") ssh.scp(host, port, "root", f"./libs/env.py", f"{remote_code_dir}/libs/env.py") except Exception as e: log.logger.error(f"主机'{host}:{port}'连接有误: {str(e)}") sys.exit(1) args_dict = { "tar_file": remote_update_package, "dest_dir": dest, "version": version } update_command = f"{remote_python_exec} {remote_code_dir}/{update_py_file} '{json.dumps(args_dict)}'" log.logger.debug(f"{update_command}") status = ssh.exec(host, port, update_command) for line in status[1]: log.logger.info(line.strip()) if status[1].channel.recv_exit_status() == 0: log.logger.info(f"{host}更新完成\n") flag = True else: log.logger.error(f"{host}更新失败\n") flag = False update_stats_dict["stats"][host] = flag log.logger.debug(f"更新信息: {json.dumps(update_stats_dict)}") result, message = common.post_info(update_mode, update_stats_dict, update_stats_addr) if result: log.logger.info(f"更新信息已生成至'{update_stats_addr}'") else: log.logger.error(f"更新信息生成失败: {message}")
def monitor(): """监控 return: 启动, 未启动, 启动但不正常 """ return common.soft_monitor("localhost", port_list) if __name__ == "__main__": softname, action, conf_json = sys.argv[1:] conf_dict = json.loads(conf_json) located = conf_dict.get("located") rocketmq_dir = f"{located}/{rocketmq_dst}" rocketmq_info_dict = conf_dict["rocketmq_info"] log = common.Logger({"remote": log_remote_level}, loggger_name="rocketmq") namesrv_port = rocketmq_info_dict["port"].get("namesrv_port") fast_remote_port = rocketmq_info_dict["port"].get("fast_remote_port") remote_port = rocketmq_info_dict["port"].get("remote_port") ha_port = rocketmq_info_dict["port"].get("ha_port") namesrv_port_list = [namesrv_port] broker_port_list = [fast_remote_port, remote_port, ha_port] port_list = namesrv_port_list + broker_port_list if action == "install": sys.exit(install()) elif action == "run": sys.exit(run()) elif action == "start": status_value = monitor()