#!/usr/bin/env bash
# Seit dem 23.09.2026 sind die Webserver aus dem Internet nur noch fuer
# 94.31.93.15 per SSH erreichbar (Cloud-Firewall). Von hier aus laeuft der
# Zugang ueber das INTERNE Netz - dieser Server (10.0.0.6) haengt im selben
# Netzwerk. Deshalb 10.0.1.1 und 10.0.1.2 statt der oeffentlichen Adressen,
# und Frontend 2 braucht keinen Umweg ueber Frontend 1 mehr.
# Prüft, ob der Produktionsverbund unseren Shop (Shopware 6.7.14.1) aufnehmen kann.
# Ändert nichts, schreibt nur einen Bericht.
#
# Aufruf: pruefe-ziel.sh <zugangsordner> [berichtsdatei]
set -uo pipefail

ACCESS="${1:?Zugangsordner fehlt}"
REPORT="${2:-/tmp/ziel-bericht-$(date +%Y%m%d-%H%M).txt}"

FE1_INT=10.0.1.1; FE2=10.0.1.2
DB1=10.0.3.1; DB2=10.0.3.2; DB3=10.0.3.3; REDIS=10.0.2.1

SSHO=(-n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectTimeout=15)
SCPO=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectTimeout=15)

on() {
    local key="$1" host="$2"; shift 2
    if [ "$key" = fe1 ]; then
        sshpass -f "$ACCESS/fe1" ssh "${SSHO[@]}" "root@$FE1_INT" "$@"
    else
        sshpass -f "$ACCESS/$key" ssh "${SSHO[@]}" \
            -o ProxyCommand="sshpass -f $ACCESS/fe1 ssh ${SCPO[*]} -W %h:%p root@$FE1_INT" "root@$host" "$@"
    fi
}

ok()   { printf '  [ok]   %s\n' "$*"; }
warn() { printf '  [!]    %s\n' "$*"; }
bad()  { printf '  [FEHL] %s\n' "$*"; }

{
echo "Zielsystem-Prüfung für Shopware 6.7.14.1 – $(date '+%d.%m.%Y %H:%M')"
echo

# ------------------------------------------------------------------ Frontends
for n in "fe1 $FE1_INT" "fe2 $FE2"; do
    set -- $n; key="$1"; host="$2"
    echo "== Frontend $key ($host)"
    # Werte einzeln und benannt abfragen, damit nichts durcheinanderläuft
    probe=$(on "$key" "$host" 'echo "php=$(php -r "echo PHP_VERSION;")"; \
        echo "module=$(php -m | tr "\n" " ")"; \
        echo "memory=$(php -r "echo ini_get(\"memory_limit\");")"; \
        echo "frei=$(df --output=avail -BG / | tail -1 | tr -dc "0-9")"; \
        echo "composer=$(composer --version 2>/dev/null | head -1)"; \
        echo "node=$(node -v 2>/dev/null || echo nein)"; \
        echo "fpm=$(systemctl is-active php8.3-fpm 2>/dev/null)"' 2>/dev/null)

    phpver=$(sed -n "s/^php=//p" <<< "$probe")
    module=$(sed -n "s/^module=//p" <<< "$probe")
    frei=$(sed -n "s/^frei=//p" <<< "$probe")

    case "$phpver" in
        8.2.*|8.3.*|8.4.*|8.5.*) ok "PHP $phpver (von 6.7.14.1 unterstützt)";;
        *) bad "PHP ${phpver:-unbekannt} – Shopware 6.7 verlangt 8.2 bis 8.5";;
    esac

    fehlend=""
    for e in curl dom fileinfo gd iconv intl mbstring openssl pdo_mysql simplexml sodium xml zip zlib redis; do
        grep -qiw "$e" <<< "$module" || fehlend="$fehlend $e"
    done
    [ -z "$fehlend" ] && ok "alle benötigten PHP-Erweiterungen vorhanden (inkl. phpredis)" \
                      || bad "PHP-Erweiterungen fehlen:$fehlend"
    grep -qi "opcache" <<< "$module" && ok "OPcache vorhanden" || warn "OPcache nicht geladen"
    grep -qi "apcu" <<< "$module" || warn "APCu fehlt – Shopware nutzt es für den Dateicache, ist aber nicht zwingend"

    if [ -n "$frei" ] && [ "$frei" -ge 15 ]; then ok "${frei} GB frei"
    elif [ -n "$frei" ]; then warn "nur ${frei} GB frei – Code, vendor und Cache brauchen rund 8 GB je Frontend"
    else warn "Plattenplatz nicht ermittelbar"; fi

    sed -n "s/^memory=/  Speichergrenze: /p;s/^composer=/  /p;s/^fpm=/  php8.3-fpm: /p" <<< "$probe"
    node=$(sed -n "s/^node=//p" <<< "$probe")
    [ "$node" = nein ] && warn "kein Node – Storefront/Administration müssen vorgebaut geliefert werden" || ok "Node $node"
    echo
