install.sh erkennt jetzt selbststaendig eine bestehende Installation (an sqlite.db) und verhaelt sich entsprechend: - Keine vorhandene Installation -> normale Frischinstallation (wie bisher). - Vorhanden, SCHEMA_VERSION unveraendert -> einfaches In-Place-Update, kein Backup noetig (rsync schliesst sqlite.db ohnehin aus). - Vorhanden, SCHEMA_VERSION unbekannt/abweichend -> Update MIT Sicherheitsnetz: die KOMPLETTE bisherige Installation (Code, venv, Datenbank, Schluessel) wird vorher 1:1 nach /srv/tesm-backup-pre-migration-<timestamp> kopiert (bewusst nicht nur die Datenbank -- ein reines DB-Rollback wuerde beim naechsten Start mit dem NEUEN Code sofort denselben Migrationsfehler wiederholen). Die eigentliche Schema-Migration uebernimmt danach die App selbst beim Start (_ensure_schema() in app.py). Kommt der Dienst anschliessend per HTTP-Check auf /login nachweislich NICHT gesund hoch, wird automatisch die komplette Sicherung zurueckgespielt und bleibt zur manuellen Pruefung erhalten. Kommt er gesund hoch, gilt die Migration als erfolgreich und das Backup wird geloescht. update.sh delegiert diese gesamte /srv/tesm-spezifische Logik jetzt an install.sh und ist selbst nur noch fuer das Ablösen AELTERER, TESM vorausgehender Installationsstufen zustaendig (PoE Manager unter /srv/poe_manager, das urspruengliche reine Bash-Setup) -- bleibt aber als bequemer Ein-Skript-Bootstrapper (Download + Entpacken + Aufruf von install.sh) bestehen, wie gewuenscht. install.sh selbst ist dadurch jetzt auch OHNE update.sh direkt aus einem entpackten Release-Paket lauffaehig und erkennt ein Update trotzdem korrekt. VERSION: 1.0.3 (SCHEMA_VERSION unveraendert, 1 -- keine echte Schema- Aenderung in diesem Release, In-Place-Update-Pfad bleibt der Normalfall).
114 lines
5.2 KiB
Bash
114 lines
5.2 KiB
Bash
#!/bin/bash
|
|
# ============================================================================
|
|
# TESM — Update/Reinstall (Bootstrapper)
|
|
# Lädt ein gepacktes Gitea-Release per HTTP herunter (kein "git clone"
|
|
# nötig) und übergibt die eigentliche Installations-/Update-Logik an
|
|
# install.sh aus dem Paket -- das erkennt selbstständig, ob unter
|
|
# /srv/tesm schon eine Installation existiert, und aktualisiert sie
|
|
# entsprechend (In-Place bei unverändertem Datenbank-Schema, sonst mit
|
|
# automatischem Backup + Migrations-Sicherheitsnetz samt Rückroll-
|
|
# Möglichkeit -- siehe install.sh für Details).
|
|
#
|
|
# Dieses Skript selbst ist nur noch für das Ablösen ÄLTERER, TESM
|
|
# vorausgehender Installationsstufen auf diesem Host zuständig:
|
|
# 1. Das ursprüngliche, reine Bash-Setup aus dem separaten Repo
|
|
# https://gitea.int.eertmoed.net/WiS/Aruba-PoE (rpi-check.service +
|
|
# statische ips.list, keine Datenbank/Web-UI).
|
|
# 2. Die spätere Flask-App "PoE Manager" unter /srv/poe_manager
|
|
# (poe_web.service, Vorgänger von TESM in diesem Repo vor der
|
|
# Umbenennung).
|
|
# Beide werden NICHT gelöscht, sondern nur gestoppt/deaktiviert und
|
|
# (falls vorhanden) beiseite verschoben.
|
|
#
|
|
# Auszuführen als root auf dem Zielsystem:
|
|
# sudo ./update.sh
|
|
# Optional übersteuerbar (z.B. für eine bestimmte Version statt "latest"):
|
|
# TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh
|
|
# Für ein privates Repo wird ein Zugriffstoken benötigt:
|
|
# TESM_GITEA_USER=alientim TESM_GITEA_TOKEN=<token> sudo -E ./update.sh
|
|
# ============================================================================
|
|
set -e
|
|
|
|
GITEA_BASE="${TESM_GITEA_BASE:-https://gitea.int.eertmoed.net}"
|
|
REPO_OWNER="${TESM_REPO_OWNER:-alientim}"
|
|
REPO_NAME="${TESM_REPO_NAME:-tesm}"
|
|
RELEASE_TAG="${TESM_RELEASE_TAG:-latest}"
|
|
GITEA_USER="${TESM_GITEA_USER:-}"
|
|
GITEA_TOKEN="${TESM_GITEA_TOKEN:-}"
|
|
PACKAGE_NAME="tesm-${RELEASE_TAG}.tar.gz"
|
|
DOWNLOAD_URL="${GITEA_BASE}/${REPO_OWNER}/${REPO_NAME}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}"
|
|
|
|
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
|
|
WORK_DIR="/tmp/tesm-update-$(date +%s)"
|
|
PACKAGE_FILE="$WORK_DIR/${PACKAGE_NAME}"
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "Bitte als root ausführen (sudo ./update.sh)." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${YELLOW}============================================================================${NC}"
|
|
echo -e "${YELLOW} TESM Update/Reinstall — Release \"${RELEASE_TAG}\"${NC}"
|
|
echo -e "${YELLOW}============================================================================${NC}"
|
|
echo
|
|
echo "Lädt das Release-Paket herunter und übergibt Installation/Update an"
|
|
echo "install.sh daraus -- das erkennt selbst, ob es sich um eine frische"
|
|
echo "Installation oder ein Update einer bestehenden handelt, und sichert"
|
|
echo "die Datenbank bei einer Schema-Änderung automatisch vorsorglich ab."
|
|
echo
|
|
echo "Ältere, TESM vorausgehende Installationsstufen (PoE Manager unter"
|
|
echo "/srv/poe_manager, das ursprüngliche reine Bash-Setup) werden dabei"
|
|
echo "erkannt, gestoppt/deaktiviert und beiseite verschoben (nicht gelöscht)."
|
|
echo
|
|
|
|
read -r -p "Fortfahren? [y/N] " confirm
|
|
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
|
|
echo "Abgebrochen — nichts wurde verändert."
|
|
exit 0
|
|
fi
|
|
|
|
echo -e "${RED}→${NC} Lade Paket von ${DOWNLOAD_URL}..."
|
|
mkdir -p "$WORK_DIR"
|
|
CURL_AUTH=()
|
|
if [ -n "$GITEA_USER" ] && [ -n "$GITEA_TOKEN" ]; then
|
|
CURL_AUTH=(-u "${GITEA_USER}:${GITEA_TOKEN}")
|
|
fi
|
|
curl -fsSL "${CURL_AUTH[@]}" -o "$PACKAGE_FILE" "$DOWNLOAD_URL"
|
|
echo -e "${GREEN}✔${NC} Paket heruntergeladen ($(du -h "$PACKAGE_FILE" | cut -f1))."
|
|
|
|
echo -e "${RED}→${NC} Entpacke Paket..."
|
|
mkdir -p "$WORK_DIR/pkg"
|
|
tar xzf "$PACKAGE_FILE" -C "$WORK_DIR/pkg" --strip-components=1
|
|
echo -e "${GREEN}✔${NC} Paket entpackt."
|
|
|
|
echo -e "${RED}→${NC} Stoppe/deaktiviere ältere Installationsstufen (falls vorhanden)..."
|
|
# "|| true" macht nichts kaputt, falls einzelne Units gar nicht vorhanden
|
|
# sind. tesm.service selbst wird NICHT hier, sondern von install.sh
|
|
# gestoppt -- das entscheidet dort auch gleich, ob ein Backup nötig ist.
|
|
systemctl stop poe_web.service 2>/dev/null || true
|
|
systemctl disable poe_web.service 2>/dev/null || true
|
|
systemctl stop rpi-check.service rpi-check-restart.service rpi-check-restart.timer 2>/dev/null || true
|
|
systemctl disable rpi-check.service rpi-check-restart.service rpi-check-restart.timer 2>/dev/null || true
|
|
if [ -d /srv/poe_manager ]; then
|
|
dest="/srv/poe_manager-backup-${TIMESTAMP}"
|
|
echo -e "${RED}→${NC} Sichere /srv/poe_manager nach ${dest}..."
|
|
mv /srv/poe_manager "$dest"
|
|
echo -e "${GREEN}✔${NC} Gesichert (nicht gelöscht)."
|
|
fi
|
|
echo -e "${GREEN}✔${NC} Ältere Installationsstufen bereinigt."
|
|
|
|
echo -e "${RED}→${NC} Starte install.sh aus dem Paket..."
|
|
bash "$WORK_DIR/pkg/install.sh"
|
|
|
|
echo
|
|
echo -e "${GREEN}============================================================================${NC}"
|
|
echo -e "${GREEN} TESM Update/Reinstall (Release \"${RELEASE_TAG}\") abgeschlossen.${NC}"
|
|
echo -e "${GREEN}============================================================================${NC}"
|
|
echo "Siehe Ausgabe von install.sh oben für Details (In-Place-Update, frische"
|
|
echo "Installation, oder Migrationsergebnis inkl. eventuellem Rückroll-Hinweis)."
|