#!/usr/bin/env bash # Aktualisiert den llama-swap-Router (mostlygeek/llama-swap) auf den neuesten Release. # Wird vom MC2-„Router Update"-Button via `sudo bash …` als ROOT aufgerufen (kein internes sudo). # # Wichtig: llama-swap wird VOR dem Binary-Tausch gestoppt — sonst ist die laufende Binary # „Text file busy". Danach Stack-Check (echte Inferenz); bei Fehler Auto-Rollback. # # Exit 0 = neue Version verifiziert · 1 = fehlgeschlagen, Rollback ok (alte Version läuft) # · 2 = Update UND Rollback fehlgeschlagen (Stack evtl. kaputt — bitte prüfen) set -uo pipefail # bewusst KEIN -e: bei Fehlern kontrolliert zurückrollen statt hart abbrechen SWAP_BIN="${MC_SWAP_BIN:-/usr/local/bin/llama-swap}" BAK="${SWAP_BIN}.bak" # „letzte funktionierende Version" für Auto-Rollback SRC_DIR="$(cd "$(dirname "$0")" && pwd)" PIN_VER="${MC_SWAP_VERSION:-}" # leer = neuester Release die(){ echo "$1" >&2; exit 1; } start_swap(){ systemctl start llama-swap || systemctl restart llama-swap; } if [ -n "$PIN_VER" ]; then TAG="$PIN_VER" else TAG="$(curl -s https://api.github.com/repos/mostlygeek/llama-swap/releases/latest | jq -r .tag_name)" fi [ -n "$TAG" ] && [ "$TAG" != "null" ] || die "Konnte neuesten Release-Tag nicht ermitteln" # Asset-Name nutzt die nackte Nummer (z.B. v230 -> 230): llama-swap_230_linux_amd64.tar.gz NUM="${TAG#v}" ASSET="llama-swap_${NUM}_linux_amd64.tar.gz" URL="https://github.com/mostlygeek/llama-swap/releases/download/${TAG}/${ASSET}" TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT echo "Lade llama-swap ${TAG} …" curl -fsSL -o "$TMP/s.tgz" "$URL" || die "Download fehlgeschlagen" tar xzf "$TMP/s.tgz" -C "$TMP" || die "Entpacken fehlgeschlagen" NEW="$(find "$TMP" -type f -name llama-swap | head -1)" [ -n "$NEW" ] || die "llama-swap-Binary im Archiv nicht gefunden" # Sicherung der aktuellen (funktionierenden) Binary → Auto-Rollback [ -x "$SWAP_BIN" ] && { cp -a "$SWAP_BIN" "$BAK" || die "Backup fehlgeschlagen"; } # llama-swap stoppen (gibt die laufende Binary frei), tauschen, wieder starten echo "Stoppe llama-swap für den Binary-Tausch…" systemctl stop llama-swap if install -m 0755 "$NEW" "$SWAP_BIN" && [ -x "$SWAP_BIN" ]; then start_swap echo "Router auf ${TAG} aktualisiert — verifiziere Stack…" if bash "$SRC_DIR/stack-postcheck.sh"; then echo "Router-Update ${TAG} erfolgreich verifiziert." exit 0 fi echo "!! Stack-Check fehlgeschlagen — ROLLBACK auf vorherige Version." else echo "!! Binary-Tausch fehlgeschlagen — ROLLBACK auf vorherige Version." fi # Auto-Rollback auf die gesicherte Binary systemctl stop llama-swap if [ -x "$BAK" ] && install -m 0755 "$BAK" "$SWAP_BIN"; then start_swap if bash "$SRC_DIR/stack-postcheck.sh"; then echo "Rollback erfolgreich: vorherige llama-swap-Version läuft wieder. (Update ${TAG} NICHT angewendet.)" exit 1 fi fi echo "!!! Rollback fehlgeschlagen — Stack möglicherweise kaputt! Backup liegt unter ${BAK}." exit 2