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

# 显示帮助信息
show_help() {
    echo "Node Exporter 安装脚本"
    echo
    echo "用法: $0 [选项]"
    echo
    echo "选项:"
    echo "  --help     显示此帮助信息"
    echo
    echo "示例:"
    echo "  $0          # 安装 Node Exporter"
    echo
}

# 解析命令行参数
for arg in "$@"; do
    case $arg in
        --help|-h)
            show_help
            exit 0
            ;;
        *)
            log_error "未知参数: $arg"
            show_help
            exit 1
            ;;
    esac
done

# 检查是否为 root 用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要 root 权限运行"
        log_info "请使用: sudo $0"
        exit 1
    fi
}

# 检查系统要求
check_system() {
    log_info "检查系统要求..."
    
    # 检查操作系统
    if [[ ! -f /etc/os-release ]]; then
        log_error "无法检测操作系统版本"
        exit 1
    fi
    
    source /etc/os-release
    log_info "检测到操作系统: $NAME $VERSION"
    
    # 检查是否为 Linux 系统
    if [[ "$ID" != "ubuntu" && "$ID" != "debian" && "$ID" != "centos" && "$ID" != "rhel" && "$ID" != "fedora" ]]; then
        log_warning "此脚本主要针对常见 Linux 发行版，其他系统可能需要调整"
    fi
    
    # 检查系统架构
    local arch=$(uname -m)
    log_info "系统架构: $arch"
    
    if [[ "$arch" != "x86_64" && "$arch" != "amd64" ]]; then
        log_warning "当前架构为 $arch，node_exporter 主要支持 x86_64/amd64"
    fi
}

# 停止可能运行的服务
stop_existing_service() {
    log_info "检查并停止可能运行的服务..."
    
    local pid_file="/var/run/node-exporter.pid"
    
    # 检查并停止通过 PID 文件管理的服务
    if [[ -f "$pid_file" ]]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            log_info "发现正在运行的 Node Exporter 服务 (PID: $pid)，正在停止..."
            kill "$pid"
            sleep 2
            if kill -0 "$pid" 2>/dev/null; then
                log_warning "进程未响应，强制终止..."
                kill -9 "$pid" 2>/dev/null || true
            fi
            rm -f "$pid_file"
            log_success "服务已停止"
        else
            log_warning "发现过期的 PID 文件，正在清理..."
            rm -f "$pid_file"
        fi
    fi
    
    # 查找并停止所有 node_exporter 和 node-exporter 进程
    local pids=$(pgrep -f "node_exporter\|node-exporter" 2>/dev/null || true)
    if [[ -n "$pids" ]]; then
        log_info "发现 node_exporter 或 node-exporter 进程，正在停止..."
        for pid in $pids; do
            log_info "停止进程 PID: $pid"
            kill "$pid" 2>/dev/null || true
        done
        sleep 2
        
        # 检查是否还有进程在运行，如果有则强制终止
        local remaining_pids=$(pgrep -f "node_exporter\|node-exporter" 2>/dev/null || true)
        if [[ -n "$remaining_pids" ]]; then
            log_warning "进程未响应，强制终止..."
            for pid in $remaining_pids; do
                log_info "强制终止进程 PID: $pid"
                kill -9 "$pid" 2>/dev/null || true
            done
            sleep 1
        fi
        
        # 最终检查
        if pgrep -f "node_exporter\|node-exporter" > /dev/null; then
            log_error "无法停止所有 node_exporter 进程"
        else
            log_success "所有 node_exporter 进程已停止"
        fi
    fi
}

# 安装 Node Exporter 二进制文件
install_node_exporter() {
    log_info "安装 Node Exporter..."
    
    local binary_file="bin/node_exporter"
    local install_dir="/usr/local/bin"
    
    if [[ ! -f "$binary_file" ]]; then
        log_error "找不到 Node Exporter 二进制文件: $binary_file"
        exit 1
    fi
    
    # 停止可能运行的服务
    stop_existing_service
    
    # 复制二进制文件并重命名为统一格式
    cp "$binary_file" "$install_dir/node-exporter"
    chmod +x "$install_dir/node-exporter"
    
    log_success "Node Exporter 二进制文件安装完成"
}

# 创建用户和组
create_user() {
    log_info "创建 node_exporter 用户..."
    
    # 检查用户是否已存在
    if id "node_exporter" &>/dev/null; then
        log_info "用户 node_exporter 已存在"
    else
        useradd --no-create-home --shell /bin/false node_exporter
        log_success "用户 node_exporter 创建完成"
    fi
}

# 安装配置文件
install_config() {
    log_info "安装配置文件..."
    
    local config_dir="/etc/node_exporter"
    
    # 创建配置目录
    mkdir -p "$config_dir"
    
    # 创建文本文件收集器目录
    mkdir -p "/var/lib/node_exporter/textfile_collector"
    chown node_exporter:node_exporter "/var/lib/node_exporter/textfile_collector"
}

# 启动 Node Exporter 服务
start_node_exporter() {
    log_info "启动 Node Exporter 服务..."
    
    local binary_path="/usr/local/bin/node-exporter"
    local log_file="/var/log/node-exporter.log"
    local pid_file="/var/run/node-exporter.pid"
    
    # 检查服务是否已经在运行
    if [[ -f "$pid_file" ]]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            log_info "Node Exporter 服务已在运行 (PID: $pid)"
            return 0
        else
            log_warning "发现过期的 PID 文件，正在清理..."
            rm -f "$pid_file"
        fi
    fi
    
    # 检查端口是否被占用
    if netstat -tuln 2>/dev/null | grep -q ":9100 "; then
        log_warning "端口 9100 已被占用，请检查是否有其他服务在运行"
        return 1
    fi
    
    # 启动服务
    log_info "正在启动 Node Exporter..."
    nohup "$binary_path" --web.listen-address=:9100 > "$log_file" 2>&1 &
    local pid=$!
    
    # 保存 PID
    echo "$pid" > "$pid_file"
    
    # 等待服务启动
    sleep 2
    
    # 检查服务是否成功启动
    if kill -0 "$pid" 2>/dev/null; then
        log_success "Node Exporter 服务启动成功 (PID: $pid)"
        log_info "日志文件: $log_file"
        log_info "PID 文件: $pid_file"
    else
        log_error "Node Exporter 服务启动失败"
        rm -f "$pid_file"
        return 1
    fi
}



# 显示安装信息
show_install_info() {
    log_success "Node Exporter 安装完成！"
    echo
    echo "安装信息:"
    echo "  二进制文件: /usr/local/bin/node-exporter"
    echo "  运行用户: node_exporter"
    echo "  配置目录: /etc/node_exporter/"
    echo "  默认端口: 9100"
    echo
    echo "使用方法:"
    echo "  手动启动: /usr/local/bin/node-exporter --web.listen-address=:9100"
    echo "  后台启动: nohup /usr/local/bin/node-exporter --web.listen-address=:9100 &"
    echo
    echo "测试连接:"
    echo "  curl http://localhost:9100/metrics"
    echo "  curl http://localhost:9100"
    echo
    echo "Prometheus 配置示例:"
    echo "  - job_name: 'node_exporter'"
    echo "    static_configs:"
    echo "      - targets: ['localhost:9100']"
    echo
}

# 主函数
main() {
    echo "=========================================="
    echo "    Node Exporter 安装脚本 v1.0"
    echo "=========================================="
    echo
    
    check_root
    check_system
    
    log_info "开始安装 Node Exporter..."
    
    install_node_exporter
    create_user
    install_config
    start_node_exporter
    
    show_install_info
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi
