#!/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" } # 配置变量 INSTALL_DIR="/opt/argus-metric" TEMP_DIR="/tmp/argus-metric-uninstall-$$" VERSION_FILE="version.json" # 检查是否为 root 用户 check_root() { if [[ $EUID -ne 0 ]]; then log_error "此脚本需要 root 权限运行" log_info "请使用: sudo $0" exit 1 fi } # 查找版本文件 find_version_file() { log_info "查找版本信息文件..." # 在当前目录查找 if [[ -f "$VERSION_FILE" ]]; then VERSION_FILE_PATH="$VERSION_FILE" log_success "找到版本文件: $VERSION_FILE" return 0 fi # 在 artifact 目录查找 for version_dir in artifact/*/; do if [[ -f "${version_dir}${VERSION_FILE}" ]]; then VERSION_FILE_PATH="${version_dir}${VERSION_FILE}" log_success "找到版本文件: $VERSION_FILE_PATH" return 0 fi done log_error "未找到版本信息文件 $VERSION_FILE" log_info "请确保在正确的目录下运行此脚本" exit 1 } # 解析版本信息 parse_version_info() { log_info "解析版本信息..." if [[ ! -f "$VERSION_FILE_PATH" ]]; then log_error "版本文件不存在: $VERSION_FILE_PATH" exit 1 fi # 使用 jq 解析 JSON(如果可用) if command -v jq &> /dev/null; then VERSION=$(jq -r '.version' "$VERSION_FILE_PATH") BUILD_TIME=$(jq -r '.build_time' "$VERSION_FILE_PATH") # 解析 install_order(现在包含完整的文件名) if jq -e '.install_order' "$VERSION_FILE_PATH" > /dev/null 2>&1; then jq -r '.install_order[]' "$VERSION_FILE_PATH" > "$TEMP_DIR/install_order.txt" else log_error "version.json 中缺少 install_order 字段" exit 1 fi else log_warning "jq 未安装,使用简单的 JSON 解析" VERSION=$(grep '"version"' "$VERSION_FILE_PATH" | sed 's/.*"version": *"\([^"]*\)".*/\1/') BUILD_TIME=$(grep '"build_time"' "$VERSION_FILE_PATH" | sed 's/.*"build_time": *"\([^"]*\)".*/\1/') # 解析 install_order grep -A 100 '"install_order"' "$VERSION_FILE_PATH" | grep -E '^\s*"[^"]+"' | while read line; do component=$(echo "$line" | sed 's/.*"\([^"]*\)".*/\1/') echo "$component" >> "$TEMP_DIR/install_order.txt" done fi log_success "版本信息解析完成" log_info " 版本: $VERSION" log_info " 构建时间: $BUILD_TIME" } # 创建临时目录 create_temp_dirs() { log_info "创建临时目录..." mkdir -p "$TEMP_DIR" log_success "临时目录创建完成: $TEMP_DIR" } # 卸载组件 uninstall_components() { log_info "开始卸载组件..." artifact_dir=$(dirname "$VERSION_FILE_PATH") uninstall_count=0 total_count=0 if [[ -f "$TEMP_DIR/install_order.txt" ]]; then total_count=$(wc -l < "$TEMP_DIR/install_order.txt") fi if [[ -f "$TEMP_DIR/install_order.txt" ]]; then while IFS= read -r filename; do uninstall_count=$((uninstall_count + 1)) # 从文件名中提取组件名(去掉时间戳后缀) component=$(echo "$filename" | sed 's/-[0-9]\{8\}-[0-9]\{6\}\.tar\.gz$//') log_info "[$uninstall_count/$total_count] 卸载 $component..." # 直接使用完整的文件名 tar_file="$artifact_dir/$filename" if [[ ! -f "$tar_file" ]]; then log_error "找不到组件文件: $filename" exit 1 fi # 解压到临时目录 component_temp_dir="$TEMP_DIR/$component" mkdir -p "$component_temp_dir" if tar -xzf "$tar_file" -C "$component_temp_dir"; then log_success " $component 解压完成" else log_error " $component 解压失败" exit 1 fi # 查找解压后的目录 extracted_dir="" for dir in "$component_temp_dir"/*; do if [[ -d "$dir" ]]; then extracted_dir="$dir" break fi done if [[ -z "$extracted_dir" ]]; then log_error " $component 解压后未找到目录" exit 1 fi # 执行卸载脚本 if [[ -f "$extracted_dir/uninstall.sh" ]]; then log_info " 执行 $component 卸载脚本..." # 所有组件都只需要一个确认 if (cd "$extracted_dir" && echo "y" | ./uninstall.sh); then log_success " $component 卸载完成" else log_error " $component 卸载失败" exit 1 fi else log_warning " $component 缺少 uninstall.sh 文件,跳过卸载" fi # 清理临时文件 rm -rf "$component_temp_dir" done < "$TEMP_DIR/install_order.txt" fi log_success "所有组件卸载完成" } # 清理全局文件 cleanup_global_files() { log_info "清理全局文件..." # 清理安装目录 if [[ -d "$INSTALL_DIR" ]]; then rm -rf "$INSTALL_DIR" log_success "安装目录已清理: $INSTALL_DIR" else log_info "安装目录不存在: $INSTALL_DIR" fi # 清理可能的全局配置文件 local global_configs=( "/etc/argus-metric" "/var/log/argus-metric" ) for config in "${global_configs[@]}"; do if [[ -d "$config" ]]; then rm -rf "$config" log_success "全局配置已清理: $config" fi done } # 显示卸载信息 show_uninstall_info() { log_success "Argus-Metrics All-in-One 卸载完成!" echo echo "卸载信息:" echo " 版本: $VERSION" echo " 构建时间: $BUILD_TIME" echo echo "清理内容:" echo " - 二进制文件" echo " - 配置文件" echo " - 数据目录" echo " - 进程和服务" echo " - 全局安装目录" echo echo "注意:" echo " - 系统依赖包可能仍然存在" echo " - 如需完全清理,请手动检查并删除相关文件" echo } # 清理函数 cleanup() { if [[ -d "$TEMP_DIR" ]]; then rm -rf "$TEMP_DIR" fi } # 设置清理陷阱 trap cleanup EXIT # 主函数 main() { echo "==========================================" echo " Argus-Metrics All-in-One 卸载脚本" echo "==========================================" echo check_root find_version_file create_temp_dirs parse_version_info log_warning "此操作将完全卸载 Argus-Metrics All-in-One" read -p "确认继续?(y/N): " confirm if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then log_info "取消卸载操作" exit 0 fi uninstall_components cleanup_global_files show_uninstall_info } # 脚本入口 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi