File size: 5,295 Bytes
08c964e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import sys
import os
import shutil
import traceback
from typing import Optional

if "/www/server/panel/class" not in sys.path:
    sys.path.insert(0, "/www/server/panel/class")

import public
from firewallModel.comModel import main as fire_main
if "/www/server/panel" not in sys.path:
    sys.path.insert(0, "/www/server/panel")

from mod.project.java.utils import TomCat

GLOBAL_TOMCAT_PATH = "/usr/local/bttomcat"
INDEP_PROJECT_TOMCAT_PATH = "/www/server/bt_tomcat_web"
PS_FILE_TMPL = "{tomcat_path}/ps.txt"


def open_firewall(prot: str):
    f_get = public.dict_obj()
    f_get.protocol = "tcp"
    f_get.port = prot
    f_get.choose = "all"
    f_get.types = "accept"
    f_get.brief = ""
    f_get.domain = ""
    f_get.chain = "INPUT"
    f_get.operation = "add"
    f_get.strategy = "accept"
    fire_main().set_port_rule(f_get)


# install_version 7 8 9 10
# install_type global or custom
def make(install_version: str,
         install_type: str,
         jdk_path: str,
         install_name: Optional[str],
         port:Optional[str],
         user:Optional[str],
         auto_start: bool = False,
         release_firewall: bool = False,
         ps: Optional[str] = None):
    if not os.path.exists(GLOBAL_TOMCAT_PATH + "/tomcat" + install_version):
        print("tomcat{}安装失败".format(install_version))
        return

    if install_type == "global":  # 全局安装不在做更多检查
        tomcat = TomCat(GLOBAL_TOMCAT_PATH + "/tomcat" + install_version)
        if port and port.isdigit() and int(port) > 0:
            tomcat.set_port(int(port))
            if release_firewall:
                print("正在执行放行防火墙端口...")
                open_firewall(port)
        tomcat.start()
        print("tomcat{}安装完成".format(install_version))
        return

    tomcat_path = GLOBAL_TOMCAT_PATH + "/tomcat_bak" + install_version
    if not install_name:
        print("tomcat {} 未指定安装名称".format(install_version))

    try:
        shutil.copytree(tomcat_path, INDEP_PROJECT_TOMCAT_PATH + "/" + install_name)
    except:
        print("tomcat {} 安装失败".format(install_version))
        traceback.print_exc()
        return

    ps_file = PS_FILE_TMPL.format(tomcat_path=INDEP_PROJECT_TOMCAT_PATH + "/" + install_name)
    if not os.path.exists(ps_file) or ps:
        with open(ps_file, "w") as f:
            f.write(ps or "")

    tomcat = TomCat(INDEP_PROJECT_TOMCAT_PATH + "/" + install_name)
    if port and port.isdigit() and int(port) > 0:
        tomcat.set_port(int(port))
        if release_firewall:
            print("正在执行放行防火墙端口...")
            open_firewall(port)

    print("正在执行替换JDK版本...")
    res = tomcat.replace_jdk(jdk_path)
    if res is not None:
        print("tomcat {} 安装失败: {}".format(install_version, res))
        return

    if user:
        res = tomcat.change_default_user(user)
        if res is False:
            print("tomcat {} 安装失败: 修改用户失败".format(install_version))
            return

    if auto_start:
        tomcat.set_service(user, auto_start)

    if not tomcat.save_config_xml():
        print("tomcat {} 安装失败: 配置文件保存失败".format(install_version))
        return

    tomcat.restart()
    print("安装完成")


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description="Tomcat 安装管理工具")

    # 必要位置参数
    parser.add_argument("install_version", type=str,
                        choices=["7", "8", "9", "10"],
                        help="Tomcat 版本号 (7/8/9/10)")
    parser.add_argument("install_type", type=str,
                        choices=["global", "custom"],
                        help="安装类型: global(全局) 或 custom(自定义)")

    # 可选参数
    parser.add_argument("--jdk-path", type=str,
                        help="指定JDK路径 (例如: /usr/lib/jvm/java-11-openjdk)")
    parser.add_argument("--name", type=str,
                        help="自定义安装名称(当install_type为custom时必填)")
    parser.add_argument("--port", type=int,
                        help="Tomcat 端口(需大于0)")
    parser.add_argument("--user", type=str,
                        help="指定运行用户")
    parser.add_argument("--auto-start", action="store_true",
                        help="安装后自动启动服务")
    parser.add_argument("--release-firewall", action="store_true",
                        help="自动放行防火墙端口")
    parser.add_argument("--ps", type=str,
                        help="指定ps文件内容")

    args = parser.parse_args()

    # 参数校验
    if args.install_type == "custom" and not args.name:
        parser.error("自定义安装时必须指定--name参数")
    if args.port and args.port <= 0:
        parser.error("端口必须大于0")

    # 调用安装函数
    make(
        install_version=args.install_version,
        install_type=args.install_type,
        jdk_path=args.jdk_path,
        install_name=args.name,
        port=str(args.port) if args.port else None,
        user=args.user,
        auto_start=args.auto_start,
        release_firewall=args.release_firewall,
        ps=args.ps
    )