commit c31b9107f5b23668595863a8b401f888360324ad Author: manuel.maier Date: Mon Sep 7 01:12:25 2026 +0200 update-iventoy.sh hinzugefügt diff --git a/update-iventoy.sh b/update-iventoy.sh new file mode 100644 index 0000000..4c1c603 --- /dev/null +++ b/update-iventoy.sh @@ -0,0 +1,286 @@ +#!/bin/bash +set -euo pipefail + +BASE="/opt" +CURRENT="/opt/iventoy" + +PERSIST="/srv/iventoy" +ISO_DIR="${PERSIST}/iso" +CONFIG_DIR="${PERSIST}/config" +CONFIG_FILE="${CONFIG_DIR}/config.dat" + +SERVICE="iventoy" + +TMP="/tmp/iventoy-update" + +GITHUB_REPO="ventoy/PXE" + +echo "==========================================" +echo " iVentoy Update" +echo "==========================================" +echo + +# -------------------------------------------------- +# Root check +# -------------------------------------------------- + +if [ "$(id -u)" -ne 0 ]; then + echo "ERROR: Dieses Script muss als root laufen." + exit 1 +fi + +# -------------------------------------------------- +# Dependencies +# -------------------------------------------------- + +apt-get update -qq +apt-get install -y -qq curl tar >/dev/null + +# -------------------------------------------------- +# Persistent directories +# -------------------------------------------------- + +mkdir -p "$ISO_DIR" +mkdir -p "$CONFIG_DIR" + +# -------------------------------------------------- +# Existing config sichern / initial übernehmen +# -------------------------------------------------- + +if [ ! -f "$CONFIG_FILE" ]; then + + if [ -f "${CURRENT}/data/config.dat" ]; then + echo "Übernehme bestehende iVentoy Config..." + cp -a "${CURRENT}/data/config.dat" "$CONFIG_FILE" + else + echo "WARNUNG: Keine bestehende config.dat gefunden." + fi + +fi + +# Backup +if [ -f "$CONFIG_FILE" ]; then + + BACKUP="${CONFIG_FILE}.bak-$(date +%Y%m%d-%H%M%S)" + + echo "Sichere Config nach:" + echo " $BACKUP" + + cp -a "$CONFIG_FILE" "$BACKUP" + +fi + +# -------------------------------------------------- +# Latest Version ermitteln +# -------------------------------------------------- + +echo +echo "Ermittle aktuelle iVentoy-Version..." + +LATEST_TAG=$( + curl -fsSL \ + -o /dev/null \ + -w '%{url_effective}' \ + "https://github.com/${GITHUB_REPO}/releases/latest" \ + | awk -F/ '{print $NF}' +) + +VERSION="${LATEST_TAG#v}" + +if [ -z "$VERSION" ]; then + echo "ERROR: Konnte aktuelle Version nicht ermitteln." + exit 1 +fi + +echo "Neueste Version: $VERSION" + +TARGET="${BASE}/iventoy-${VERSION}" + +# -------------------------------------------------- +# Prüfen ob bereits installiert +# -------------------------------------------------- + +if [ -d "$TARGET" ]; then + + echo + echo "Version $VERSION ist bereits unter" + echo " $TARGET" + echo "vorhanden." + +else + + # -------------------------------------------------- + # Download + # -------------------------------------------------- + + rm -rf "$TMP" + mkdir -p "$TMP" + + ARCHIVE="iventoy-${VERSION}-linux-x86_64-free.tar.gz" + + URL="https://github.com/${GITHUB_REPO}/releases/download/v${VERSION}/${ARCHIVE}" + + echo + echo "Lade herunter:" + echo " $URL" + + curl -fL \ + "$URL" \ + -o "${TMP}/${ARCHIVE}" + + # -------------------------------------------------- + # Entpacken + # -------------------------------------------------- + + echo + echo "Entpacke iVentoy..." + + tar -xzf "${TMP}/${ARCHIVE}" -C "$TMP" + + EXTRACTED="${TMP}/iventoy-${VERSION}" + + if [ ! -d "$EXTRACTED" ]; then + echo "ERROR: Erwartetes Verzeichnis $EXTRACTED nicht gefunden." + exit 1 + fi + + mv "$EXTRACTED" "$TARGET" + +fi + +# -------------------------------------------------- +# Symlinks vorbereiten +# -------------------------------------------------- + +echo +echo "Setze persistente Verzeichnisse..." + +# ISO + +rm -rf "${TARGET}/iso" +ln -s "$ISO_DIR" "${TARGET}/iso" + +# Config + +if [ -f "$CONFIG_FILE" ]; then + + rm -f "${TARGET}/data/config.dat" + + ln -s \ + "$CONFIG_FILE" \ + "${TARGET}/data/config.dat" + +fi + +# -------------------------------------------------- +# Service stoppen +# -------------------------------------------------- + +echo +echo "Stoppe iVentoy..." + +systemctl stop "$SERVICE" 2>/dev/null || true + +sleep 2 + +# -------------------------------------------------- +# Bestehende /opt/iventoy Installation migrieren +# -------------------------------------------------- + +# +# Falls /opt/iventoy beim allerersten Lauf noch ein echtes +# Verzeichnis und kein Symlink ist. +# + +if [ -e "$CURRENT" ] && [ ! -L "$CURRENT" ]; then + + OLD="${BASE}/iventoy-old-$(date +%Y%m%d-%H%M%S)" + + echo + echo "Bestehende Installation wird verschoben:" + echo " $CURRENT -> $OLD" + + mv "$CURRENT" "$OLD" + +fi + +# -------------------------------------------------- +# Current Symlink atomar setzen +# -------------------------------------------------- + +echo +echo "Aktiviere iVentoy $VERSION..." + +ln -sfn "$TARGET" "${CURRENT}.new" +mv -Tf "${CURRENT}.new" "$CURRENT" + +# -------------------------------------------------- +# Start +# -------------------------------------------------- + +echo +echo "Starte iVentoy..." + +systemctl start "$SERVICE" + +sleep 3 + +# -------------------------------------------------- +# Health Check +# -------------------------------------------------- + +FAILED=0 + +if ! systemctl is-active --quiet "$SERVICE"; then + echo "ERROR: systemd Service läuft nicht." + FAILED=1 +fi + +if ! ss -lntH | awk '{print $4}' | grep -Eq '[:.]26000$'; then + echo "ERROR: TCP 26000 lauscht nicht." + FAILED=1 +fi + +if ! ss -lntH | awk '{print $4}' | grep -Eq '[:.]16000$'; then + echo "ERROR: TCP 16000 lauscht nicht." + FAILED=1 +fi + +if [ "$FAILED" -ne 0 ]; then + + echo + echo "==========================================" + echo " UPDATE FEHLGESCHLAGEN" + echo "==========================================" + + echo + echo "iVentoy Log:" + tail -n 40 "${CURRENT}/log/log.txt" || true + + exit 1 + +fi + +# -------------------------------------------------- +# Cleanup +# -------------------------------------------------- + +rm -rf "$TMP" + +echo +echo "==========================================" +echo " Update erfolgreich" +echo "==========================================" +echo +echo "Aktive Version:" +echo " $VERSION" +echo +echo "Installation:" +echo " $CURRENT -> $TARGET" +echo +echo "Config:" +echo " ${CURRENT}/data/config.dat -> $CONFIG_FILE" +echo +echo "ISO:" +echo " ${CURRENT}/iso -> $ISO_DIR" +echo \ No newline at end of file