测试方案: - 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>
274 lines
7.5 KiB
Bash
Executable File
274 lines
7.5 KiB
Bash
Executable File
#!/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 |