#!/bin/sh
# Der Prozess 1 des Tunnel-Containers.
#
# Er zieht wg0 hoch und tut danach nichts mehr. Genau das ist die Aufgabe: der
# Netz-Namensraum dieses Containers ist das, worin wg0, der Provisionierungs-
# Arbeiter, die Terminal-Bruecke, der interne DNS und das interne Gateway
# zusammen leben. Er darf nur enden, wenn Docker ihn beendet.
#
# Vorher stand hier — im Container des Arbeiters — `exec php artisan queue:work`.
# Damit hing der Namensraum am Leben eines PHP-Prozesses: ein Zeitueberlauf, ein
# fataler Fehler, ein Speicherlimit, und jede WireGuard-Sitzung riss ab.
set -u

CONF=/etc/wireguard/wg0.conf

# Ohne Konfiguration kein Tunnel — aber sehr wohl ein laufender Container. Sonst
# koennte eine Installation, in der der Betreiber den Tunnel noch gar nicht
# eingerichtet hat, den halben Stapel nicht starten: vier Dienste haengen an
# diesem Namensraum und kommen ohne ihn nicht hoch.
if [ -f "$CONF" ]; then
    # `|| true`: liegt das Interface aus einem frueheren Leben noch da, ist das
    # kein Grund, den Container sterben zu lassen. Die Zeile darunter sagt in
    # jedem Fall, was Sache ist.
    wg-quick up wg0 || true

    if wg show wg0 >/dev/null 2>&1; then
        echo "[vpn-hub] wg0 steht — $(wg show wg0 peers | grep -c .) Zugaenge geladen"
    else
        echo "[vpn-hub] WARNUNG: wg0 kam nicht hoch. $CONF pruefen." >&2
    fi
else
    echo "[vpn-hub] Kein $CONF — der Tunnel ist auf diesem Server noch nicht eingerichtet."
fi

# Sauber abbauen, wenn Docker den Container beendet. Ohne das laeuft `docker
# compose stop` in seine Zeitueberschreitung und schlaegt mit SIGKILL zu.
stop() {
    echo "[vpn-hub] Beende — wg0 wird abgebaut."
    wg-quick down wg0 2>/dev/null || true
    exit 0
}
trap stop TERM INT

# Warten, bis jemand kommt. `sleep` im Hintergrund plus `wait`, nicht `sleep`
# im Vordergrund: ein Signal erreicht die Shell nur, wenn sie gerade auf `wait`
# steht — sonst kaeme das `trap` oben erst nach Ablauf des Schlafs zum Zug.
while true; do
    sleep 86400 &
    wait $!
done
