864 lines
26 KiB
Bash
864 lines
26 KiB
Bash
#!/bin/bash
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 日志函数
|
||
log_info() {
|
||
echo -e "${BLUE}[INFO]${NC} $1"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
FTP_SERVER="${FTP_SERVER}"
|
||
FTP_USER="${FTP_USER}"
|
||
FTP_PASS="${FTP_PASS}"
|
||
FTP_PORT="${FTP_PORT:-21}"
|
||
BASE_URL="" # FTP基础URL (将在check_ftp_params中设置)
|
||
LATEST_VERSION_URL="" # 版本文件URL (将在check_ftp_params中设置)
|
||
TEMP_DIR="/tmp/argus-metric-install-$$"
|
||
|
||
# 安装目录配置
|
||
DEFAULT_INSTALL_DIR="/opt/argus-metric" # 默认安装目录
|
||
INSTALL_DIR="${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}" # 可通过环境变量覆盖
|
||
VERSIONS_DIR="$INSTALL_DIR/versions" # 版本目录
|
||
BACKUPS_DIR="$INSTALL_DIR/backups" # 备份目录
|
||
CURRENT_LINK="$INSTALL_DIR/current" # 当前版本软链接
|
||
LATEST_VERSION_FILE="$INSTALL_DIR/LATEST_VERSION" # 当前版本记录文件
|
||
|
||
# 检查必需的FTP参数
|
||
check_ftp_params() {
|
||
local missing_params=()
|
||
|
||
if [[ -z "$FTP_SERVER" ]]; then
|
||
missing_params+=("FTP_SERVER")
|
||
fi
|
||
|
||
if [[ -z "$FTP_USER" ]]; then
|
||
missing_params+=("FTP_USER")
|
||
fi
|
||
|
||
if [[ -z "$FTP_PASS" ]]; then
|
||
missing_params+=("FTP_PASS")
|
||
fi
|
||
|
||
if [[ ${#missing_params[@]} -gt 0 ]]; then
|
||
log_error "缺少必需的FTP参数: ${missing_params[*]}"
|
||
log_error "请通过以下方式之一设置FTP参数:"
|
||
log_error " 1. 命令行参数: --server <地址> --user <用户名> --password <密码>"
|
||
log_error " 2. 环境变量: FTP_SERVER=<地址> FTP_USER=<用户名> FTP_PASS=<密码>"
|
||
log_error ""
|
||
log_error "示例:"
|
||
log_error " sudo sh setup.sh --server 10.211.55.4 --user ftpuser --password admin1234"
|
||
log_error " FTP_SERVER=10.211.55.4 FTP_USER=ftpuser FTP_PASS=admin1234 sudo sh setup.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# 设置BASE_URL和LATEST_VERSION_URL
|
||
BASE_URL="ftp://${FTP_SERVER}:${FTP_PORT}"
|
||
LATEST_VERSION_URL="$BASE_URL/LATEST_VERSION"
|
||
|
||
log_info "FTP配置:"
|
||
log_info " 服务器: $FTP_SERVER:$FTP_PORT"
|
||
log_info " 用户: $FTP_USER"
|
||
}
|
||
|
||
# 获取最新版本号的函数
|
||
get_latest_version() {
|
||
log_info "获取最新版本信息..." >&2
|
||
log_info "尝试从URL获取: $LATEST_VERSION_URL" >&2
|
||
|
||
# 先测试FTP连接
|
||
log_info "测试FTP连接..." >&2
|
||
if ! curl -u "${FTP_USER}:${FTP_PASS}" -sfI "$LATEST_VERSION_URL" >/dev/null 2>&1; then
|
||
log_error "无法连接到FTP服务器或文件不存在" >&2
|
||
log_error "URL: $LATEST_VERSION_URL" >&2
|
||
log_error "请检查:" >&2
|
||
log_error " 1. FTP服务器是否运行: $FTP_SERVER:$FTP_PORT" >&2
|
||
log_error " 2. 用户名密码是否正确: $FTP_USER" >&2
|
||
log_error " 3. LATEST_VERSION文件是否存在" >&2
|
||
log_error "手动测试命令: curl -u ${FTP_USER}:${FTP_PASS} ftp://${FTP_SERVER}/LATEST_VERSION" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# 获取文件内容
|
||
if ! LATEST_VERSION=$(curl -u "${FTP_USER}:${FTP_PASS}" -sfL "$LATEST_VERSION_URL" 2>/dev/null | tr -d '[:space:]'); then
|
||
log_error "下载LATEST_VERSION文件失败" >&2
|
||
exit 1
|
||
fi
|
||
|
||
log_info "原始获取内容: '$LATEST_VERSION'" >&2
|
||
|
||
if [[ -z "$LATEST_VERSION" ]]; then
|
||
log_error "获取到的版本信息为空" >&2
|
||
log_error "可能的原因:" >&2
|
||
log_error " 1. LATEST_VERSION文件为空" >&2
|
||
log_error " 2. 文件内容格式不正确" >&2
|
||
log_error " 3. 网络传输问题" >&2
|
||
log_error "请检查FTP服务器上的 /srv/ftp/share/LATEST_VERSION 文件" >&2
|
||
exit 1
|
||
fi
|
||
|
||
log_info "检测到最新版本: $LATEST_VERSION" >&2
|
||
echo "$LATEST_VERSION"
|
||
}
|
||
|
||
# 解析参数
|
||
ARGUS_VERSION="" # 使用不同的变量名避免与系统VERSION冲突
|
||
ACTION="install"
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--version)
|
||
ARGUS_VERSION="$2"
|
||
shift 2
|
||
;;
|
||
--server)
|
||
FTP_SERVER="$2"
|
||
shift 2
|
||
;;
|
||
--user)
|
||
FTP_USER="$2"
|
||
shift 2
|
||
;;
|
||
--password)
|
||
FTP_PASS="$2"
|
||
shift 2
|
||
;;
|
||
--port)
|
||
FTP_PORT="$2"
|
||
shift 2
|
||
;;
|
||
--uninstall)
|
||
ACTION="uninstall"
|
||
shift
|
||
;;
|
||
--install-dir)
|
||
INSTALL_DIR="$2"
|
||
shift 2
|
||
;;
|
||
--rollback)
|
||
ACTION="rollback"
|
||
shift
|
||
;;
|
||
--backup-list)
|
||
ACTION="backup-list"
|
||
shift
|
||
;;
|
||
--status)
|
||
ACTION="status"
|
||
shift
|
||
;;
|
||
--help)
|
||
echo "Argus Metric FTP在线安装脚本"
|
||
echo
|
||
echo "用法: curl -u <用户名>:<密码> ftp://<服务器>/setup.sh -o setup.sh && sh setup.sh [选项]"
|
||
echo
|
||
echo "必需参数 (必须通过命令行参数或环境变量设置):"
|
||
echo " --server SERVER FTP服务器地址 (必须)"
|
||
echo " --user USER FTP用户名 (必须)"
|
||
echo " --password PASS FTP密码 (必须)"
|
||
echo
|
||
echo "可选参数:"
|
||
echo " --version VERSION 指定版本 (默认: 自动获取最新版本)"
|
||
echo " --port PORT FTP端口 (默认: 21)"
|
||
echo " --install-dir DIR 安装目录 (默认: /opt/argus-metric)"
|
||
echo " --uninstall 卸载 (自动确认)"
|
||
echo " --rollback 回滚到上一个备份版本"
|
||
echo " --backup-list 列出所有备份版本"
|
||
echo " --status 显示当前安装状态"
|
||
echo " --help 显示帮助"
|
||
echo
|
||
echo "环境变量:"
|
||
echo " FTP_SERVER FTP服务器地址 (必须)"
|
||
echo " FTP_USER FTP用户名 (必须)"
|
||
echo " FTP_PASS FTP密码 (必须)"
|
||
echo " FTP_PORT FTP端口 (默认: 21)"
|
||
echo
|
||
echo "示例:"
|
||
echo " # 方式1: 使用命令行参数"
|
||
echo " curl -u ftpuser:admin1234 ftp://10.211.55.4/setup.sh -o setup.sh"
|
||
echo " sudo sh setup.sh --server 10.211.55.4 --user ftpuser --password admin1234"
|
||
echo " "
|
||
echo " # 方式2: 使用环境变量"
|
||
echo " FTP_SERVER=10.211.55.4 FTP_USER=ftpuser FTP_PASS=admin1234 sudo sh setup.sh"
|
||
echo " "
|
||
echo " # 指定版本安装"
|
||
echo " sudo sh setup.sh --server 10.211.55.4 --user ftpuser --password admin1234 --version 1.30.0"
|
||
echo " "
|
||
echo " # 卸载"
|
||
echo " sudo sh setup.sh --server 10.211.55.4 --user ftpuser --password admin1234 --uninstall"
|
||
exit 0
|
||
;;
|
||
*)
|
||
log_error "未知参数: $1"
|
||
echo "使用 --help 查看帮助信息"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# 清理函数
|
||
cleanup() {
|
||
if [[ -d "$TEMP_DIR" ]]; then
|
||
rm -rf "$TEMP_DIR"
|
||
fi
|
||
}
|
||
|
||
trap cleanup EXIT
|
||
|
||
# 创建安装目录结构
|
||
create_install_directories() {
|
||
log_info "创建安装目录结构..."
|
||
|
||
# 创建主要目录
|
||
mkdir -p "$VERSIONS_DIR"
|
||
mkdir -p "$BACKUPS_DIR"
|
||
|
||
log_success "安装目录结构创建完成: $INSTALL_DIR"
|
||
}
|
||
|
||
# 获取当前安装的版本
|
||
get_current_version() {
|
||
# 优先从LATEST_VERSION文件读取
|
||
if [[ -f "$LATEST_VERSION_FILE" ]]; then
|
||
local version_from_file=$(cat "$LATEST_VERSION_FILE" 2>/dev/null | tr -d '[:space:]')
|
||
if [[ -n "$version_from_file" ]]; then
|
||
# 确保版本号格式一致(不带v前缀)
|
||
echo "$version_from_file"
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
# 如果文件不存在或为空,从软链接读取
|
||
if [[ -L "$CURRENT_LINK" ]]; then
|
||
local current_path=$(readlink "$CURRENT_LINK")
|
||
# 从版本目录名中提取版本号(现在不带v前缀)
|
||
basename "$current_path"
|
||
else
|
||
echo ""
|
||
fi
|
||
}
|
||
|
||
# 检查是否已安装
|
||
check_installed() {
|
||
if [[ -L "$CURRENT_LINK" ]] && [[ -d "$CURRENT_LINK" ]]; then
|
||
local current_version=$(get_current_version)
|
||
if [[ -n "$current_version" ]]; then
|
||
log_info "检测到已安装版本: v$current_version"
|
||
return 0
|
||
fi
|
||
fi
|
||
return 1
|
||
}
|
||
|
||
# 更新LATEST_VERSION文件
|
||
update_latest_version_file() {
|
||
local version="$1"
|
||
log_info "更新LATEST_VERSION文件: $version"
|
||
|
||
if echo "$version" > "$LATEST_VERSION_FILE"; then
|
||
log_success "LATEST_VERSION文件已更新"
|
||
else
|
||
log_error "更新LATEST_VERSION文件失败"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 备份当前版本
|
||
backup_current_version() {
|
||
local current_version=$(get_current_version)
|
||
if [[ -z "$current_version" ]]; then
|
||
log_info "没有当前版本需要备份"
|
||
return 0
|
||
fi
|
||
|
||
local backup_name="$current_version"
|
||
local backup_path="$BACKUPS_DIR/$backup_name"
|
||
|
||
log_info "备份当前版本 $current_version 到: $backup_path"
|
||
|
||
# 如果备份已存在,先删除
|
||
if [[ -d "$backup_path" ]]; then
|
||
log_info "备份版本已存在,覆盖: $backup_path"
|
||
rm -rf "$backup_path"
|
||
fi
|
||
|
||
# 复制当前版本目录
|
||
if cp -r "$CURRENT_LINK" "$backup_path"; then
|
||
log_success "版本备份完成: $backup_name"
|
||
|
||
# 清理旧备份,只保留最近3个
|
||
cleanup_old_backups
|
||
else
|
||
log_error "版本备份失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 清理旧备份
|
||
cleanup_old_backups() {
|
||
log_info "清理旧版本备份..."
|
||
|
||
# 获取备份目录列表,按时间排序,保留最近3个
|
||
local backup_count=$(ls -1 "$BACKUPS_DIR" 2>/dev/null | wc -l)
|
||
if [[ $backup_count -gt 3 ]]; then
|
||
local to_remove=$((backup_count - 3))
|
||
ls -1t "$BACKUPS_DIR" | tail -n $to_remove | while read backup; do
|
||
log_info "删除旧备份: $backup"
|
||
rm -rf "$BACKUPS_DIR/$backup"
|
||
done
|
||
fi
|
||
}
|
||
|
||
# 回滚到备份版本
|
||
rollback_to_backup() {
|
||
local backup_name="$1"
|
||
local backup_path="$BACKUPS_DIR/$backup_name"
|
||
|
||
if [[ ! -d "$backup_path" ]]; then
|
||
log_error "备份不存在: $backup_path"
|
||
return 1
|
||
fi
|
||
|
||
log_info "回滚到备份版本: $backup_name"
|
||
|
||
# 停止当前服务
|
||
stop_services
|
||
|
||
# 恢复软链接(备份目录应该包含版本内容)
|
||
if ln -sfn "$backup_path" "$CURRENT_LINK"; then
|
||
log_success "版本回滚完成: $backup_name"
|
||
|
||
# 启动服务
|
||
# start_services
|
||
return 0
|
||
else
|
||
log_error "版本回滚失败"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 停止服务
|
||
stop_services() {
|
||
log_info "停止当前服务..."
|
||
|
||
# 检查服务是否正在运行
|
||
if ! check_services_running; then
|
||
log_info "服务未运行,无需停止"
|
||
return 0
|
||
fi
|
||
|
||
# 尝试使用卸载脚本停止服务
|
||
if [[ -f "$CURRENT_LINK/uninstall.sh" ]]; then
|
||
cd "$CURRENT_LINK"
|
||
chmod +x uninstall.sh
|
||
|
||
# 自动确认停止服务(避免交互式确认)
|
||
echo "y" | ./uninstall.sh >/dev/null 2>&1
|
||
local stop_exit_code=$?
|
||
|
||
if [[ $stop_exit_code -eq 0 ]]; then
|
||
log_success "服务停止完成"
|
||
else
|
||
log_warning "停止服务时出现警告,尝试手动停止"
|
||
manual_stop_services
|
||
fi
|
||
else
|
||
log_warning "未找到卸载脚本,尝试手动停止服务"
|
||
manual_stop_services
|
||
fi
|
||
}
|
||
|
||
# 手动停止服务
|
||
manual_stop_services() {
|
||
log_info "手动停止服务..."
|
||
|
||
# 停止 node_exporter
|
||
if pgrep -f "node_exporter" >/dev/null 2>&1; then
|
||
pkill -f "node_exporter" && log_info "node_exporter 已停止"
|
||
fi
|
||
|
||
# 停止 dcgm_exporter
|
||
if pgrep -f "dcgm_exporter" >/dev/null 2>&1; then
|
||
pkill -f "dcgm_exporter" && log_info "dcgm_exporter 已停止"
|
||
fi
|
||
|
||
# 等待进程完全停止
|
||
sleep 2
|
||
|
||
# 检查是否还有残留进程
|
||
if pgrep -f "node_exporter\|dcgm_exporter" >/dev/null 2>&1; then
|
||
log_warning "仍有服务进程运行,尝试强制停止"
|
||
pkill -9 -f "node_exporter\|dcgm_exporter" 2>/dev/null || true
|
||
fi
|
||
|
||
log_success "手动停止服务完成"
|
||
}
|
||
|
||
# 启动服务
|
||
start_services() {
|
||
log_info "启动服务..."
|
||
|
||
# 检查服务是否已经在运行
|
||
if check_services_running; then
|
||
log_info "服务已在运行,跳过启动"
|
||
return 0
|
||
fi
|
||
|
||
# 由于 install_artifact.sh 已经安装了所有组件并设置了健康检查定时任务
|
||
# 这里只需要简单验证服务状态即可
|
||
log_info "组件已安装完成,健康检查定时任务已设置"
|
||
log_info "服务将在健康检查时自动启动(每5分钟检查一次)"
|
||
|
||
# 等待一下让服务有时间启动
|
||
sleep 3
|
||
|
||
# 验证服务状态
|
||
if check_services_running; then
|
||
log_success "服务启动成功"
|
||
else
|
||
log_info "服务可能正在启动中,健康检查机制将自动监控"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# 检查服务是否正在运行
|
||
check_services_running() {
|
||
# 检查常见的服务端口是否在监听
|
||
local ports=(9100 9400) # node-exporter 和 dcgm-exporter 的默认端口
|
||
|
||
for port in "${ports[@]}"; do
|
||
if netstat -tlnp 2>/dev/null | grep -q ":$port "; then
|
||
log_info "检测到服务正在端口 $port 上运行"
|
||
return 0
|
||
fi
|
||
done
|
||
|
||
# 检查相关进程
|
||
if pgrep -f "node_exporter\|dcgm_exporter" >/dev/null 2>&1; then
|
||
log_info "检测到相关服务进程正在运行"
|
||
return 0
|
||
fi
|
||
|
||
return 1
|
||
}
|
||
|
||
# 检查是否为 root 用户
|
||
check_root() {
|
||
if [[ $EUID -ne 0 ]]; then
|
||
log_error "此脚本需要 root 权限运行"
|
||
log_info "请使用: sudo sh setup.sh"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 检查系统要求
|
||
check_system() {
|
||
log_info "检查系统要求..."
|
||
|
||
# 检查操作系统
|
||
if [[ ! -f /etc/os-release ]]; then
|
||
log_error "无法检测操作系统版本"
|
||
exit 1
|
||
fi
|
||
|
||
# 读取系统信息,使用子shell避免污染当前环境变量
|
||
local OS_INFO=$(source /etc/os-release && echo "$NAME $VERSION_ID")
|
||
log_info "检测到操作系统: $OS_INFO"
|
||
|
||
# 检查系统架构
|
||
arch=$(uname -m)
|
||
log_info "系统架构: $arch"
|
||
|
||
# 检查磁盘空间
|
||
available_space=$(df / | awk 'NR==2 {print $4}')
|
||
if [[ $available_space -lt 1024 ]]; then
|
||
log_warning "可用磁盘空间不足 1GB,当前可用: $(($available_space / 1024 / 1024))GB"
|
||
fi
|
||
}
|
||
|
||
# 下载并安装
|
||
install_argus_metric() {
|
||
# 如果没有指定版本,获取最新版本
|
||
if [[ -z "$ARGUS_VERSION" ]]; then
|
||
ARGUS_VERSION=$(get_latest_version)
|
||
fi
|
||
|
||
log_info "开始安装 Argus Metric v$ARGUS_VERSION..."
|
||
log_info "安装目录: $INSTALL_DIR"
|
||
|
||
# 检查是否已安装
|
||
local is_upgrade=false
|
||
if check_installed; then
|
||
local current_version=$(get_current_version)
|
||
if [[ "$current_version" == "$ARGUS_VERSION" ]]; then
|
||
log_info "版本 v$ARGUS_VERSION 已安装,无需重复安装"
|
||
return 0
|
||
fi
|
||
log_info "检测到版本升级: v$current_version -> v$ARGUS_VERSION"
|
||
is_upgrade=true
|
||
|
||
# 备份当前版本
|
||
backup_current_version
|
||
fi
|
||
|
||
# 创建安装目录结构
|
||
create_install_directories
|
||
|
||
# 创建临时目录
|
||
mkdir -p "$TEMP_DIR"
|
||
cd "$TEMP_DIR"
|
||
|
||
# 下载发布包,使用新的命名规范
|
||
TAR_NAME="argus-metric_$(echo $ARGUS_VERSION | tr '.' '_').tar.gz"
|
||
log_info "下载发布包: $TAR_NAME"
|
||
log_info "从FTP服务器下载: $FTP_SERVER:$FTP_PORT, 用户: $FTP_USER"
|
||
|
||
# 构造curl命令并显示(隐藏密码)
|
||
CURL_CMD="curl -u \"${FTP_USER}:***\" -sfL \"$BASE_URL/$TAR_NAME\" -o \"$TAR_NAME\""
|
||
log_info "执行命令: $CURL_CMD"
|
||
|
||
if ! curl -u "${FTP_USER}:${FTP_PASS}" -sfL "$BASE_URL/$TAR_NAME" -o "$TAR_NAME"; then
|
||
log_error "下载发布包失败: $BASE_URL/$TAR_NAME"
|
||
log_error "完整命令: curl -u \"${FTP_USER}:${FTP_PASS}\" -sfL \"$BASE_URL/$TAR_NAME\" -o \"$TAR_NAME\""
|
||
log_error "请检查FTP服务器连接、用户名密码是否正确"
|
||
exit 1
|
||
fi
|
||
|
||
# 解压发布包到当前目录
|
||
log_info "解压发布包..."
|
||
if ! tar -xzf "$TAR_NAME"; then
|
||
log_error "解压发布包失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 显示解压后的文件结构
|
||
log_info "解压后的文件结构:"
|
||
ls -la "$TEMP_DIR"
|
||
|
||
# 准备版本目录
|
||
local version_dir="$VERSIONS_DIR/$ARGUS_VERSION"
|
||
log_info "安装到版本目录: $version_dir"
|
||
|
||
# 如果升级,先停止服务
|
||
if [[ "$is_upgrade" == true ]]; then
|
||
stop_services
|
||
fi
|
||
|
||
# 创建版本目录
|
||
if [[ -d "$version_dir" ]]; then
|
||
log_info "版本目录已存在,备份后更新"
|
||
rm -rf "$version_dir"
|
||
fi
|
||
|
||
# 创建新的版本目录
|
||
mkdir -p "$version_dir"
|
||
|
||
# 移动解压的文件到版本目录
|
||
log_info "移动文件到版本目录: $TEMP_DIR/* -> $version_dir/"
|
||
|
||
# 检查源目录是否有内容
|
||
if [[ ! "$(ls -A "$TEMP_DIR" 2>/dev/null)" ]]; then
|
||
log_error "临时目录为空,无法移动文件"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查目标目录是否存在
|
||
if [[ ! -d "$version_dir" ]]; then
|
||
log_error "目标版本目录不存在: $version_dir"
|
||
exit 1
|
||
fi
|
||
|
||
# 执行文件移动
|
||
if mv "$TEMP_DIR"/* "$version_dir" 2>/dev/null; then
|
||
log_success "文件移动到版本目录完成"
|
||
else
|
||
log_error "移动文件到版本目录失败"
|
||
log_error "源目录内容:"
|
||
ls -la "$TEMP_DIR" || true
|
||
log_error "目标目录状态:"
|
||
ls -la "$version_dir" || true
|
||
log_error "权限检查:"
|
||
ls -ld "$TEMP_DIR" "$version_dir" || true
|
||
exit 1
|
||
fi
|
||
|
||
# 执行安装脚本
|
||
log_info "执行安装脚本..."
|
||
cd "$version_dir"
|
||
if [[ -f "install.sh" ]]; then
|
||
chmod +x install.sh
|
||
# 传递安装根目录给安装脚本,让install_artifact.sh安装到正确的版本目录
|
||
if ./install.sh "$version_dir"; then
|
||
log_success "安装脚本执行完成"
|
||
else
|
||
log_error "安装脚本执行失败"
|
||
# 如果是升级失败,尝试回滚
|
||
if [[ "$is_upgrade" == true ]]; then
|
||
log_warning "升级失败,尝试回滚到之前版本..."
|
||
local latest_backup=$(ls -1t "$BACKUPS_DIR" 2>/dev/null | head -n 1)
|
||
if [[ -n "$latest_backup" ]]; then
|
||
rollback_to_backup "$latest_backup"
|
||
return 1
|
||
fi
|
||
fi
|
||
exit 1
|
||
fi
|
||
else
|
||
log_error "未找到安装脚本 install.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# 更新软链接指向新版本
|
||
log_info "更新当前版本链接..."
|
||
if ln -sfn "$version_dir" "$CURRENT_LINK"; then
|
||
log_success "版本链接更新完成: $CURRENT_LINK -> $version_dir"
|
||
else
|
||
log_error "版本链接更新失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 更新LATEST_VERSION文件
|
||
update_latest_version_file "$ARGUS_VERSION"
|
||
|
||
# 启动服务
|
||
# start_services
|
||
|
||
log_success "Argus Metric v$ARGUS_VERSION 安装完成!"
|
||
|
||
# 显示安装信息
|
||
echo
|
||
log_info "安装信息:"
|
||
log_info " 版本: $ARGUS_VERSION"
|
||
log_info " 安装目录: $INSTALL_DIR"
|
||
log_info " 版本目录: $version_dir"
|
||
log_info " 当前链接: $CURRENT_LINK"
|
||
if [[ "$is_upgrade" == true ]]; then
|
||
log_info " 升级类型: 版本升级"
|
||
else
|
||
log_info " 安装类型: 全新安装"
|
||
fi
|
||
}
|
||
|
||
# 卸载
|
||
uninstall_argus_metric() {
|
||
log_info "开始卸载 Argus Metric..."
|
||
log_info "安装目录: $INSTALL_DIR"
|
||
|
||
# 检查是否已安装
|
||
if ! check_installed; then
|
||
log_info "未检测到已安装的 Argus Metric"
|
||
return 0
|
||
fi
|
||
|
||
local current_version=$(get_current_version)
|
||
log_info "检测到当前版本: v$current_version"
|
||
|
||
# 停止服务
|
||
stop_services
|
||
|
||
# 执行卸载脚本
|
||
log_info "执行卸载脚本..."
|
||
if [[ -f "$CURRENT_LINK/uninstall.sh" ]]; then
|
||
cd "$CURRENT_LINK"
|
||
chmod +x uninstall.sh
|
||
|
||
# 自动确认卸载(因为用户已经明确使用了 --uninstall 参数)
|
||
log_info "自动确认卸载操作..."
|
||
echo "y" | ./uninstall.sh
|
||
local uninstall_exit_code=$?
|
||
|
||
if [[ $uninstall_exit_code -eq 0 ]]; then
|
||
log_success "卸载脚本执行完成"
|
||
else
|
||
log_error "卸载脚本执行失败 (退出码: $uninstall_exit_code)"
|
||
exit 1
|
||
fi
|
||
else
|
||
log_warning "未找到卸载脚本,执行基本清理"
|
||
fi
|
||
|
||
# 清理安装目录
|
||
log_info "清理安装目录..."
|
||
if [[ -d "$INSTALL_DIR" ]]; then
|
||
# 询问是否完全删除安装目录
|
||
log_warning "这将删除整个安装目录: $INSTALL_DIR"
|
||
log_warning "包括所有版本、备份和配置文件"
|
||
|
||
# 在自动化环境中,直接删除
|
||
if rm -rf "$INSTALL_DIR"; then
|
||
log_success "安装目录已完全清理: $INSTALL_DIR"
|
||
else
|
||
log_error "清理安装目录失败"
|
||
exit 1
|
||
fi
|
||
else
|
||
log_info "安装目录不存在,无需清理"
|
||
fi
|
||
|
||
log_success "Argus Metric 卸载完成!"
|
||
}
|
||
|
||
# 显示状态
|
||
show_status() {
|
||
echo "=========================================="
|
||
echo " Argus Metric 安装状态"
|
||
echo "=========================================="
|
||
echo
|
||
|
||
if check_installed; then
|
||
local current_version=$(get_current_version)
|
||
log_info "当前版本: $current_version"
|
||
log_info "安装目录: $INSTALL_DIR"
|
||
log_info "当前链接: $CURRENT_LINK"
|
||
log_info "版本目录: $VERSIONS_DIR/$current_version"
|
||
log_info "版本文件: $LATEST_VERSION_FILE"
|
||
|
||
# 显示LATEST_VERSION文件内容
|
||
if [[ -f "$LATEST_VERSION_FILE" ]]; then
|
||
local file_version=$(cat "$LATEST_VERSION_FILE" 2>/dev/null | tr -d '[:space:]')
|
||
log_info "版本文件内容: $file_version"
|
||
fi
|
||
|
||
echo
|
||
log_info "目录结构:"
|
||
if [[ -d "$INSTALL_DIR" ]]; then
|
||
tree -L 2 "$INSTALL_DIR" 2>/dev/null || ls -la "$INSTALL_DIR"
|
||
fi
|
||
|
||
echo
|
||
log_info "可用版本:"
|
||
if [[ -d "$VERSIONS_DIR" ]]; then
|
||
ls -1 "$VERSIONS_DIR" 2>/dev/null | sed 's/^/ - /'
|
||
else
|
||
echo " 无"
|
||
fi
|
||
|
||
echo
|
||
log_info "备份版本:"
|
||
if [[ -d "$BACKUPS_DIR" ]] && [[ $(ls -1 "$BACKUPS_DIR" 2>/dev/null | wc -l) -gt 0 ]]; then
|
||
ls -1t "$BACKUPS_DIR" 2>/dev/null | sed 's/^/ - /'
|
||
else
|
||
echo " 无"
|
||
fi
|
||
else
|
||
log_warning "Argus Metric 未安装"
|
||
log_info "安装目录: $INSTALL_DIR"
|
||
fi
|
||
}
|
||
|
||
# 列出备份
|
||
list_backups() {
|
||
echo "=========================================="
|
||
echo " Argus Metric 备份列表"
|
||
echo "=========================================="
|
||
echo
|
||
|
||
if [[ -d "$BACKUPS_DIR" ]] && [[ $(ls -1 "$BACKUPS_DIR" 2>/dev/null | wc -l) -gt 0 ]]; then
|
||
log_info "可用备份版本:"
|
||
ls -1t "$BACKUPS_DIR" 2>/dev/null | while read backup; do
|
||
local backup_time=$(stat -c %y "$BACKUPS_DIR/$backup" 2>/dev/null | cut -d' ' -f1-2)
|
||
echo " - $backup (创建时间: $backup_time)"
|
||
done
|
||
else
|
||
log_warning "没有可用的备份版本"
|
||
fi
|
||
}
|
||
|
||
# 回滚功能
|
||
rollback_version() {
|
||
log_info "开始回滚操作..."
|
||
|
||
if ! check_installed; then
|
||
log_error "没有检测到已安装的版本,无法回滚"
|
||
exit 1
|
||
fi
|
||
|
||
# 获取最新的备份
|
||
local latest_backup=$(ls -1t "$BACKUPS_DIR" 2>/dev/null | head -n 1)
|
||
if [[ -z "$latest_backup" ]]; then
|
||
log_error "没有找到可用的备份版本"
|
||
exit 1
|
||
fi
|
||
|
||
log_info "将回滚到备份版本: $latest_backup"
|
||
|
||
if rollback_to_backup "$latest_backup"; then
|
||
log_success "回滚完成!"
|
||
|
||
# 显示当前状态
|
||
echo
|
||
show_status
|
||
else
|
||
log_error "回滚失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo "=========================================="
|
||
echo " Argus Metric 在线安装脚本 v1.0"
|
||
echo "=========================================="
|
||
echo
|
||
|
||
# 对于状态和备份列表操作,不需要FTP参数和root权限
|
||
if [[ "$ACTION" == "status" || "$ACTION" == "backup-list" ]]; then
|
||
if [[ "$ACTION" == "status" ]]; then
|
||
show_status
|
||
elif [[ "$ACTION" == "backup-list" ]]; then
|
||
list_backups
|
||
fi
|
||
return 0
|
||
fi
|
||
|
||
check_root
|
||
|
||
# 更新目录配置变量(在设置INSTALL_DIR后)
|
||
VERSIONS_DIR="$INSTALL_DIR/versions"
|
||
BACKUPS_DIR="$INSTALL_DIR/backups"
|
||
CURRENT_LINK="$INSTALL_DIR/current"
|
||
LATEST_VERSION_FILE="$INSTALL_DIR/LATEST_VERSION"
|
||
|
||
# 对于回滚操作,不需要FTP参数
|
||
if [[ "$ACTION" == "rollback" ]]; then
|
||
rollback_version
|
||
return 0
|
||
fi
|
||
|
||
check_ftp_params
|
||
check_system
|
||
|
||
if [[ "$ACTION" == "uninstall" ]]; then
|
||
uninstall_argus_metric
|
||
else
|
||
install_argus_metric
|
||
fi
|
||
|
||
echo
|
||
log_info "操作完成!"
|
||
}
|
||
|
||
# 脚本入口
|
||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||
main "$@"
|
||
fi
|