测试方案: - lm2机器端口映射到本机:18080, 18081, 8082-8085 - 访问URL: http://localhost:18080/dashboard       端到端测试通过:  Co-authored-by: sundapeng.sdp <sundapeng@hashdata.cn> Reviewed-on: #35 Reviewed-by: xuxt <xuxt@zgclab.edu.cn> Reviewed-by: sundapeng <sundp@mail.zgclab.edu.cn> Reviewed-by: huhy <husteryezi@163.com>
241 lines
7.2 KiB
Bash
Executable File
241 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 版本校验脚本
|
|
# 比较本地 LATEST_VERSION 与 FTP 的 VERSION 版本,如果不一致则更新对应版本
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 日志函数 - 输出到 stderr 避免影响函数返回值
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1" >&2
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1" >&2
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1" >&2
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1" >&2
|
|
}
|
|
|
|
# 获取脚本所在目录
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# 动态获取当前版本目录
|
|
get_current_version_dir() {
|
|
# 查找 /opt/argus-metric/versions/ 下的最新版本目录
|
|
local versions_dir="/opt/argus-metric/versions"
|
|
if [[ -d "$versions_dir" ]]; then
|
|
# 按版本号排序,获取最新的版本目录
|
|
local latest_version_dir=$(ls -1 "$versions_dir" 2>/dev/null | sort -V | tail -1)
|
|
if [[ -n "$latest_version_dir" ]]; then
|
|
echo "$versions_dir/$latest_version_dir"
|
|
else
|
|
echo "/opt/argus-metric"
|
|
fi
|
|
else
|
|
echo "/opt/argus-metric"
|
|
fi
|
|
}
|
|
|
|
# 获取当前版本目录
|
|
CURRENT_VERSION_DIR=$(get_current_version_dir)
|
|
# LATEST_VERSION 文件在根目录
|
|
LOCAL_VERSION_FILE="/opt/argus-metric/LATEST_VERSION"
|
|
REMOTE_VERSION_URL=""
|
|
LOG_FILE="$CURRENT_VERSION_DIR/.version_check.log"
|
|
|
|
# 从环境变量或配置文件获取 FTP 服务器信息
|
|
get_ftp_config() {
|
|
# 优先从环境变量获取配置
|
|
log_info "获取 FTP 配置信息..."
|
|
|
|
# 如果环境变量中没有设置,则尝试从配置文件读取
|
|
if [[ -z "$FTP_SERVER" || -z "$FTP_USER" || -z "$FTP_PASSWORD" ]]; then
|
|
local config_file="$SCRIPT_DIR/../config/config.env"
|
|
if [[ -f "$config_file" ]]; then
|
|
log_info "从配置文件读取 FTP 配置: $config_file"
|
|
source "$config_file"
|
|
fi
|
|
else
|
|
log_info "使用环境变量中的 FTP 配置"
|
|
fi
|
|
|
|
# 设置默认值(如果环境变量和配置文件都没有设置)
|
|
FTP_SERVER="${FTP_SERVER:-localhost}"
|
|
FTP_USER="${FTP_USER:-ftpuser}"
|
|
FTP_PASSWORD="${FTP_PASSWORD:-ZGClab1234!}"
|
|
|
|
# 构建远程版本文件 URL
|
|
REMOTE_VERSION_URL="ftp://${FTP_USER}:${FTP_PASSWORD}@${FTP_SERVER}/LATEST_VERSION"
|
|
|
|
log_info "FTP 配置来源: ${FTP_CONFIG_SOURCE:-环境变量/配置文件}"
|
|
}
|
|
|
|
# 获取远程版本号
|
|
get_remote_version() {
|
|
log_info "从 FTP 服务器获取远程版本号..."
|
|
log_info "远程地址: $REMOTE_VERSION_URL"
|
|
|
|
# 先测试 FTP 连接
|
|
log_info "测试 FTP 连接..."
|
|
if curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfI "ftp://${FTP_SERVER}/" >/dev/null 2>&1; then
|
|
log_success "FTP 服务器连接成功"
|
|
else
|
|
log_error "无法连接到 FTP 服务器: $FTP_SERVER"
|
|
return 1
|
|
fi
|
|
|
|
# 测试 LATEST_VERSION 文件是否存在
|
|
log_info "检查远程 LATEST_VERSION 文件是否存在..."
|
|
if curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfI "ftp://${FTP_SERVER}/LATEST_VERSION" >/dev/null 2>&1; then
|
|
log_success "远程 LATEST_VERSION 文件存在"
|
|
else
|
|
log_error "远程 LATEST_VERSION 文件不存在或无法访问"
|
|
return 1
|
|
fi
|
|
|
|
# 获取远程版本号
|
|
local remote_version
|
|
if remote_version=$(curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfL "ftp://${FTP_SERVER}/LATEST_VERSION" 2>/dev/null | tr -d '[:space:]'); then
|
|
if [[ -n "$remote_version" ]]; then
|
|
log_success "获取到远程版本号: $remote_version"
|
|
echo "$remote_version"
|
|
else
|
|
log_error "远程版本号为空"
|
|
return 1
|
|
fi
|
|
else
|
|
log_error "获取远程版本号失败"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# 获取本地版本号
|
|
get_local_version() {
|
|
if [[ -f "$LOCAL_VERSION_FILE" ]]; then
|
|
local local_version=$(cat "$LOCAL_VERSION_FILE" 2>/dev/null | tr -d '[:space:]')
|
|
if [[ -n "$local_version" ]]; then
|
|
log_info "本地版本号: $local_version"
|
|
echo "$local_version"
|
|
else
|
|
log_warning "本地版本文件为空"
|
|
echo ""
|
|
fi
|
|
else
|
|
log_warning "本地版本文件不存在: $LOCAL_VERSION_FILE"
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
# 更新到新版本
|
|
update_to_version() {
|
|
local new_version="$1"
|
|
local temp_dir="/tmp/argus-update-$$"
|
|
local setup_script="$temp_dir/setup.sh"
|
|
|
|
log_info "开始更新到版本: $new_version"
|
|
|
|
# 创建临时目录
|
|
mkdir -p "$temp_dir"
|
|
|
|
# 下载最新的 setup.sh
|
|
log_info "从 FTP 服务器下载最新的安装脚本..."
|
|
local setup_url="ftp://${FTP_USER}:${FTP_PASSWORD}@${FTP_SERVER}/setup.sh"
|
|
|
|
if curl -fsS "$setup_url" -o "$setup_script"; then
|
|
log_success "安装脚本下载完成"
|
|
else
|
|
log_error "下载安装脚本失败: $setup_url"
|
|
rm -rf "$temp_dir"
|
|
return 1
|
|
fi
|
|
|
|
# 添加执行权限
|
|
chmod +x "$setup_script"
|
|
|
|
# 执行安装脚本
|
|
log_info "执行安装脚本进行版本更新..."
|
|
if "$setup_script" --server "$FTP_SERVER" --user "$FTP_USER" --password "$FTP_PASSWORD" --version "$new_version"; then
|
|
log_success "版本更新完成: $new_version"
|
|
rm -rf "$temp_dir"
|
|
return 0
|
|
else
|
|
log_error "版本更新失败: $new_version"
|
|
rm -rf "$temp_dir"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# 记录检查日志
|
|
log_check() {
|
|
local message="$1"
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
echo "[$timestamp] $message" >> "$LOG_FILE"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
log_info "开始版本校验检查..."
|
|
log_check "版本校验检查开始"
|
|
|
|
# 确保系统目录存在
|
|
mkdir -p "/opt/argus-metric"
|
|
mkdir -p "$CURRENT_VERSION_DIR"
|
|
|
|
log_info "当前版本目录: $CURRENT_VERSION_DIR"
|
|
|
|
# 获取 FTP 配置
|
|
get_ftp_config
|
|
|
|
# 获取本地版本号
|
|
local local_version
|
|
local_version=$(get_local_version)
|
|
|
|
# 获取远程版本号
|
|
local remote_version
|
|
if ! remote_version=$(get_remote_version); then
|
|
log_error "无法获取远程版本号,跳过本次检查"
|
|
log_check "版本校验失败:无法获取远程版本号"
|
|
exit 1
|
|
fi
|
|
|
|
# 比较版本号
|
|
if [[ "$local_version" == "$remote_version" ]]; then
|
|
log_info "版本一致,无需更新 (本地: $local_version, 远程: $remote_version)"
|
|
log_check "版本校验完成:版本一致 ($local_version)"
|
|
else
|
|
log_info "检测到版本不一致 (本地: $local_version, 远程: $remote_version)"
|
|
log_check "检测到版本不一致:本地($local_version) -> 远程($remote_version)"
|
|
|
|
# 更新到新版本
|
|
if update_to_version "$remote_version"; then
|
|
log_success "版本更新成功: $local_version -> $remote_version"
|
|
log_check "版本更新成功:$local_version -> $remote_version"
|
|
else
|
|
log_error "版本更新失败"
|
|
log_check "版本更新失败:$local_version -> $remote_version"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
log_success "版本校验检查完成"
|
|
log_check "版本校验检查完成"
|
|
}
|
|
|
|
# 脚本入口
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
main "$@"
|
|
fi
|