#!/usr/bin/env bash
# MEISEC installeren met een activatiecode.
#
#   curl -fsSL https://get.meisec.eu | sudo bash -s -- <activatiecode> [installatie-opties]
#
# Dit script haalt de nieuwste MEISEC-release op, controleert de handtekening van de leverancier
# en start daarna install.sh. De activatiecode krijg je van je leverancier (MSA-XXXXX-...).
# Opties worden doorgegeven aan install.sh, bijvoorbeeld: --domain meisec.example.nl --tls internal
# Alleen ophalen (bijv. voor herstel): ... | sudo MEISEC_DOWNLOAD_ONLY=1 bash -s -- <activatiecode>
set -Eeuo pipefail
API="https://licenties.meisec.eu"
CHANNEL="${MEISEC_CHANNEL:-stable}"

if [ -t 1 ]; then B=$'\e[1m'; G=$'\e[32m'; R=$'\e[31m'; N=$'\e[0m'; else B=; G=; R=; N=; fi
die() { printf '%s✗ %s%s\n' "$R" "$*" "$N" >&2; exit 1; }
ok()  { printf '%s✓%s %s\n' "$G" "$N" "$*"; }

[ "$(id -u)" = 0 ] || die "Voer dit uit als root: curl -fsSL ${API/licenties/get} | sudo bash -s -- <activatiecode>"
CODE="${1:-}"; [ $# -gt 0 ] && shift
if [ -z "$CODE" ]; then
  [ -r /dev/tty ] || die "Geef de activatiecode mee: ... | sudo bash -s -- MSA-XXXXX-XXXXX-XXXXX-XXXXX"
  printf 'Activatiecode: ' >/dev/tty; IFS= read -r CODE </dev/tty
fi
CODE="$(printf '%s' "$CODE" | tr -d '[:space:]')"
[ -n "$CODE" ] || die "Geen activatiecode opgegeven."

for t in curl tar openssl sha256sum; do
  command -v "$t" >/dev/null || die "'$t' ontbreekt. Installeer het (bijv. apt-get install -y curl tar openssl coreutils) en probeer opnieuw."
done

printf '%sMEISEC ophalen%s\n' "$B" "$N"
WORK="$(mktemp -d)"; trap 'rm -rf "$WORK"' EXIT
# Nieuwste release opvragen; bij een fout de melding van de licentieserver tonen
code="$(curl -sS -o "$WORK/info" -w '%{http_code}' -H "Authorization: Bearer $CODE" "$API/api/v1/releases/latest?channel=$CHANNEL&format=env")" \
  || die "Kan $API niet bereiken. Controleer de internetverbinding en of uitgaand verkeer naar poort 443 is toegestaan."
if [ "$code" != 200 ]; then
  die "$(sed -n 's/.*"error":"\([^"]*\)".*/\1/p' "$WORK/info" | head -n1 || true) (HTTP $code)"
fi
VERSION="$(sed -n 's/^VERSION=//p' "$WORK/info")"; SHA="$(sed -n 's/^SHA256=//p' "$WORK/info")"
SIG="$(sed -n 's/^SIGNATURE=//p' "$WORK/info")"; URL="$(sed -n 's/^URL=//p' "$WORK/info")"
[[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]] || die "Onverwacht antwoord van de licentieserver."
ok "Nieuwste versie: $VERSION"

curl -fsS -H "Authorization: Bearer $CODE" -o "$WORK/meisec.tar.gz" "$URL" || die "Downloaden van de release mislukt."
echo "$SHA  $WORK/meisec.tar.gz" | sha256sum -c --quiet - || die "Controlegetal klopt niet: de download is beschadigd."
# Handtekening van de leverancier controleren (Ed25519, releasesleutel)
cat > "$WORK/release.pub" <<'PUB'
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAqqyWKsd7194WaQZ/EurtOrG2NSoW84vdw2/nJmhLwuw=
-----END PUBLIC KEY-----
PUB
printf '%s' "$SIG" | base64 -d > "$WORK/sig" 2>/dev/null || die "Ongeldige handtekening ontvangen."
openssl pkeyutl -verify -pubin -inkey "$WORK/release.pub" -rawin -in "$WORK/meisec.tar.gz" -sigfile "$WORK/sig" >/dev/null 2>&1 \
  || die "De handtekening van deze release klopt niet. Installeer niet en neem contact op met je leverancier."
ok "Handtekening van de leverancier gecontroleerd"

DEST="/opt/meisec-installer/$VERSION"
rm -rf "$DEST"; mkdir -p "$DEST"
tar -xzf "$WORK/meisec.tar.gz" -C "$DEST" --strip-components=1
chmod 0750 "$DEST/install.sh"
if [ "${MEISEC_DOWNLOAD_ONLY:-0}" = 1 ]; then
  ok "Release klaargezet in $DEST (niet geïnstalleerd). Bijvoorbeeld voor herstel: cd $DEST && sudo ./install.sh restore <back-up> --master-key <pad>"
  exit 0
fi
exec "$DEST/install.sh" install --code "$CODE" "$@" </dev/null
