#!/bin/bash
# Ubuntu24.04 纯APT安装Zabbix 7.0 Agent（修复GPG密钥+源验证问题）
# 适配Zabbix 7.0参数规范，保留业务配置：idc.niteng.net + Hostname_IP + AUTH_KEY

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
AUTH_KEY="niteng_zabbix_2026_secure"
# Zabbix GPG密钥ID（解决NO_PUBKEY问题）
ZABBIX_GPG_KEY_ID="D913219AB5333005"
# Ubuntu版本代号（自动识别，兼容22.04/24.04）
UBUNTU_CODENAME=$(lsb_release -sc 2>/dev/null || echo "noble")

# 检查root权限
if [ $UID -ne 0 ]; then
    echo -e "${RED}错误：请使用root用户执行本脚本！${NC}"
    exit 1
fi

# 网络检测函数（提前排查网络问题）
check_network() {
    echo -e "${YELLOW}===== 0. 网络连通性检测 =====${NC}"
    # 测试公网连通性
    if ! ping -c 2 223.6.6.6 &>/dev/null; then
        echo -e "${RED}错误：无法访问公网，请检查网络配置！${NC}"
        exit 1
    fi
    # 测试Zabbix源连通性
    if ! wget --spider -q https://repo.zabbix.com &>/dev/null; then
        echo -e "${YELLOW}警告：Zabbix官方源访问缓慢，将尝试使用备用方式导入密钥${NC}"
    fi
    echo -e "${GREEN}✅ 网络检测通过${NC}"
}

# 1. 彻底清理旧残留（避免冲突）
clean_old() {
    echo -e "\n${YELLOW}===== 1. 清理旧残留 =====${NC}"
    # 卸载旧包
    apt purge -y zabbix-agent zabbix-release &>/dev/null || true
    apt autoremove -y &>/dev/null || true
    # 停止/禁用/解除mask服务
    systemctl stop zabbix-agent &>/dev/null || true
    systemctl disable zabbix-agent &>/dev/null || true
    systemctl unmask zabbix-agent &>/dev/null || true
    systemctl reset-failed zabbix-agent &>/dev/null || true
    # 删除残留文件
    rm -rf /etc/zabbix /var/log/zabbix /var/run/zabbix &>/dev/null || true
    # 删除旧源和密钥
    rm -f /etc/apt/sources.list.d/zabbix.list /usr/share/keyrings/zabbix* &>/dev/null || true
    echo -e "${GREEN}✅ 旧残留清理完成${NC}"
}

# 2. 安装基础依赖
install_deps() {
    echo -e "\n${YELLOW}===== 2. 安装基础依赖 =====${NC}"
    # 先修复apt更新缓存（解决签名警告）
    apt clean && apt update -o Acquire::CompressionTypes::Order::=gz &>/dev/null || {
        echo -e "${RED}错误：系统源更新失败，请检查网络/源配置！${NC}"
        exit 1
    }
    apt install -y wget gnupg2 apt-transport-https ca-certificates lsb-release &>/dev/null || {
        echo -e "${RED}错误：基础依赖安装失败！${NC}"
        exit 1
    }
    echo -e "${GREEN}✅ 基础依赖安装完成${NC}"
}

# 3. 配置Zabbix 7.0官方APT源（修复GPG密钥问题）
config_repo() {
    echo -e "\n${YELLOW}===== 3. 配置Zabbix 7.0官方源 =====${NC}"
    # 方案1：直接导入官方密钥（优先）
    if ! wget -q https://repo.zabbix.com/zabbix-official-repo.key -O- | gpg --dearmor > /usr/share/keyrings/zabbix-official-keyring.gpg; then
        # 方案2：备用方式导入密钥（解决密钥下载失败）
        echo -e "${YELLOW}备用方式导入Zabbix GPG密钥...${NC}"
        gpg --keyserver keyserver.ubuntu.com --recv-keys ${ZABBIX_GPG_KEY_ID}
        gpg --export ${ZABBIX_GPG_KEY_ID} | gpg --dearmor > /usr/share/keyrings/zabbix-official-keyring.gpg
    fi

    # 写入对应Ubuntu版本的源（自动适配22.04/24.04）
    echo "deb [signed-by=/usr/share/keyrings/zabbix-official-keyring.gpg] https://repo.zabbix.com/zabbix/7.0/ubuntu/ ${UBUNTU_CODENAME} main" > /etc/apt/sources.list.d/zabbix.list
    
    # 强制更新源（显示详细信息，便于排查）
    echo -e "${YELLOW}正在更新Zabbix源缓存...${NC}"
    if ! apt update; then
        echo -e "${RED}错误：Zabbix源更新失败！${NC}"
        echo -e "${YELLOW}建议检查：1. GPG密钥是否导入 2. 网络是否能访问repo.zabbix.com${NC}"
        exit 1
    fi
    echo -e "${GREEN}✅ Zabbix 7.0官方源配置完成${NC}"
}

