#!/bin/bash
# =============================================
# v2rayN 代理管理脚本 (终极增强版)
# 支持：Rocky Linux 8/9, Ubuntu 22.04/24.04
# 功能：部署代理 | 卸载代理 | 测试代理 | Docker/K8S 专用配置
# =============================================
# 默认配置参数 - 使用已验证的工作端口
DEFAULT_PROXY_HOST="10.0.0.1"   # Windows宿主机IP
DEFAULT_SOCKS_PORT="10810"      # 已验证可用的SOCKS端口
DEFAULT_HTTP_PORT="10811"       # 已验证可用的HTTP端口

# 检查 root 权限
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo "⚠️ 请使用 root 权限运行此脚本！"
        echo "  使用命令: sudo $0"
        exit 1
    fi
}

# 安装必要工具
install_tools() {
    echo "安装必要工具..."
    if command -v apt &> /dev/null; then
        apt update -qq
        apt install -y curl telnet net-tools
    elif command -v dnf &> /dev/null; then
        dnf install -y curl telnet net-tools
    elif command -v yum &> /dev/null; then
        yum install -y curl telnet net-tools
    fi
}

# 测试代理连接 - 修复版（直接测试代理功能）
test_proxy_connection() {
    local host=$1
    local socks_port=$2
    local http_port=$3
    
    echo -e "\n🔍 测试代理连接..."
    
    # 测试基础连接
    echo "测试到主机($host)的连通性..."
    if ! ping -c 2 -W 1 "$host" &> /dev/null; then
        echo "❌ 无法连接到主机 $host，请检查网络配置！"
        return 1
    else
        echo "✅ 主机连通性测试通过"
    fi
    
    # 测试 HTTP 代理功能（更可靠）
    echo "测试 HTTP 代理功能..."
    local proxy_ip=$(curl -s -m 5 -x "http://$host:$http_port" "http://ifconfig.me" 2>/dev/null)
    if [ -z "$proxy_ip" ]; then
        echo "❌ HTTP 代理功能测试失败"
        # 检查端口是否可连接（诊断用）
        if timeout 2 bash -c "cat < /dev/null > /dev/tcp/$host/$http_port" 2>/dev/null; then
            echo "⚠️ 端口可连接但代理服务不响应"
        else
            echo "⚠️ 端口不可达，可能是防火墙问题"
        fi
        return 1
    else
        echo "✅ HTTP 代理功能测试成功！当前 IP: $proxy_ip"
    fi
    
    # 测试 SOCKS 代理功能
    echo "测试 SOCKS5 代理功能..."
    local socks_ip=$(curl -s -m 5 -x "socks5://$host:$socks_port" "http://ifconfig.me" 2>/dev/null)
    if [ -z "$socks_ip" ]; then
        echo "⚠️ SOCKS5 代理功能测试失败（某些系统curl不支持SOCKS5）"
    else
        echo "✅ SOCKS5 代理功能测试成功！当前 IP: $socks_ip"
    fi
    
    return 0
}

