#!/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>
# Meldingen zijn Engels; in het Nederlands: ... | sudo MEISEC_LANG=nl bash -s -- <activatiecode> (gaat mee naar install.sh)
set -Eeuo pipefail
API="https://licenties.meisec.eu"
CHANNEL="${MEISEC_CHANNEL:-stable}"
case "${MEISEC_LANG:-}" in nl|en) ;; *) MEISEC_LANG=en ;; esac
export MEISEC_LANG
L() { if [ "$MEISEC_LANG" = nl ]; then printf '%s' "$1"; else printf '%s' "$2"; fi; }

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

[ "$(id -u)" = 0 ] || die "$(L 'Voer dit uit als root' 'Run this as root'): curl -fsSL ${API/licenties/get} | sudo bash -s -- <$(L activatiecode 'activation code')>"
CODE="${1:-}"; [ $# -gt 0 ] && shift
if [ -z "$CODE" ]; then
  # -r slaagt ook zonder terminal (Ansible, cron); pas openen laat zien of er echt een is
  { exec 3<>/dev/tty; } 2>/dev/null || die "$(L 'Geef de activatiecode mee' 'Pass the activation code'): ... | sudo bash -s -- MSA-XXXXX-XXXXX-XXXXX-XXXXX"
  printf '  ? %s: ' "$(L Activatiecode 'Activation code')" >&3; IFS= read -r CODE <&3; exec 3>&-
fi
CODE="$(printf '%s' "$CODE" | tr -d '[:space:]')"
[ -n "$CODE" ] || die "$(L 'Geen activatiecode opgegeven.' 'No activation code given.')"
# Zelfde vorm als install.sh controleert; een typfout meteen uitleggen in plaats van "onbekende code"
[[ "$(printf '%s' "$CODE" | tr -d -- '-' | tr '[:lower:]' '[:upper:]')" =~ ^MSA[0-9A-Z]{20}$ ]] \
  || die "$(L 'Dit is geen geldige activatiecode. Die ziet eruit als MSA-XXXXX-XXXXX-XXXXX-XXXXX (vier groepen van vijf tekens).' 'This is not a valid activation code. It looks like MSA-XXXXX-XXXXX-XXXXX-XXXXX (four groups of five characters).')"

for t in curl tar openssl sha256sum; do
  command -v "$t" >/dev/null || die "$(L "'$t' ontbreekt. Installeer het (bijv. apt-get install -y curl tar openssl coreutils) en probeer opnieuw." "'$t' is missing. Install it (e.g. apt-get install -y curl tar openssl coreutils) and try again.")"
done

printf '\n  %sMEISEC%s  %s%s%s\n\n' "$B" "$N" "$D" "$(L 'installatie voorbereiden' 'preparing the installation')" "$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" -H "Accept-Language: $MEISEC_LANG" "$API/api/v1/releases/latest?channel=$CHANNEL&format=env")" \
  || die "$(L "Kan $API niet bereiken. Controleer de internetverbinding en of uitgaand verkeer naar poort 443 is toegestaan." "Cannot reach $API. Check the internet connection and that outbound traffic to port 443 is allowed.")"
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 "$(L 'Onverwacht antwoord van de licentieserver.' 'Unexpected answer from the licence server.')"
ok "$(L 'Nieuwste versie' 'Newest version'): $VERSION"

curl -fsS -H "Authorization: Bearer $CODE" -H "Accept-Language: $MEISEC_LANG" -o "$WORK/meisec.tar.gz" "$URL" || die "$(L 'Downloaden van de release mislukt.' 'Downloading the release failed.')"
echo "$SHA  $WORK/meisec.tar.gz" | sha256sum -c --quiet - || die "$(L 'Controlegetal klopt niet: de download is beschadigd.' 'Checksum mismatch: the download is damaged.')"
# 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 "$(L 'Ongeldige handtekening ontvangen.' 'Invalid signature received.')"
openssl pkeyutl -verify -pubin -inkey "$WORK/release.pub" -rawin -in "$WORK/meisec.tar.gz" -sigfile "$WORK/sig" >/dev/null 2>&1 \
  || die "$(L 'De handtekening van deze release klopt niet. Installeer niet en neem contact op met je leverancier.' 'The signature of this release does not verify. Do not install; contact your supplier.')"
ok "$(L 'Handtekening van de leverancier gecontroleerd' 'Supplier signature verified')"

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 "$(L "Release klaargezet in $DEST (niet geïnstalleerd). Bijvoorbeeld voor herstel: cd $DEST && sudo ./install.sh restore <back-up> --master-key <pad>" "Release prepared in $DEST (not installed). For example for a restore: cd $DEST && sudo ./install.sh restore <backup> --master-key <path>")"
  exit 0
fi
exec "$DEST/install.sh" install --code "$CODE" "$@" </dev/null
