#!/bin/sh
#
# B4K2.1 – Diagnose: Tabelle 201 und Gluetun‑Netzraum (anonymisiert)
# Nur lesend – keine Änderungen an Routing, Firewall oder Docker.
#

set -u

LOG_DIR="/path/to/vpn-platform/ha/logs"
STAMP="$(date +%Y%m%d_%H%M%S)"
LOG_FILE="${LOG_DIR}/B4K2-1_Table201_Gluetun_Diagnose_${STAMP}.log"
CONTAINER="gluetun-vpn"               # Platzhalter
TEST_SOURCE="192.168.xxx.xxx"         # Platzhalter für Quell‑IP
TEST_TARGET="8.8.8.8"                 # öffentliches Testziel

mkdir -p "$LOG_DIR"

{
    echo "============================================================"
    echo "B4K2.1 – Diagnose: Tabelle 201 und Gluetun‑Netzraum"
    echo "Zeitpunkt: $(date)"
    echo "Host: $(hostname)"
    echo "Logdatei: $LOG_FILE"
    echo "============================================================"
    echo

    echo "### 1. Benutzer und System"
    id
    uname -a
    echo

    echo "### 2. Einträge in /etc/iproute2/rt_tables"
    if [ -r /etc/iproute2/rt_tables ]; then
        cat /etc/iproute2/rt_tables
    else
        echo "HINWEIS: /etc/iproute2/rt_tables ist nicht lesbar oder fehlt."
    fi
    echo

    echo "### 3. Aktive Policy‑Routing‑Regeln"
    ip rule show 2>&1
    echo

    echo "### 4. Routingtabelle 201"
    ip route show table 201 2>&1
    echo

    echo "### 5. Alle Routen mit Bezug zu Tabelle 201, Gateway oder Docker"
    ip route show table all 2>&1 | grep -E 'table 201|192\.168\.xxx\.xxx|172\.|default' || true
    echo

    echo "### 6. Routingentscheidung für Testverkehr"
    echo "Test: Ziel $TEST_TARGET, Quelle $TEST_SOURCE, Eingang eth0"
    ip route get "$TEST_TARGET" from "$TEST_SOURCE" iif eth0 2>&1 || true
    echo

    echo "### 7. Routingentscheidung ohne simulierten Eingang"
    ip route get "$TEST_TARGET" from "$TEST_SOURCE" 2>&1 || true
    echo

    echo "### 8. Reverse‑Path‑Filter"
    for f in \
        /proc/sys/net/ipv4/conf/all/rp_filter \
        /proc/sys/net/ipv4/conf/default/rp_filter \
        /proc/sys/net/ipv4/conf/eth0/rp_filter \
        /proc/sys/net/ipv4/conf/eth1/rp_filter
    do
        if [ -r "$f" ]; then
            printf '%s = ' "$f"
            cat "$f"
        fi
    done
    echo

    echo "### 9. Gluetun‑Containerstatus"
    docker inspect -f \
        'Name={{.Name}} Status={{.State.Status}}{{if .State.Health}} Health={{.State.Health.Status}}{{end}} PID={{.State.Pid}} NetworkMode={{.HostConfig.NetworkMode}}' \
        "$CONTAINER" 2>&1 || true
    echo

    echo "### 10. Gluetun‑Netzwerkzuordnung"
    docker inspect -f \
        '{{range $name, $net := .NetworkSettings.Networks}}network={{$name}} ip={{$net.IPAddress}} gateway={{$net.Gateway}} mac={{$net.MacAddress}}{{println}}{{end}}' \
        "$CONTAINER" 2>&1 || true
    echo

    echo "### 11. Gluetun – IPv4‑Schnittstellen"
    docker exec "$CONTAINER" sh -c 'ip -4 addr show' 2>&1 || true
    echo

    echo "### 12. Gluetun – Policy‑Routing‑Regeln"
    docker exec "$CONTAINER" sh -c 'ip rule show' 2>&1 || true
    echo

    echo "### 13. Gluetun – sämtliche Routingtabellen"
    docker exec "$CONTAINER" sh -c 'ip route show table all' 2>&1 || true
    echo

    echo "### 14. Gluetun – Standardroute und Route zum Testziel"
    docker exec "$CONTAINER" sh -c "ip route show default; ip route get $TEST_TARGET" 2>&1 || true
    echo

    echo "### 15. Gluetun – Filterregeln"
    docker exec "$CONTAINER" sh -c 'iptables -S' 2>&1 || true
    echo

    echo "### 16. Gluetun – NAT‑Regeln"
    docker exec "$CONTAINER" sh -c 'iptables -t nat -S' 2>&1 || true
    echo

    IPT=""
    if command -v iptables-legacy >/dev/null 2>&1; then
        IPT="$(command -v iptables-legacy)"
    elif command -v iptables >/dev/null 2>&1; then
        IPT="$(command -v iptables)"
    fi

    echo "### 17. Host – DOCKER‑USER"
    if [ -n "$IPT" ]; then
        "$IPT" -S DOCKER-USER 2>&1 || true
        "$IPT" -nvL DOCKER-USER --line-numbers 2>&1 || true
    else
        echo "FEHLER: Kein iptables‑Werkzeug gefunden."
    fi
    echo

    echo "### 18. Host – Regeln mit Bezug zu Testquelle, Gluetun‑Netz oder Markierungen"
    if [ -n "$IPT" ]; then
        "$IPT"-save 2>&1 \
            | grep -E '192\.168\.xxx\.xxx|172\.29\.|MARK|CONNMARK|tun0|gluetun' \
            || true
    fi
    echo

    echo "============================================================"
    echo "Diagnose abgeschlossen."
    echo "Es wurden keine Routing‑, Firewall‑ oder Docker‑Regeln verändert."
    echo "============================================================"
} 2>&1 | tee "$LOG_FILE"

echo
echo "LOGDATEI=$LOG_FILE"