# 部署代理 - 修复版
deploy_proxy() {
    echo -e "\n🛠️ 开始部署代理..."
    
    # 获取用户输入
    read -p "请输入代理主机 IP [$DEFAULT_PROXY_HOST]: " proxy_host
    proxy_host=${proxy_host:-$DEFAULT_PROXY_HOST}
    read -p "请输入 SOCKS5 端口 [$DEFAULT_SOCKS_PORT]: " socks_port
    socks_port=${socks_port:-$DEFAULT_SOCKS_PORT}
    read -p "请输入 HTTP 代理端口 [$DEFAULT_HTTP_PORT]: " http_port
    http_port=${http_port:-$DEFAULT_HTTP_PORT}
    
    # 测试连接
    if ! test_proxy_connection "$proxy_host" "$socks_port" "$http_port"; then
        echo "❌ 代理连接测试失败，请解决上述问题后再试！"
        return 1
    fi
    
    # 1. 配置系统环境变量代理
    echo "配置系统环境变量代理..."
    cat << EOF > /etc/profile.d/v2ray_proxy.sh
# v2rayN 代理设置
export http_proxy="http://$proxy_host:$http_port"
export https_proxy="http://$proxy_host:$http_port"
export ftp_proxy="http://$proxy_host:$http_port"
export socks_proxy="socks5://$proxy_host:$socks_port"
export no_proxy="localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn"
alias checkproxy='curl -s http://ifconfig.me'
EOF
    
    # 立即生效
    source /etc/profile.d/v2ray_proxy.sh
    
    # 2. 配置 APT 代理 (Ubuntu/Debian)
    if command -v apt &> /dev/null; then
        echo "配置 APT 代理..."
        cat << EOF > /etc/apt/apt.conf.d/99v2rayproxy
Acquire::http::Proxy "http://$proxy_host:$http_port";
Acquire::https::Proxy "http://$proxy_host:$http_port";
EOF
    fi
    
    # 3. 配置 YUM/DNF 代理 (Rocky/RHEL)
    if command -v dnf &> /dev/null || command -v yum &> /dev/null; then
        echo "配置 YUM/DNF 代理..."
        for conf_file in /etc/yum.conf /etc/dnf/dnf.conf; do
            if [ -f "$conf_file" ]; then
                # 删除旧代理设置
                sed -i '/^proxy=/d' "$conf_file"
                # 添加新代理设置
                echo "proxy=http://$proxy_host:$http_port" >> "$conf_file"
            fi
        done
    fi
    
    # 4. 配置 Docker 代理
    if command -v docker &> /dev/null; then
        echo "配置 Docker 代理..."
        mkdir -p /etc/systemd/system/docker.service.d
        cat << EOF > /etc/systemd/system/docker.service.d/v2ray_proxy.conf
[Service]
Environment="HTTP_PROXY=http://$proxy_host:$http_port"
Environment="HTTPS_PROXY=http://$proxy_host:$http_port"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn"
EOF
        systemctl daemon-reload
        systemctl restart docker
    fi
    
    # 5. 配置 Git 代理
    if command -v git &> /dev/null; then
        echo "配置 Git 代理..."
        git config --global http.proxy "http://$proxy_host:$http_port"
        git config --global https.proxy "http://$proxy_host:$http_port"
    fi
    
    # 6. 配置 wget
    if command -v wget &> /dev/null; then
        echo "配置 wget..."
        cat << EOF > /etc/wgetrc
use_proxy = on
http_proxy = http://$proxy_host:$http_port
https_proxy = http://$proxy_host:$http_port
EOF
    fi
    
    # 7. 配置 npm
    if command -v npm &> /dev/null; then
        echo "配置 npm..."
        npm config set proxy "http://$proxy_host:$http_port"
        npm config set https-proxy "http://$proxy_host:$http_port"
    fi
    
    echo -e "\n✅ 代理部署完成！"
    echo "============================================="
    echo "系统代理: http://$proxy_host:$http_port"
    echo "SOCKS5代理: socks5://$proxy_host:$socks_port"
    echo "当前公网IP: $(curl -s -x http://$proxy_host:$http_port http://ifconfig.me)"
    echo "============================================="
    echo -e "\n测试命令:"
    echo "1. 检查代理IP: checkproxy"
    echo "2. 测试网络: curl https://www.google.com"
    echo "3. 更新系统: sudo apt update 或 sudo dnf update"
    echo "4. Docker测试: docker pull alpine"
}

# 卸载代理
uninstall_proxy() {
    echo -e "\n🧹 开始卸载代理..."
    
    # 1. 移除系统环境变量代理
    echo "移除系统环境变量代理..."
    rm -f /etc/profile.d/v2ray_proxy.sh
    
    # 2. 移除APT代理
    if [ -f "/etc/apt/apt.conf.d/99v2rayproxy" ]; then
        echo "移除APT代理..."
        rm -f /etc/apt/apt.conf.d/99v2rayproxy
    fi
    
    # 3. 移除YUM/DNF代理
    for conf_file in /etc/yum.conf /etc/dnf/dnf.conf; do
        if [ -f "$conf_file" ]; then
            echo "移除$conf_file中的代理设置..."
            sed -i '/^proxy=/d' "$conf_file"
        fi
    done
    
    # 4. 移除Docker代理
    if [ -d "/etc/systemd/system/docker.service.d" ]; then
        echo "移除Docker代理..."
        rm -f /etc/systemd/system/docker.service.d/v2ray_proxy.conf
        if command -v docker &> /dev/null; then
            systemctl daemon-reload
            systemctl restart docker
        fi
    fi
    
    # 5. 移除Git代理
    if command -v git &> /dev/null; then
        echo "移除Git代理..."
        git config --global --unset http.proxy
        git config --global --unset https.proxy
    fi
    
    # 6. 移除wget配置
    if [ -f "/etc/wgetrc" ]; then
        echo "移除wget代理..."
        sed -i '/use_proxy/d' /etc/wgetrc
        sed -i '/http_proxy/d' /etc/wgetrc
        sed -i '/https_proxy/d' /etc/wgetrc
    fi
    
    # 7. 移除npm代理
    if command -v npm &> /dev/null; then
        echo "移除npm代理..."
        npm config delete proxy
        npm config delete https-proxy
    fi
    
    # 清理环境变量
    unset http_proxy
    unset https_proxy
    unset ftp_proxy
    unset socks_proxy
    unset no_proxy
    
    echo -e "\n✅ 代理已完全卸载！"
    echo "============================================="
    echo "当前公网IP: $(curl -s http://ifconfig.me)"
    echo "============================================="
    echo "注意：需要重新打开终端或执行以下命令使更改完全生效："
    echo "source /etc/profile"
}

