From 7e6e00f17ee030e8ee20f29b417ee41bc938fafc Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Wed, 25 Feb 2026 16:20:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/deploy/3588admin | 809 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 809 insertions(+) create mode 100755 scripts/deploy/3588admin diff --git a/scripts/deploy/3588admin b/scripts/deploy/3588admin new file mode 100755 index 0000000..54d3888 --- /dev/null +++ b/scripts/deploy/3588admin @@ -0,0 +1,809 @@ +#!/bin/bash +# 3588AdminBackend 统一管理脚本 +# 提供安装、状态、升级、卸载等功能 + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# 配置 +APP_NAME="managerd" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +DEFAULT_INSTALL_DIR="/opt/3588admin" +INSTALL_DIR="${DEFAULT_INSTALL_DIR}" +PID_FILE="$INSTALL_DIR/$APP_NAME.pid" + +# 显示帮助 +cmd_help() { + cat << EOF +3588AdminBackend 管理脚本 + +用法: $0 <命令> [选项] + +命令: + install [目录] 安装服务 (默认: /opt/3588admin) + status 查看服务状态 + start 启动服务 + stop 停止服务 + restart 重启服务 + upgrade [目录] 升级服务 (保留配置) + uninstall [目录] 卸载服务 (自动备份配置) + check 检查环境是否满足运行要求 + help 显示此帮助信息 + +示例: + $0 install # 安装到默认目录 + $0 install /usr/local/3588 # 安装到指定目录 + $0 status # 查看服务状态 + $0 upgrade # 升级到当前目录下的新版本 + $0 uninstall # 卸载并备份配置 + $0 check # 检查系统环境 + +快捷命令 (安装后可用): + 3588admin-start 启动服务 + 3588admin-stop 停止服务 + 3588admin-status 查看状态 +EOF +} + +# 检查 root 权限 +check_root() { + if [ "$EUID" -ne 0 ]; then + echo -e "${RED}错误: 请使用 sudo 运行此命令${NC}" + exit 1 + fi +} + +# 获取安装目录 +get_install_dir() { + if [ -n "$1" ]; then + INSTALL_DIR="$1" + fi + PID_FILE="$INSTALL_DIR/$APP_NAME.pid" +} + +# 环境检查 +cmd_check() { + echo "========== 3588AdminBackend 环境检查 ==========" + echo "" + + PASS=0 + FAIL=0 + WARN=0 + + check_pass() { + echo -e "${GREEN}✓${NC} $1" + ((PASS++)) + } + + check_fail() { + echo -e "${RED}✗${NC} $1" + ((FAIL++)) + } + + check_warn() { + echo -e "${YELLOW}⚠${NC} $1" + ((WARN++)) + } + + # 1. 检查操作系统 + echo "[系统信息]" + echo " 主机名: $(hostname)" + if [ -f /etc/os-release ]; then + . /etc/os-release + echo " 操作系统: $NAME $VERSION" + if [[ "$NAME" == *"Ubuntu"* ]] && [[ "$VERSION_ID" == "22.04" ]]; then + check_pass "Ubuntu 22.04 detected" + else + check_warn "非 Ubuntu 22.04,可能兼容但未经测试" + fi + else + check_warn "无法检测操作系统版本" + fi + + # 2. 检查架构 + echo "" + echo "[硬件信息]" + ARCH=$(uname -m) + echo " 架构: $ARCH" + if [ "$ARCH" = "x86_64" ]; then + check_pass "x86_64 架构" + elif [ "$ARCH" = "aarch64" ]; then + check_warn "ARM64 架构,请使用 ARM64 版本二进制" + else + check_warn "未知架构: $ARCH" + fi + + echo " CPU: $(nproc) 核" + echo " 内存: $(free -h | awk '/^Mem:/ {print $2}')" + + # 3. 检查网络工具 + echo "" + echo "[网络工具]" + if command -v curl >/dev/null 2>&1; then + check_pass "curl 已安装" + else + check_warn "curl 未安装" + fi + + if command -v netstat >/dev/null 2>&1 || command -v ss >/dev/null 2>&1; then + check_pass "网络工具(netstat/ss)已安装" + else + check_warn "建议安装 net-tools 或 iproute2" + fi + + # 4. 检查端口占用 + echo "" + echo "[端口检查]" + PORT_18080=false + PORT_35688=false + + if command -v ss >/dev/null 2>&1; then + PORT_18080=$(ss -tln 2>/dev/null | grep -q ':18080 ' && echo true || echo false) + PORT_35688=$(ss -uln 2>/dev/null | grep -q ':35688 ' && echo true || echo false) + elif command -v netstat >/dev/null 2>&1; then + PORT_18080=$(netstat -tln 2>/dev/null | grep -q ':18080 ' && echo true || echo false) + PORT_35688=$(netstat -uln 2>/dev/null | grep -q ':35688 ' && echo true || echo false) + fi + + if [ "$PORT_18080" = true ]; then + check_warn "端口 18080 已被占用" + else + check_pass "端口 18080 可用" + fi + + if [ "$PORT_35688" = true ]; then + check_warn "端口 35688 已被占用" + else + check_pass "端口 35688 可用" + fi + + # 5. 检查防火墙 + echo "" + echo "[防火墙]" + if command -v ufw >/dev/null 2>&1; then + UFW_STATUS=$(ufw status 2>/dev/null | grep -i status | awk '{print $2}') + echo " UFW 状态: $UFW_STATUS" + elif command -v firewall-cmd >/dev/null 2>&1; then + check_warn "检测到 firewalld,请手动配置端口" + else + echo " 未检测到防火墙" + fi + + # 6. 检查磁盘空间 + echo "" + echo "[磁盘空间]" + DISK_AVAIL=$(df -BG /opt 2>/dev/null | tail -1 | awk '{print $4}' | tr -d 'G') + if [ -z "$DISK_AVAIL" ]; then + DISK_AVAIL=$(df -BG / 2>/dev/null | tail -1 | awk '{print $4}' | tr -d 'G') + fi + + if [ -n "$DISK_AVAIL" ] && [ "$DISK_AVAIL" -ge 1 ]; then + check_pass "磁盘空间充足 (${DISK_AVAIL}G 可用)" + else + check_warn "磁盘空间不足 (${DISK_AVAIL:-0}G 可用,建议至少 1GB)" + fi + + # 7. 检查权限 + echo "" + echo "[权限检查]" + if [ "$EUID" -eq 0 ]; then + check_pass "当前为 root 用户" + else + check_warn "当前非 root 用户,安装需要 root 权限" + fi + + # 8. 检查 Python + echo "" + echo "[其他工具]" + if command -v python3 >/dev/null 2>&1; then + check_pass "Python3 已安装 ($(python3 --version))" + else + check_warn "Python3 未安装 (用于配置验证)" + fi + + # 总结 + echo "" + echo "========== 检查总结 ==========" + echo -e "通过: ${GREEN}$PASS${NC} 警告: ${YELLOW}$WARN${NC} 失败: ${RED}$FAIL${NC}" + echo "" + + if [ $FAIL -gt 0 ]; then + echo -e "${RED}环境检查未通过,请解决上述问题后再安装${NC}" + exit 1 + elif [ $WARN -gt 0 ]; then + echo -e "${YELLOW}环境基本满足,但有一些警告需要注意${NC}" + return 0 + else + echo -e "${GREEN}环境检查全部通过,可以安装${NC}" + return 0 + fi +} + +# 安装 +cmd_install() { + check_root + get_install_dir "$1" + + local CURRENT_DIR="$SCRIPT_DIR" + local BASE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + + echo "========== 3588AdminBackend 离线安装 ==========" + echo "安装目录: $INSTALL_DIR" + echo "" + + # 检查安装目录 + if [ -d "$INSTALL_DIR" ] && [ "$(ls -A $INSTALL_DIR 2>/dev/null)" ]; then + echo -e "${YELLOW}警告: 安装目录 $INSTALL_DIR 已存在且不为空${NC}" + read -p "是否覆盖? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "安装已取消" + exit 1 + fi + # 备份现有配置 + if [ -f "$INSTALL_DIR/config/managerd.json" ]; then + local BACKUP_FILE="$INSTALL_DIR/config/managerd.json.bak.$(date +%Y%m%d%H%M%S)" + echo "备份现有配置到: $BACKUP_FILE" + cp "$INSTALL_DIR/config/managerd.json" "$BACKUP_FILE" + fi + fi + + # 1. 安装依赖包 + if [ -d "$BASE_DIR/deps" ] && [ "$(ls -A $BASE_DIR/deps/*.deb 2>/dev/null)" ]; then + echo "[1/5] 安装依赖包..." + cd "$BASE_DIR/deps" + for pkg in *.deb; do + echo " 安装: $pkg" + dpkg -i "$pkg" 2>/dev/null || true + done + apt-get install -f -y 2>/dev/null || true + else + echo "[1/5] 跳过依赖包安装 (无依赖包)" + fi + + # 2. 创建安装目录 + echo "[2/5] 创建安装目录..." + mkdir -p "$INSTALL_DIR" + + echo " 复制二进制文件..." + mkdir -p "$INSTALL_DIR/bin" + cp "$BASE_DIR/bin/managerd" "$INSTALL_DIR/bin/" 2>/dev/null || { + echo -e "${RED}错误: 未找到 managerd 二进制文件${NC}" + echo "请确保在打包前已编译" + exit 1 + } + + echo " 复制配置文件..." + mkdir -p "$INSTALL_DIR/config" + if [ -f "$BASE_DIR/config/managerd.json" ]; then + cp "$BASE_DIR/config/managerd.json" "$INSTALL_DIR/config/" + elif [ -f "$BASE_DIR/config/managerd.json.example" ]; then + cp "$BASE_DIR/config/managerd.json.example" "$INSTALL_DIR/config/" + fi + + # 复制模板文件 + if [ -d "$BASE_DIR/templates" ]; then + echo " 复制模板文件..." + cp -r "$BASE_DIR/templates" "$INSTALL_DIR/" + fi + + # 3. 设置权限 + echo "[3/5] 设置权限..." + chmod +x "$INSTALL_DIR/bin/managerd" + mkdir -p "$INSTALL_DIR/logs" + chmod 755 "$INSTALL_DIR/logs" + + # 4. 初始化配置文件 + echo "[4/5] 初始化配置文件..." + if [ ! -f "$INSTALL_DIR/config/managerd.json" ]; then + cat > "$INSTALL_DIR/config/managerd.json" << 'EOF' +{ + "listen": "127.0.0.1:18080", + "discovery_port": 35688, + "discovery_timeout_ms": 1200, + "offline_after_ms": 10000, + "agent_token": "CHANGE_ME", + "concurrency": 5 +} +EOF + echo -e " ${GREEN}已创建默认配置文件${NC}" + echo -e " ${YELLOW}⚠️ 请编辑 $INSTALL_DIR/config/managerd.json 修改配置(特别是 agent_token)${NC}" + else + echo " 配置文件已存在,保留现有配置" + fi + + # 5. 复制管理脚本 + echo "[5/5] 安装管理脚本..." + mkdir -p "$INSTALL_DIR/scripts" + cp "$CURRENT_DIR/3588admin" "$INSTALL_DIR/scripts/" + chmod +x "$INSTALL_DIR/scripts/3588admin" + + # 创建快捷方式 + ln -sf "$INSTALL_DIR/scripts/3588admin" /usr/local/bin/3588admin-start 2>/dev/null || true + ln -sf "$INSTALL_DIR/scripts/3588admin" /usr/local/bin/3588admin-stop 2>/dev/null || true + ln -sf "$INSTALL_DIR/scripts/3588admin" /usr/local/bin/3588admin-status 2>/dev/null || true + ln -sf "$INSTALL_DIR/scripts/3588admin" /usr/local/bin/3588admin 2>/dev/null || true + + # 安装 Systemd 服务 + if [ -f "$CURRENT_DIR/3588admin.service" ]; then + echo "[可选] 安装 Systemd 服务..." + cp "$CURRENT_DIR/3588admin.service" /etc/systemd/system/ + sed -i "s|/opt/3588admin|$INSTALL_DIR|g" /etc/systemd/system/3588admin.service + systemctl daemon-reload + echo " 已安装 Systemd 服务" + fi + + echo "" + echo -e "${GREEN}========== 安装完成 ==========${NC}" + echo "安装目录: $INSTALL_DIR" + echo "" + echo "使用命令:" + echo " 3588admin start - 启动服务" + echo " 3588admin stop - 停止服务" + echo " 3588admin status - 查看状态" + echo " 3588admin restart - 重启服务" + echo " 3588admin upgrade - 升级服务" + echo " 3588admin uninstall - 卸载服务" + echo "" + echo -e "${YELLOW}重要提示:${NC}" + echo " 1. 请先编辑配置文件: $INSTALL_DIR/config/managerd.json" + echo " 2. 务必修改 agent_token 为安全的随机字符串" + echo " 3. 如需监听外部地址,修改 listen 配置项" + echo " 4. 确保防火墙开放 discovery_port (默认 35688/UDP)" +} + +# 启动服务 +cmd_start() { + get_install_dir "$1" + + local BIN_PATH="$INSTALL_DIR/bin/$APP_NAME" + local CONFIG_PATH="$INSTALL_DIR/config/managerd.json" + local LOG_DIR="$INSTALL_DIR/logs" + + echo "========== 启动 3588AdminBackend ==========" + echo "应用目录: $INSTALL_DIR" + echo "配置文件: $CONFIG_PATH" + echo "" + + # 检查二进制文件 + if [ ! -f "$BIN_PATH" ]; then + echo -e "${RED}错误: 未找到二进制文件: $BIN_PATH${NC}" + exit 1 + fi + + # 检查配置文件 + if [ ! -f "$CONFIG_PATH" ]; then + echo -e "${RED}错误: 配置文件不存在: $CONFIG_PATH${NC}" + exit 1 + fi + + # 验证 JSON 格式 + if command -v python3 &> /dev/null; then + if ! python3 -m json.tool "$CONFIG_PATH" > /dev/null 2>&1; then + echo -e "${RED}错误: 配置文件 JSON 格式不正确${NC}" + exit 1 + fi + fi + + # 创建日志目录 + mkdir -p "$LOG_DIR" + + # 检查是否已在运行 + if [ -f "$PID_FILE" ]; then + local PID=$(cat "$PID_FILE") + if ps -p "$PID" > /dev/null 2>&1; then + echo -e "${YELLOW}警告: $APP_NAME 已在运行 (PID: $PID)${NC}" + exit 1 + else + rm -f "$PID_FILE" + fi + fi + + # 启动服务 + echo "正在启动 $APP_NAME..." + nohup "$BIN_PATH" -config "$CONFIG_PATH" >> "$LOG_DIR/$APP_NAME.log" 2>&1 & + local PID=$! + echo $PID > "$PID_FILE" + + # 等待启动 + sleep 2 + if ps -p "$PID" > /dev/null 2>&1; then + echo "" + echo -e "${GREEN}✅ 启动成功!${NC}" + echo " PID: $PID" + echo " 日志: $LOG_DIR/$APP_NAME.log" + echo "" + echo "查看日志: tail -f $LOG_DIR/$APP_NAME.log" + else + echo "" + echo -e "${RED}❌ 启动失败${NC}" + rm -f "$PID_FILE" + exit 1 + fi +} + +# 停止服务 +cmd_stop() { + get_install_dir "$1" + + echo "========== 停止 3588AdminBackend ==========" + + if [ -f "$PID_FILE" ]; then + local PID=$(cat "$PID_FILE") + if ps -p "$PID" > /dev/null 2>&1; then + echo "正在停止 $APP_NAME (PID: $PID)..." + kill "$PID" + + echo -n "等待进程结束" + for i in {1..10}; do + if ! ps -p "$PID" > /dev/null 2>&1; then + echo "" + echo -e "${GREEN}✅ 已停止${NC}" + rm -f "$PID_FILE" + return 0 + fi + echo -n "." + sleep 1 + done + echo "" + + echo "强制结束进程..." + kill -9 "$PID" 2>/dev/null || true + rm -f "$PID_FILE" + echo -e "${GREEN}✅ 已强制停止${NC}" + else + echo -e "${YELLOW}ℹ️ 进程不存在 (PID: $PID)${NC}" + rm -f "$PID_FILE" + fi + else + # 尝试查找进程 + local PID=$(pgrep -f "^$INSTALL_DIR/bin/$APP_NAME" | head -1) + if [ -n "$PID" ]; then + echo "发现运行中的进程 (PID: $PID),尝试停止..." + kill "$PID" 2>/dev/null || true + sleep 2 + if ! ps -p "$PID" > /dev/null 2>&1; then + echo -e "${GREEN}✅ 已停止${NC}" + else + kill -9 "$PID" 2>/dev/null || true + echo -e "${GREEN}✅ 已强制停止${NC}" + fi + else + echo -e "${YELLOW}ℹ️ $APP_NAME 未在运行${NC}" + fi + fi +} + +# 重启服务 +cmd_restart() { + cmd_stop "$@" + sleep 1 + cmd_start "$@" +} + +# 查看状态 +cmd_status() { + get_install_dir "$1" + + local BIN_PATH="$INSTALL_DIR/bin/$APP_NAME" + local CONFIG_PATH="$INSTALL_DIR/config/managerd.json" + local LOG_DIR="$INSTALL_DIR/logs" + + echo "========== 3588AdminBackend 状态 ==========" + echo "" + echo "基本信息:" + echo " 应用目录: $INSTALL_DIR" + echo " 二进制文件: $BIN_PATH" + echo " 配置文件: $CONFIG_PATH" + echo " 日志目录: $LOG_DIR" + + # 检查二进制文件 + if [ -f "$BIN_PATH" ]; then + echo -e " 二进制状态: ${GREEN}✅ 存在${NC}" + else + echo -e " 二进制状态: ${RED}❌ 不存在${NC}" + fi + + # 检查配置文件 + if [ -f "$CONFIG_PATH" ]; then + echo -e " 配置文件: ${GREEN}✅ 存在${NC}" + if command -v python3 &> /dev/null; then + local LISTEN=$(python3 -c "import json; print(json.load(open('$CONFIG_PATH')).get('listen', 'N/A'))" 2>/dev/null) + local DISCOVERY_PORT=$(python3 -c "import json; print(json.load(open('$CONFIG_PATH')).get('discovery_port', 'N/A'))" 2>/dev/null) + echo " 监听地址: $LISTEN" + echo " 发现端口: $DISCOVERY_PORT (UDP)" + fi + else + echo -e " 配置文件: ${RED}❌ 不存在${NC}" + fi + + echo "" + echo "运行状态:" + + # 检查进程 + if [ -f "$PID_FILE" ]; then + local PID=$(cat "$PID_FILE") + if ps -p "$PID" > /dev/null 2>&1; then + echo -e " 进程状态: ${GREEN}🟢 运行中${NC}" + echo " PID: $PID" + + if command -v ps &> /dev/null; then + echo "" + echo "进程详情:" + ps -p "$PID" -o pid,pcpu,pmem,cmd --no-headers 2>/dev/null | while read line; do + echo " $line" + done + fi + + echo "" + echo "网络监听:" + if command -v ss &> /dev/null; then + ss -tlnp 2>/dev/null | grep "$PID" | head -3 | while read line; do + echo " $line" + done + elif command -v netstat &> /dev/null; then + netstat -tlnp 2>/dev/null | grep "$PID/" | head -3 | while read line; do + echo " $line" + done + fi + + # API 测试 + if command -v curl &> /dev/null; then + echo "" + echo "API 测试:" + local HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:18080/api/devices" 2>/dev/null || echo "000") + if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "401" ]; then + echo -e " ${GREEN}✅ HTTP API 响应正常 (HTTP $HTTP_CODE)${NC}" + elif [ "$HTTP_CODE" = "000" ]; then + echo -e " ${YELLOW}⚠️ 无法连接 HTTP API${NC}" + else + echo " ℹ️ HTTP API 响应: $HTTP_CODE" + fi + fi + else + echo -e " 进程状态: ${RED}🔴 未运行 (PID 文件存在但进程不存在)${NC}" + fi + else + local PID=$(pgrep -f "^$BIN_PATH" | head -1) + if [ -n "$PID" ]; then + echo -e " 进程状态: ${YELLOW}🟡 运行中 (无 PID 文件,PID: $PID)${NC}" + else + echo -e " 进程状态: ${BLUE}⚫ 未运行${NC}" + fi + fi + + # 日志信息 + echo "" + echo "日志信息:" + if [ -d "$LOG_DIR" ]; then + local NEWEST_LOG=$(ls -t "$LOG_DIR"/*.log 2>/dev/null | head -1) + if [ -n "$NEWEST_LOG" ]; then + echo " 最新日志 ($NEWEST_LOG):" + tail -n 3 "$NEWEST_LOG" | while read line; do + echo " $line" + done + else + echo " 无日志文件" + fi + else + echo " 日志目录不存在" + fi +} + +# 升级服务 +cmd_upgrade() { + check_root + get_install_dir "$1" + + local SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + local BACKUP_DIR="/root/3588admin-backup-$(date +%Y%m%d%H%M%S)" + + echo "========== 3588AdminBackend 升级 ==========" + echo "安装目录: $INSTALL_DIR" + echo "备份目录: $BACKUP_DIR" + echo "" + + # 检查安装目录是否存在 + if [ ! -d "$INSTALL_DIR" ]; then + echo -e "${RED}错误: 安装目录不存在: $INSTALL_DIR${NC}" + echo "请先运行安装命令" + exit 1 + fi + + # 确认 + read -p "确定要升级 3588AdminBackend? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "升级已取消" + exit 0 + fi + + # 1. 停止服务 + echo "[1/5] 停止服务..." + cmd_stop "$@" 2>/dev/null || true + sleep 2 + + # 2. 备份 + echo "[2/5] 备份现有数据..." + mkdir -p "$BACKUP_DIR" + + if [ -f "$INSTALL_DIR/config/managerd.json" ]; then + cp "$INSTALL_DIR/config/managerd.json" "$BACKUP_DIR/" + echo " 已备份配置文件" + fi + + if [ -d "$INSTALL_DIR/logs" ]; then + cp -r "$INSTALL_DIR/logs" "$BACKUP_DIR/" + echo " 已备份日志文件" + fi + + if [ -f "$INSTALL_DIR/bin/managerd" ]; then + cp "$INSTALL_DIR/bin/managerd" "$BACKUP_DIR/managerd.old" + echo " 已备份旧版本二进制" + fi + + # 3. 更新二进制文件 + echo "[3/5] 更新二进制文件..." + local BASE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + if [ -f "$BASE_DIR/bin/managerd" ]; then + cp "$BASE_DIR/bin/managerd" "$INSTALL_DIR/bin/managerd" + chmod +x "$INSTALL_DIR/bin/managerd" + echo -e " ${GREEN}已更新二进制文件${NC}" + else + echo -e "${YELLOW}警告: 未找到新的二进制文件${NC}" + fi + + # 4. 更新脚本 + echo "[4/5] 更新脚本..." + cp "$SCRIPT_DIR/3588admin" "$INSTALL_DIR/scripts/" + chmod +x "$INSTALL_DIR/scripts/3588admin" + echo " 已更新管理脚本" + + # 5. 启动服务 + echo "[5/5] 启动服务..." + cmd_start "$@" + + echo "" + echo -e "${GREEN}========== 升级完成 ==========${NC}" + echo "备份位置: $BACKUP_DIR" +} + +# 卸载服务 +cmd_uninstall() { + check_root + get_install_dir "$1" + + echo "========== 3588AdminBackend 卸载 ==========" + echo "安装目录: $INSTALL_DIR" + echo "" + + # 确认 + read -p "确定要完全卸载 3588AdminBackend? 此操作不可恢复! (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "卸载已取消" + exit 0 + fi + + # 1. 停止服务 + echo "[1/4] 停止服务..." + cmd_stop "$@" 2>/dev/null || true + + # 停止 systemd 服务 + if systemctl is-active --quiet 3588admin 2>/dev/null; then + systemctl stop 3588admin + fi + if systemctl is-enabled --quiet 3588admin 2>/dev/null; then + systemctl disable 3588admin + fi + + # 2. 删除 systemd 服务文件 + echo "[2/4] 删除 Systemd 服务..." + if [ -f "/etc/systemd/system/3588admin.service" ]; then + rm -f "/etc/systemd/system/3588admin.service" + systemctl daemon-reload + echo " 已删除 systemd 服务" + fi + + # 3. 删除快捷方式 + echo "[3/4] 删除快捷方式..." + rm -f /usr/local/bin/3588admin-start + rm -f /usr/local/bin/3588admin-stop + rm -f /usr/local/bin/3588admin-status + rm -f /usr/local/bin/3588admin + echo " 已删除命令快捷方式" + + # 4. 备份并删除安装目录 + echo "[4/4] 删除安装文件..." + local BACKUP_DIR="" + if [ -d "$INSTALL_DIR" ]; then + if [ -f "$INSTALL_DIR/config/managerd.json" ]; then + BACKUP_DIR="/root/3588admin-backup-$(date +%Y%m%d%H%M%S)" + mkdir -p "$BACKUP_DIR" + cp "$INSTALL_DIR/config/managerd.json" "$BACKUP_DIR/" + echo " 配置已备份到: $BACKUP_DIR/" + fi + + rm -rf "$INSTALL_DIR" + echo " 已删除安装目录: $INSTALL_DIR" + fi + + echo "" + echo -e "${GREEN}========== 卸载完成 ==========${NC}" + if [ -n "$BACKUP_DIR" ]; then + echo "配置文件备份: $BACKUP_DIR/managerd.json" + fi +} + +# 主函数 +main() { + # 如果没有参数,显示帮助 + if [ $# -eq 0 ]; then + cmd_help + exit 0 + fi + + # 解析命令 + COMMAND="$1" + shift + + case "$COMMAND" in + install) + cmd_install "$@" + ;; + status) + cmd_status "$@" + ;; + start) + cmd_start "$@" + ;; + stop) + cmd_stop "$@" + ;; + restart) + cmd_restart "$@" + ;; + upgrade) + cmd_upgrade "$@" + ;; + uninstall) + cmd_uninstall "$@" + ;; + check) + cmd_check "$@" + ;; + help|--help|-h) + cmd_help + ;; + *) + # 兼容快捷方式调用 + # 如果是通过快捷方式调用,脚本名就是命令 + SCRIPT_NAME=$(basename "$0") + case "$SCRIPT_NAME" in + 3588admin-start) + cmd_start "$@" + ;; + 3588admin-stop) + cmd_stop "$@" + ;; + 3588admin-status) + cmd_status "$@" + ;; + *) + echo -e "${RED}错误: 未知命令 '$COMMAND'${NC}" + echo "" + cmd_help + exit 1 + ;; + esac + ;; + esac +} + +main "$@"