コード例 #1
0
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))
コード例 #2
0
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)
コード例 #3
0
ファイル: glusterfs.py プロジェクト: xhsky/autodep
        #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())
コード例 #4
0
        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":
コード例 #5
0
ファイル: ffmpeg.py プロジェクト: xhsky/autodep
    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]())
コード例 #6
0
ファイル: autocheck.py プロジェクト: xhsky/autodep
    """发送巡检信息
    """
    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:
コード例 #7
0
    """备份
    """
    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())
コード例 #8
0
ファイル: localization_db.py プロジェクト: xhsky/autodep
    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":
コード例 #9
0
ファイル: erlang.py プロジェクト: xhsky/autodep
    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]())
コード例 #10
0
ファイル: db_update.py プロジェクト: xhsky/autodep
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}")
コード例 #11
0
    """关闭
    """
    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]())
コード例 #12
0
ファイル: tomcat.py プロジェクト: xhsky/autodep
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 &quot;%r&quot; %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
コード例 #13
0
ファイル: tomcat.py プロジェクト: xhsky/autodep
    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:
コード例 #14
0
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}")
コード例 #15
0
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()