# 配置 Docker 代理（新功能）
configure_docker_proxy() {
    echo -e "\n🐋 配置 Docker 代理..."
    
    read -p "请输入代理主机 IP [$DEFAULT_PROXY_HOST]: " proxy_host
    proxy_host=${proxy_host:-$DEFAULT_PROXY_HOST}
    read -p "请输入 HTTP 代理端口 [$DEFAULT_HTTP_PORT]: " http_port
    http_port=${http_port:-$DEFAULT_HTTP_PORT}
    
    # 创建Docker代理配置
    mkdir -p /etc/systemd/system/docker.service.d
    cat << EOF > /etc/systemd/system/docker.service.d/v2ray_proxy.conf
[Service]
Environment="HTTP_PROXY=http://$proxy_host:$http_port"
Environment="HTTPS_PROXY=http://$proxy_host:$http_port"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn"
EOF
    
    # 重启Docker
    systemctl daemon-reload
    systemctl restart docker
    
    # 测试Docker代理
    echo -e "\n测试 Docker 代理..."
    if docker info | grep -i proxy &> /dev/null; then
        echo "✅ Docker 代理配置成功！"
        echo "当前 Docker 代理设置:"
        docker info | grep -i proxy
    else
        echo "❌ Docker 代理配置可能失败，请检查配置"
    fi
    
    # 提供测试命令
    echo -e "\n测试 Docker 代理:"
    echo "1. 测试 Docker Hub 连接: docker search centos"
    echo "2. 拉取测试镜像: docker pull alpine"
}

# 配置 K8S 代理（新功能）
configure_k8s_proxy() {
    echo -e "\n☸️ 配置 Kubernetes 代理..."
    
    read -p "请输入代理主机 IP [$DEFAULT_PROXY_HOST]: " proxy_host
    proxy_host=${proxy_host:-$DEFAULT_PROXY_HOST}
    read -p "请输入 HTTP 代理端口 [$DEFAULT_HTTP_PORT]: " http_port
    http_port=${http_port:-$DEFAULT_HTTP_PORT}
    
    # 1. 配置 kubectl 代理
    echo "配置 kubectl 代理..."
    cat << EOF > /etc/profile.d/k8s_proxy.sh
# Kubernetes 代理设置
export http_proxy="http://$proxy_host:$http_port"
export https_proxy="http://$proxy_host:$http_port"
export no_proxy="localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn,kubernetes.default.svc"
EOF
    source /etc/profile.d/k8s_proxy.sh
    
    # 2. 配置 kubelet 代理
    echo "配置 kubelet 代理..."
    mkdir -p /etc/systemd/system/kubelet.service.d
    cat << EOF > /etc/systemd/system/kubelet.service.d/0-proxy.conf
[Service]
Environment="HTTP_PROXY=http://$proxy_host:$http_port"
Environment="HTTPS_PROXY=http://$proxy_host:$http_port"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn,kubernetes.default.svc"
EOF
    
    # 3. 配置 containerd 代理（如果使用containerd）
    if [ -f "/etc/containerd/config.toml" ]; then
        echo "配置 containerd 代理..."
        # 备份原始配置
        cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
        
        # 添加代理设置
        sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry\]/a \ \ \ \ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n\ \ \ \ \ \ endpoint = ["https://registry-1.docker.io"]\n\ \ \ \ \ \ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io".proxy]\n\ \ \ \ \ \ \ \ http_proxy = "http://$proxy_host:$http_port"\n\ \ \ \ \ \ \ \ https_proxy = "http://$proxy_host:$http_port"\n\ \ \ \ \ \ \ \ no_proxy = "localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.local,*.cn"' /etc/containerd/config.toml
    fi
    
    # 4. 重启服务
    systemctl daemon-reload
    systemctl restart kubelet
    if command -v containerd &> /dev/null; then
        systemctl restart containerd
    fi
    
    # 测试K8S代理
    echo -e "\n测试 Kubernetes 代理..."
    echo "✅ Kubernetes 代理配置成功！"
    
    # 提供测试命令
    echo -e "\n测试 Kubernetes 代理:"
    echo "1. 测试 kubectl: kubectl get nodes"
    echo "2. 测试镜像拉取: kubectl run test --image=nginx"
    
    # 显示当前配置
    echo -e "\n当前 Kubernetes 代理设置:"
    echo "kubectl 环境变量:"
    grep proxy /etc/profile.d/k8s_proxy.sh
    
    echo -e "\nkubelet 服务配置:"
    cat /etc/systemd/system/kubelet.service.d/0-proxy.conf 2>/dev/null || echo "未找到 kubelet 代理配置"
}