done

# ------------------------------------------------------------------ Datenbank
echo "== Galera-Cluster"
cluster=$(on db1 "$DB1" 'mariadb -N -e "select @@version; show status like \"wsrep_cluster_size\"; show status like \"wsrep_cluster_status\"; select @@innodb_buffer_pool_size div 1024 div 1024; select @@max_allowed_packet div 1024 div 1024; select @@character_set_server, @@collation_server; select @@group_concat_max_len"' 2>/dev/null)
echo "$cluster" | sed 's/^/  /'
ver=$(echo "$cluster" | head -1)
case "$ver" in 10.1[1-9]*|10.[2-9]*|11.*) ok "MariaDB $ver (6.7 verlangt mindestens 10.11)";; *) bad "MariaDB $ver zu alt für 6.7";; esac
echo "$cluster" | grep -q "Primary" && ok "Cluster ist Primary" || bad "Cluster nicht Primary"
echo
echo "== Vorhandene Datenbanken und Benutzer"
on db1 "$DB1" 'mariadb -N -e "select schema_name from information_schema.schemata"; echo "--"; mariadb -N -e "select user, host from mysql.user where user not like \"mysql%\" and user <> \"root\""' 2>/dev/null | sed 's/^/  /'
echo

# --------------------------------------------------------------------- Redis
echo "== Redis"
on redis "$REDIS" 'redis-server -v | cut -d" " -f3; grep -E "^(maxmemory|maxmemory-policy|appendonly|databases)" /etc/redis/redis.conf' 2>/dev/null | sed 's/^/  /'
warn "Belegte Redis-Datenbanken prüfen: das Altsystem nutzt 0-3 und 5. Unser Shop braucht eigene Indizes oder ein eigenes Präfix."
echo

# ------------------------------------------------------- Object Storage (S3)
echo "== Object Storage"
on fe1 "$FE1_INT" 'cd /var/www/shopware && export AWS_ACCESS_KEY_ID=$(grep -m1 ^S3_KEY= .env.local | cut -d= -f2) \
    AWS_SECRET_ACCESS_KEY=$(grep -m1 ^S3_SECRET= .env.local | cut -d= -f2); \
    EP=$(grep -m1 ^S3_ENDPOINT= .env.local | cut -d= -f2); \
    echo "Endpunkt: $EP"; aws --endpoint-url $EP s3 ls 2>&1 | head' 2>/dev/null | sed 's/^/  /'
echo
echo "== Hinweise"
echo "  - Unser Shop bringt 4.795 Artikel, 5.062 Medien (5,0 GB) und 5,4 GB Vorschaubilder mit."
echo "  - Das Altsystem belegt eine 26 GB große dev.log auf Frontend 1."
echo "  - Node ist auf keinem Frontend vorhanden: Storefront und Administration müssen"
echo "    im Entwicklungssystem gebaut und als fertige Dateien mitgeliefert werden."
} | tee "$REPORT"
echo
echo "Bericht: $REPORT"
