Files
tesm/update.sh
T
alientim 89682618f7 update.sh: auch /srv/poe_manager + poe_web.service (Vorgänger-Flask-App) abschalten
Ergänzt die bereits behandelte ursprüngliche Bash-only-Generation
(WiS/Aruba-PoE: rpi-check.service + ips.list) um die dazwischenliegende
Generation -- die Flask-App "PoE Manager" unter /srv/poe_manager mit
poe_web.service, der Vorgänger von TESM in diesem Repo vor der Umbenennung.
update.sh erkennt und sichert jetzt beide möglichen alten Installationsorte
(/srv/tesm, /srv/poe_manager) unabhängig voneinander nach
<Verzeichnis>-backup-<Zeitstempel> und stoppt/deaktiviert alle drei
möglichen Dienst-Generationen. README entsprechend erweitert.
2026-08-13 19:39:51 +02:00

153 lines
7.1 KiB
Bash

#!/bin/bash
# ============================================================================
# TESM — Update/Reinstall
# Ersetzt eine bestehende Installation -- ganz gleich welche der drei
# historischen Stufen dieses Hosts gerade aktiv ist:
# 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).
# 3. Eine bereits während der Entwicklung ad-hoc gepflegte TESM-Instanz
# unter /srv/tesm.
# -- durch eine frische Installation aus einem gepackten Gitea-Release.
# Lädt dafür NUR den Release-Tarball per HTTP herunter (kein "git clone",
# kein Git auf dem Zielsystem nötig).
#
# Alle ALTEN Installationen werden dabei NICHT gelöscht, sondern nur
# gestoppt/deaktiviert und (falls vorhanden) beiseite verschoben (siehe
# OLD_DIRS/BACKED_UP_DIRS) -- als Rückfalloption UND als Datenquelle für
# einen späteren Export/Import.
#
# WICHTIG: Das Ergebnis ist eine FRISCHE Installation OHNE die Daten der
# alten Instanz (Geräte, Switche, Zugangsdaten, Benutzer, Einstellungen, …).
# Vor dem Ausführen unbedingt unter Einstellungen -> Im-/Export ein Backup
# der alten Instanz exportieren -- danach entweder alles neu einrichten oder
# dieses Backup in die neue Installation importieren.
#
# Auszuführen als root auf dem Zielsystem (z.B. POETEST):
# 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)"
# Alle historischen Installationsorte, die dieser Host je nach Alter tragen
# kann -- siehe Kommentar oben. Jeder, der existiert, wird beiseite
# verschoben statt gelöscht.
OLD_DIRS=("/srv/tesm" "/srv/poe_manager")
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 -e "${RED}ACHTUNG:${NC} Dies richtet TESM KOMPLETT NEU ein — frische Datenbank, KEINE"
echo "Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen aus der aktuellen Installation."
echo
echo "Alle auf diesem Host ggf. vorhandenen älteren Installationen (/srv/tesm,"
echo "/srv/poe_manager) werden dabei NICHT gelöscht, sondern nach dem Stoppen der"
echo "jeweiligen Dienste nach <Verzeichnis>-backup-${TIMESTAMP} verschoben (bleiben"
echo "vollständig erhalten, inkl. sqlite.db)."
echo
echo "Ebenfalls gestoppt/deaktiviert werden ältere Dienste, falls noch vorhanden:"
echo " - poe_web.service (Flask-App \"PoE Manager\" unter /srv/poe_manager)"
echo " - rpi-check.service / rpi-check-restart.* (das ursprüngliche reine"
echo " Bash-Setup aus dem Repo WiS/Aruba-PoE, ganz ohne Datenbank/Web-UI)"
echo
echo -e "${YELLOW}Falls noch nicht geschehen: JETZT abbrechen und zuerst unter${NC}"
echo -e "${YELLOW}Einstellungen -> Im-/Export ein Backup der aktuellen Daten exportieren!${NC}"
echo "Nach dem Update entweder dieses Backup importieren, oder alles manuell neu anlegen."
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} Stoppe und deaktiviere bestehende Dienste..."
# Alle drei historischen Generationen -- je nachdem, was auf diesem Host
# tatsächlich (noch) existiert. "|| true" macht nichts kaputt, falls
# einzelne Units gar nicht vorhanden sind.
systemctl stop tesm.service tesm-check.service tesm-check-restart.timer 2>/dev/null || true
systemctl disable tesm.service tesm-check.service tesm-check-restart.timer 2>/dev/null || true
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
echo -e "${GREEN}${NC} Dienste gestoppt und deaktiviert."
BACKED_UP_DIRS=()
for dir in "${OLD_DIRS[@]}"; do
if [ -d "$dir" ]; then
dest="${dir}-backup-${TIMESTAMP}"
echo -e "${RED}${NC} Sichere ${dir} nach ${dest}..."
mv "$dir" "$dest"
BACKED_UP_DIRS+=("$dest")
echo -e "${GREEN}${NC} Gesichert (nicht gelöscht)."
fi
done
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} Starte install.sh aus dem Paket..."
bash "$WORK_DIR/pkg/install.sh"
echo
echo -e "${GREEN}============================================================================${NC}"
echo -e "${GREEN} Frische TESM-Installation (Release \"${RELEASE_TAG}\") abgeschlossen.${NC}"
echo -e "${GREEN}============================================================================${NC}"
echo
echo -e "${YELLOW}WICHTIG — dies ist eine FRISCHE Installation ohne die Daten der alten Instanz.${NC}"
echo "Bitte jetzt eines von beidem tun:"
echo " a) Alle Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen manuell neu anlegen, oder"
echo " b) Ein vor dem Update exportiertes Backup unter Einstellungen -> Im-/Export importieren."
echo
if [ "${#BACKED_UP_DIRS[@]}" -gt 0 ]; then
echo "Falls kein Export gemacht wurde: die alte(n) Datenbank(en) liegen unverändert unter:"
for dest in "${BACKED_UP_DIRS[@]}"; do
echo " ${dest}/sqlite.db"
done
echo "und können bei Bedarf manuell ausgelesen werden (z.B. mit sqlite3)."
echo
fi
echo "Hinweis zum Admin-Konto der neuen Installation: siehe Ausgabe von install.sh oben"
echo "(bei einer frischen Datenbank wird dort auf create_admin.py hingewiesen)."