#!/bin/bash
#
# VPN TUN tunnel installer v2
# Ставит sing-box в режиме настоящего TUN-туннеля (не прокси)
# Весь трафик хоста и Docker-контейнеров идёт через VPS автоматически.
#
set -e

VPS_DOMAIN="vpn.johnvps.ru"
VPN_URL="https://${VPS_DOMAIN}/vpn"

# ---------- проверки ----------
if [ "$EUID" -ne 0 ]; then
    echo "❌ Запустите с правами root:"
    echo "   curl -fsSL https://${VPS_DOMAIN}/vpn/install-v2.sh | bash"
    exit 1
fi

if ! command -v python3 >/dev/null 2>&1; then
    echo "❌ Требуется python3. Установите: apt install -y python3"
    exit 1
fi

echo "========================================="
echo "  🚀 Установка VPN-туннеля (sing-box TUN) v2"
echo "========================================="
echo ""

# ---------- 1. архитектура ----------
ARCH=$(uname -m)
case "$ARCH" in
    x86_64)  BINARY="sing-box-amd64" ;;
    aarch64) BINARY="sing-box-arm64" ;;
    *)       echo "❌ Неподдерживаемая архитектура: $ARCH"; exit 1 ;;
esac
echo "📦 Архитектура: $ARCH ($BINARY)"

# ---------- 2. /dev/net/tun ----------
if [ ! -c /dev/net/tun ]; then
    echo "⚠️  Создаём /dev/net/tun..."
    mkdir -p /dev/net
    mknod /dev/net/tun c 10 200
    chmod 600 /dev/net/tun
fi
echo "✅ /dev/net/tun готов"

# ---------- 3. IP forwarding ----------
echo "🔧 Включаем IP forwarding..."
cat > /etc/sysctl.d/99-vpn-tunnel.conf << 'SYSCTL'
net.ipv4.ip_forward=1
net.ipv4.conf.all.src_valid_mark=1
SYSCTL
sysctl -p /etc/sysctl.d/99-vpn-tunnel.conf >/dev/null
echo "✅ IP forwarding включён"

# ---------- 4. sing-box ----------
echo "📥 Скачиваем sing-box..."
curl -fsSL -o /usr/local/bin/sing-box "${VPN_URL}/${BINARY}"
chmod +x /usr/local/bin/sing-box
echo "✅ $(sing-box version 2>&1 | head -1)"

# ---------- 5. базовый конфиг ----------
echo "📥 Скачиваем конфиг с сервера..."
mkdir -p /etc/sing-box
curl -fsSL -o /etc/sing-box/config-template.json "${VPN_URL}/config-template.json"
echo "✅ Шаблон получен"

# ---------- 6. модификация конфига: добавляем TUN ----------
echo "🔧 Модифицируем конфиг под TUN-режим..."
python3 << 'PYEOF'
import json

with open('/etc/sing-box/config-template.json') as f:
    cfg = json.load(f)

tun = {
    "type": "tun",
    "tag": "tun-in",
    "interface_name": "tun0",
    "address": [
        "172.19.0.1/30"
    ],
    "mtu": 1400,
    "auto_route": True,
    "strict_route": True,
    "stack": "system",
    "route_exclude_address": [
        "127.0.0.0/8",
        "192.168.0.0/16",
        "10.0.0.0/8",
        "172.16.0.0/12"
    ]
}

# Убираем старый tun, если был; оставляем http/socks (не мешают)
existing = [ib for ib in cfg.get('inbounds', []) if ib.get('type') != 'tun']
cfg['inbounds'] = existing + [tun]

# Route
cfg.setdefault('route', {})
cfg['route']['auto_detect_interface'] = True

# final = первый не-direct outbound
for ob in cfg.get('outbounds', []):
    if ob.get('type') not in ('direct', 'block', 'dns'):
        cfg['route']['final'] = ob.get('tag', 'proxy')
        break

with open('/etc/sing-box/config.json', 'w') as f:
    json.dump(cfg, f, indent=2)

print("✅ Конфиг модифицирован")
PYEOF

# ---------- 7. валидация ----------
echo "🔍 Проверяем конфиг..."
sing-box check -c /etc/sing-box/config.json
echo "✅ Конфиг валиден"

# ---------- 8. systemd ----------
echo "⚙️  Создаём systemd-сервис..."
cat > /etc/systemd/system/sing-box.service << 'SERVICE'
[Unit]
Description=sing-box VPN tunnel (TUN mode)
After=network.target nss-lookup.target
Wants=network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/sing-box -c /etc/sing-box/config.json run
Restart=on-failure
RestartSec=10
LimitNOFILE=infinity
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE
DeviceAllow=/dev/net/tun rw

[Install]
WantedBy=multi-user.target
SERVICE

systemctl daemon-reload
systemctl enable sing-box >/dev/null 2>&1
echo "✅ Сервис создан"

# ---------- 9. утилиты ----------

cat > /usr/local/bin/vpn-on << 'ON'
#!/bin/bash
if [ "$EUID" -ne 0 ]; then exec sudo "$0" "$@"; fi

echo "🚀 Включаем VPN-туннель..."
systemctl start sing-box
sleep 4

if ! systemctl is-active --quiet sing-box; then
    echo "❌ sing-box не запустился. Логи:"
    journalctl -u sing-box -n 30 --no-pager
    exit 1
fi

if ! ip link show tun0 >/dev/null 2>&1; then
    echo "⚠️  tun0 не найден — проверьте логи: journalctl -u sing-box -n 30"
fi

echo "✅ Туннель активен"
echo "🌍 Внешний IP: $(curl -4 -s --max-time 10 ifconfig.me)"
ip -brief a show tun0 2>/dev/null || true
ON
chmod +x /usr/local/bin/vpn-on

cat > /usr/local/bin/vpn-off << 'OFF'
#!/bin/bash
if [ "$EUID" -ne 0 ]; then exec sudo "$0" "$@"; fi

echo "🛑 Выключаем VPN..."
systemctl stop sing-box
sleep 2

# Чистим конфиги старой (прокси) версии, если остались
rm -f /etc/apt/apt.conf.d/95proxy /etc/wgetrc /etc/profile.d/vpn-proxy.sh
git config --global --unset http.proxy  2>/dev/null || true
git config --global --unset https.proxy 2>/dev/null || true

echo "✅ Туннель выключен, трафик идёт напрямую"
OFF
chmod +x /usr/local/bin/vpn-off

cat > /usr/local/bin/vpn-status << 'STATUS'
#!/bin/bash
if systemctl is-active --quiet sing-box 2>/dev/null; then
    echo "✅ VPN АКТИВЕН (TUN-туннель)"
    echo "🌍 Внешний IP: $(curl -4 -s --max-time 10 ifconfig.me)"
    ip -brief a show tun0 2>/dev/null || echo "⚠️  tun0 не найден"
else
    echo "❌ VPN ВЫКЛЮЧЕН"
fi
STATUS
chmod +x /usr/local/bin/vpn-status

# ---------- 10. итог ----------
echo ""
echo "🎉 Установка завершена!"
echo ""
echo "  vpn-on      — включить туннель"
echo "  vpn-off     — выключить туннель"
echo "  vpn-status  — проверить состояние"
echo ""
echo "⚠️  После vpn-on весь трафик хоста и Docker-контейнеров пойдёт через ${VPS_DOMAIN}."
echo "👉 Запустите: vpn-on"
