#!/usr/bin/env bash
# BrowserDesk Relay — Docker-Update aus dem BrowserDesk-Feed (KB-0016).
#
# Im INSTALLATIONSORDNER ausführen (dort, wo docker-compose.yml und .env liegen — angelegt
# durch install-browserdesk-relay-docker.sh). Lädt die im Feed aktive Version, prüft die
# SHA-256, lädt das Image und startet den Stack neu. Der Zustand in ./data bleibt erhalten.
#
#   bash update-browserdesk-relay-docker.sh
set -euo pipefail

FEED="${BD_FEED:-https://updates.browserdesk.de/browserdesk-relay-docker}"

# Audit 04.09.2026 (S34): die Index-Datei des Feeds ist mit dem BrowserDesk-Feed-Schluessel signiert (ECDSA
# P-256, SHA-256). Ohne gueltige Signatur wird nichts installiert - ein untergeschobener Feed bleibt folgenlos.
BD_FEED_PUBKEY='-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEr0HItMnzx1CbztVnFFrIz2NJKr9b
hpYmU+VJ5AVCtoUni5zuMnzAu9DbKo8JeEBDQIMdj76zAbPuLz+Rk5QO7Q==
-----END PUBLIC KEY-----'
pruefe_feed_signatur() { # $1 = lokale Datei, $2 = URL der Datei (Signatur liegt unter URL.sig)
  command -v openssl >/dev/null 2>&1 || { echo "FEHLER: openssl fehlt - Feed-Signatur nicht pruefbar. Abbruch."; return 1; }
  local sig pub der
  sig="$(mktemp)"; pub="$(mktemp)"; der="$(mktemp)"
  if ! curl -fsSL --max-time 60 "$2.sig" -o "$sig"; then rm -f "$sig" "$pub" "$der"; echo "FEHLER: Signatur $2.sig fehlt - Abbruch."; return 1; fi
  printf '%s\n' "$BD_FEED_PUBKEY" > "$pub"
  if ! base64 -d "$sig" > "$der" 2>/dev/null; then rm -f "$sig" "$pub" "$der"; echo "FEHLER: Signatur $2.sig unlesbar - Abbruch."; return 1; fi
  if openssl dgst -sha256 -verify "$pub" -signature "$der" "$1" >/dev/null 2>&1; then rm -f "$sig" "$pub" "$der"; return 0; fi
  rm -f "$sig" "$pub" "$der"; echo "FEHLER: Signatur von $2 UNGUELTIG - Abbruch."; return 1
}
[ -f docker-compose.yml ] || { echo "FEHLER: bitte im Installationsordner ausführen (docker-compose.yml fehlt)."; exit 1; }

echo "==> Feed lesen: $FEED/updates.ini"
curl -fsSL "$FEED/updates.ini" -o updates.ini
pruefe_feed_signatur updates.ini "$FEED/updates.ini" || exit 1
VER="$(sed -n 's/^version=//p' updates.ini | tr -d '\r')"
SHA="$(sed -n 's/^sha256=//p' updates.ini | tr -d '\r')"
URL="$(sed -n 's/^url=//p' updates.ini | tr -d '\r')"
[ -n "$VER" ] || { echo "FEHLER: Feed unlesbar."; exit 1; }

CUR="$(sed -n 's/^RELAY_VERSION=//p' .env 2>/dev/null | tr -d '\r' || true)"
echo "==> Installiert: ${CUR:-unbekannt} — Feed: $VER"
if [ "$CUR" = "$VER" ]; then
  echo "Bereits aktuell — nichts zu tun."
  exit 0
fi

TAR="browserdesk-relay-docker-$VER.tar.gz"
echo "==> Image $VER laden"
curl -fL --progress-bar "$URL" -o "$TAR"
echo "==> SHA-256 prüfen"
echo "$SHA  $TAR" | sha256sum -c - || { echo "FEHLER: Prüfsumme stimmt NICHT — Abbruch."; exit 1; }
docker load < "$TAR"

if grep -q '^RELAY_VERSION=' .env 2>/dev/null; then
  sed -i.bak "s/^RELAY_VERSION=.*/RELAY_VERSION=$VER/" .env && rm -f .env.bak
else
  printf 'RELAY_VERSION=%s\n' "$VER" >> .env
fi

echo "==> Stack mit neuem Image starten"
docker compose up -d
docker image prune -f >/dev/null 2>&1 || true
rm -f "$TAR"

echo
echo "OK — Relay auf $VER aktualisiert. Zustand in ./data blieb erhalten."
echo "Rollback: RELAY_VERSION in .env zurückstellen und 'docker compose up -d' (altes Image muss noch geladen sein)."
