#!/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 " 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}"