Files
2026-09-17 12:06:50 +02:00

155 lines
5.8 KiB
Bash

#!/usr/bin/env bash
#
# NetBox Upgrade Script
# Automates: Download new release, copy over local config/media/plugins,
# swap directories, run upgrade.sh
#
# Usage: sudo ./netbox-upgrade.sh X.Y.Z
# Example: sudo ./netbox-upgrade.sh 4.1.5
set -euo pipefail
# ---------------------------------------------------------------------------
# Config
# ---------------------------------------------------------------------------
OPT_DIR="/opt"
CURRENT_LINK="${OPT_DIR}/netbox"
OLD_LINK="${OPT_DIR}/netbox_old"
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <version, z.B. 4.1.5>"
exit 1
fi
VERSION="$1"
NEW_DIR="${OPT_DIR}/netbox-${VERSION}"
TARBALL="v${VERSION}.tar.gz"
TARBALL_URL="https://github.com/netbox-community/netbox/archive/refs/tags/${TARBALL}"
log() { echo -e "\n\033[1;32m==> $*\033[0m"; }
warn() { echo -e "\033[1;33m[WARN] $*\033[0m"; }
err() { echo -e "\033[1;31m[ERROR] $*\033[0m" >&2; }
if [[ $EUID -ne 0 ]]; then
err "Dieses Skript muss als root (oder mit sudo) ausgeführt werden."
exit 1
fi
if [[ ! -d "$CURRENT_LINK" ]]; then
err "Bestehendes NetBox-Verzeichnis nicht gefunden unter ${CURRENT_LINK}"
exit 1
fi
if [[ -e "$NEW_DIR" ]]; then
err "Zielverzeichnis ${NEW_DIR} existiert bereits. Abbruch, um nichts zu überschreiben."
exit 1
fi
# ---------------------------------------------------------------------------
# 1. Neues Release herunterladen und entpacken
# ---------------------------------------------------------------------------
log "Lade NetBox v${VERSION} herunter"
cd "$OPT_DIR"
wget -q --show-progress "$TARBALL_URL" -O "$TARBALL"
log "Entpacke ${TARBALL}"
tar -xzf "$TARBALL"
if [[ ! -d "$NEW_DIR" ]]; then
err "Erwartetes Verzeichnis ${NEW_DIR} nach dem Entpacken nicht gefunden. Version/Tag prüfen."
exit 1
fi
# ---------------------------------------------------------------------------
# 2. Konfiguration, Medien, Skripte, Reports, Gunicorn-Konfig kopieren
# ---------------------------------------------------------------------------
log "Kopiere configuration.py"
cp "${CURRENT_LINK}/netbox/netbox/configuration.py" "${NEW_DIR}/netbox/netbox/"
log "Kopiere ldap_config.py (falls vorhanden)"
cp "${CURRENT_LINK}/netbox/netbox/ldap_config.py" "${NEW_DIR}/netbox/netbox/" 2>/dev/null \
|| warn "Keine ldap_config.py gefunden, wird übersprungen."
log "Kopiere media/, scripts/, reports/"
cp -pr "${CURRENT_LINK}/netbox/media/" "${NEW_DIR}/netbox/"
cp -pr "${CURRENT_LINK}/netbox/scripts/" "${NEW_DIR}/netbox/"
cp -pr "${CURRENT_LINK}/netbox/reports/" "${NEW_DIR}/netbox/"
log "Kopiere gunicorn.py (falls vorhanden)"
cp "${CURRENT_LINK}/gunicorn.py" "${NEW_DIR}/" 2>/dev/null \
|| warn "Keine angepasste gunicorn.py gefunden, wird übersprungen."
# ---------------------------------------------------------------------------
# 3. local_requirements.txt (Plugins) übernehmen
# ---------------------------------------------------------------------------
log "Übernehme local_requirements.txt"
OLD_REQS="${CURRENT_LINK}/local_requirements.txt"
NEW_REQS="${NEW_DIR}/local_requirements.txt"
if [[ -f "$OLD_REQS" ]]; then
cp "$OLD_REQS" "$NEW_REQS"
log "local_requirements.txt aus der alten Installation übernommen."
else
warn "Keine bestehende local_requirements.txt unter ${OLD_REQS} gefunden."
warn "Erzeuge eine neue mit der Standard-Plugin-Liste. Bitte ${NEW_REQS} bei Bedarf anpassen."
cat > "$NEW_REQS" <<'EOF'
git+https://git.mrblake.cc/MrBlake/mrb-netbox-topology-views.git@develop
netbox-attachments
netbox-ping
netbox-reorder-rack
netbox-secrets
netbox-inventory
git+https://git.mrblake.cc/MrBlake/NetBox-VM-Import.git#egg=netbox_vmware_importer
netbox-plugin-dhcp
git+https://git.mrblake.cc/MrBlake/Netbox-DokiWiki.git@main
netbox-plugin-themes
git+https://github.com/ICTU/netbox_slm.git
git+https://git.mrblake.cc/MrBlake/Netbox-Prefixes.git
git+https://git.mrblake.cc/MrBlake/Netbox-Better-IPs.git
git+https://git.mrblake.cc/MrBlake/Netbox-Utilities.git@main
git+https://git.mrblake.cc/MrBlake/NetBox-Export.git
git+https://git.mrblake.cc/MrBlake/NetBox-Concept.git
EOF
fi
# LDAP-Requirement automatisch ergänzen, falls ldap_config.py vorhanden ist
if [[ -f "${NEW_DIR}/netbox/netbox/ldap_config.py" ]]; then
if ! grep -qxF "django-auth-ldap" "$NEW_REQS" 2>/dev/null; then
echo "django-auth-ldap" >> "$NEW_REQS"
log "django-auth-ldap zur local_requirements.txt hinzugefügt (LDAP-Konfig erkannt)."
fi
fi
# ---------------------------------------------------------------------------
# 4. Hinweis: CSRF_TRUSTED_ORIGINS prüfen
# ---------------------------------------------------------------------------
warn "Bitte CSRF_TRUSTED_ORIGINS in folgender Datei prüfen/setzen:"
warn " ${NEW_DIR}/netbox/netbox/configuration.py"
warn "(Dieses Skript ändert diese Datei NICHT automatisch — vorher prüfen!)"
read -r -p "Enter drücken, sobald configuration.py geprüft/angepasst ist (oder Strg+C zum Abbrechen)..."
# ---------------------------------------------------------------------------
# 5. Verzeichnisse tauschen
# ---------------------------------------------------------------------------
log "Tausche Verzeichnisse: ${CURRENT_LINK} -> ${OLD_LINK}, ${NEW_DIR} -> ${CURRENT_LINK}"
if [[ -e "$OLD_LINK" ]]; then
err "${OLD_LINK} existiert bereits (von einem vorherigen Lauf?). Bitte erst entfernen/umbenennen."
exit 1
fi
mv "$CURRENT_LINK" "$OLD_LINK"
mv "$NEW_DIR" "$CURRENT_LINK"
# ---------------------------------------------------------------------------
# 6. Upgrade-Skript ausführen
# ---------------------------------------------------------------------------
log "Führe upgrade.sh aus"
cd "$CURRENT_LINK"
./upgrade.sh
log "Upgrade auf v${VERSION} abgeschlossen."
log "Alte Installation bleibt erhalten unter ${OLD_LINK} — nach erfolgreicher Prüfung kann sie gelöscht werden."
# Aufräumen: heruntergeladenes tar.gz entfernen
rm -f "${OPT_DIR}/${TARBALL}"