#!/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" || { echo -e "${RED}错误: 无法创建日志目录 $INSTALL_DIR/logs${NC}" exit 1 } chmod 755 "$INSTALL_DIR/logs" || { echo -e "${RED}错误: 无法设置日志目录权限${NC}" exit 1 } # 4. 初始化配置文件 echo "[4/5] 初始化配置文件..." if [ ! -f "$INSTALL_DIR/config/managerd.json" ]; then cat > "$INSTALL_DIR/config/managerd.json" << 'EOF' { "listen": "0.0.0.0: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 "" echo -e "${YELLOW}防火墙配置:${NC}" echo " 默认监听 0.0.0.0:18080,如需外部访问,请开放防火墙端口:" echo " sudo ufw allow 18080/tcp # HTTP API 端口" echo " sudo ufw allow 35688/udp # UDP 设备发现端口" echo " sudo ufw reload" } # 启动服务 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 # 创建日志目录 if [ ! -d "$LOG_DIR" ]; then mkdir -p "$LOG_DIR" 2>/dev/null || { echo -e "${RED}错误: 无法创建日志目录: $LOG_DIR${NC}" echo "请检查权限或手动创建: sudo mkdir -p $LOG_DIR" exit 1 } fi # 检查日志目录是否可写 if [ ! -w "$LOG_DIR" ]; then echo -e "${RED}错误: 日志目录不可写: $LOG_DIR${NC}" echo "请修复权限: sudo chmod 755 $LOG_DIR" exit 1 fi # 检查是否已在运行 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_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}" echo "" echo "可能的错误原因:" echo " 1. 端口 18080 被占用" echo " 2. 配置文件格式错误" echo " 3. 权限不足" echo "" echo "尝试直接运行查看详细错误:" echo " sudo $BIN_PATH $CONFIG_PATH" echo "" echo "或检查日志:" if [ -f "$LOG_DIR/$APP_NAME.log" ]; then echo " tail -20 $LOG_DIR/$APP_NAME.log" fi 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 "$@"