810 lines
24 KiB
Bash
Executable File
810 lines
24 KiB
Bash
Executable File
#!/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 "$@"
|