# 4. APT安装Zabbix Agent
install_agent() {
    echo -e "\n${YELLOW}===== 4. APT安装Zabbix Agent =====${NC}"
    if ! apt install -y zabbix-agent; then
        echo -e "${RED}错误：Zabbix Agent安装失败！${NC}"
        echo -e "${YELLOW}可能原因：1. 源配置错误 2. 系统版本不兼容（当前：${UBUNTU_CODENAME}）${NC}"
        exit 1
    fi
    echo -e "${GREEN}✅ Zabbix Agent安装完成${NC}"
}

# 5. 配置Agent（适配7.0参数规范，删除LogLevel）
config_agent() {
    echo -e "\n${YELLOW}===== 5. 配置Zabbix Agent =====${NC}"
    # 获取本机信息
    LOCAL_HOSTNAME=$(hostname)
    LOCAL_IP=$(ip route get 223.6.6.6 | awk '{print $7; exit}')
    [ -z "$LOCAL_IP" ] && LOCAL_IP=$(ip -4 addr | grep -v '127.0.0.1' | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
    [ -z "$LOCAL_IP" ] && LOCAL_IP="unknown_ip_$(date +%s | md5sum | cut -c 1-8)"
    UNIQUE_HOSTNAME="${LOCAL_HOSTNAME}_${LOCAL_IP}"

    # 生成7.0兼容的配置文件（删除LogLevel参数）
    cat > /etc/zabbix/zabbix_agentd.conf << EOF
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
Server=idc.niteng.net
ServerActive=idc.niteng.net:10051
Hostname=${UNIQUE_HOSTNAME}
HostMetadata=${AUTH_KEY}
StartAgents=5
User=zabbix
AllowRoot=0
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF

    # 修复目录权限
    mkdir -p /var/run/zabbix /var/log/zabbix
    chown -R zabbix:zabbix /etc/zabbix /var/run/zabbix /var/log/zabbix
    chmod 750 /var/run/zabbix /var/log/zabbix
    chmod 640 /etc/zabbix/zabbix_agentd.conf

    # 关闭AppArmor（解决权限拦截）
    systemctl stop apparmor &>/dev/null || true
    systemctl disable apparmor &>/dev/null || true

    echo -e "${GREEN}✅ Agent配置完成（Hostname：${UNIQUE_HOSTNAME}）${NC}"
}

# 6. 启动并验证服务
start_verify() {
    echo -e "\n${YELLOW}===== 6. 启动并验证服务 =====${NC}"
    # 重载systemd
    systemctl daemon-reload &>/dev/null
    # 启动服务
    if ! systemctl restart zabbix-agent; then
        echo -e "${RED}错误：Zabbix Agent启动失败！${NC}"
        echo -e "${YELLOW}手动排查命令：su - zabbix -s /bin/bash -c '/usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -f'${NC}"
        exit 1
    fi
    # 设置开机自启
    systemctl enable zabbix-agent &>/dev/null

    # 验证状态
    if systemctl is-active --quiet zabbix-agent && ss -tulnp | grep -q zabbix_agentd; then
        echo -e "${GREEN}===== 部署成功！=====${NC}"
        echo -e "✅ 服务状态：active (running)"
        echo -e "✅ 监听端口：$(ss -tulnp | grep zabbix_agentd | awk '{print $4}')"
        echo -e "✅ 唯一Hostname：${UNIQUE_HOSTNAME}"
        echo -e "✅ 配置文件：/etc/zabbix/zabbix_agentd.conf"
        echo -e "✅ 日志路径：/var/log/zabbix/zabbix_agentd.log"
    else
        echo -e "${RED}错误：服务启动后未正常运行！${NC}"
        systemctl status zabbix-agent -l
        exit 1
    fi
}

# 主执行流程
check_network
clean_old
install_deps
config_repo
install_agent
config_agent
start_verify

echo -e "\n${GREEN}🎉 Zabbix Agent 7.0 APT安装部署全部完成！${NC}"

