#!/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