# 测试代理连接（菜单版）
test_proxy_connection_menu() {
    read -p "请输入代理主机 IP [$DEFAULT_PROXY_HOST]: " host
    host=${host:-$DEFAULT_PROXY_HOST}
    read -p "请输入 SOCKS5 端口 [$DEFAULT_SOCKS_PORT]: " socks
    socks=${socks:-$DEFAULT_SOCKS_PORT}
    read -p "请输入 HTTP 代理端口 [$DEFAULT_HTTP_PORT]: " http
    http=${http:-$DEFAULT_HTTP_PORT}
    
    test_proxy_connection "$host" "$socks" "$http"
}

# 显示当前代理设置
show_current_settings() {
    echo -e "\n📋 当前代理设置:"
    echo "----------------------------------------"
    echo "系统代理变量:"
    echo "http_proxy = ${http_proxy:-未设置}"
    echo "https_proxy = ${https_proxy:-未设置}"
    echo "socks_proxy = ${socks_proxy:-未设置}"
    echo "no_proxy = ${no_proxy:-未设置}"
    
    echo -e "\n包管理器代理:"
    if [ -f "/etc/apt/apt.conf.d/99v2rayproxy" ]; then
        echo "APT: 已设置代理"
        grep Proxy /etc/apt/apt.conf.d/99v2rayproxy
    else
        echo "APT: 未设置代理"
    fi
    
    if grep -q "^proxy=" /etc/yum.conf 2>/dev/null || grep -q "^proxy=" /etc/dnf/dnf.conf 2>/dev/null; then
        echo "YUM/DNF: 已设置代理"
        grep "^proxy=" /etc/yum.conf /etc/dnf/dnf.conf 2>/dev/null
    else
        echo "YUM/DNF: 未设置代理"
    fi
    
    echo -e "\nDocker代理:"
    if [ -f "/etc/systemd/system/docker.service.d/v2ray_proxy.conf" ]; then
        echo "Docker: 已设置代理"
        cat /etc/systemd/system/docker.service.d/v2ray_proxy.conf
    else
        echo "Docker: 未设置代理"
    fi
    
    echo -e "\nKubernetes代理:"
    if [ -f "/etc/systemd/system/kubelet.service.d/0-proxy.conf" ]; then
        echo "Kubelet: 已设置代理"
        cat /etc/systemd/system/kubelet.service.d/0-proxy.conf
    else
        echo "Kubelet: 未设置代理"
    fi
    
    if [ -f "/etc/profile.d/k8s_proxy.sh" ]; then
        echo "kubectl: 已设置代理"
        grep proxy /etc/profile.d/k8s_proxy.sh
    else
        echo "kubectl: 未设置代理"
    fi
}

# 显示菜单
show_menu() {
    clear
    echo "========================================"
    echo "  v2rayN 代理管理脚本 (终极增强版)"
    echo "  主机: $(hostname)"
    echo "  IP: $(hostname -I 2>/dev/null || echo '未知')"
    echo "  系统: $(grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '\"')"
    echo "========================================"
    echo "  1. 部署代理"
    echo "  2. 卸载代理"
    echo "  3. 测试代理连接"
    echo "  4. 查看当前代理设置"
    echo "  5. 配置 Docker 代理"
    echo "  6. 配置 Kubernetes 代理"
    echo "  7. 退出"
    echo "========================================"
    read -p "请选择操作 [1-7]: " choice
    case $choice in
        1) deploy_proxy ;;
        2) uninstall_proxy ;;
        3) test_proxy_connection_menu ;;
        4) show_current_settings ;;
        5) configure_docker_proxy ;;
        6) configure_k8s_proxy ;;
        7) 
            echo "退出脚本..."
            exit 0
            ;;
        *) 
            echo "无效选择！"
            ;;
    esac
    read -p "按 Enter 键继续..."
    show_menu
}

# 主函数
main() {
    check_root
    install_tools
    show_menu
}

# 执行主函数
main
