From 0a08aeedbc5b37b9846e113c0c332a86a0bb0e22 Mon Sep 17 00:00:00 2001 From: RolandS <1+xosna@noreply.localhost> Date: Mon, 25 May 2026 06:35:26 +0200 Subject: [PATCH] multi-os-install.sh aktualisiert --- multi-os-install.sh | 108 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 25 deletions(-) diff --git a/multi-os-install.sh b/multi-os-install.sh index 2144033..d50edc5 100644 --- a/multi-os-install.sh +++ b/multi-os-install.sh @@ -108,45 +108,90 @@ done [[ ${#VER_ORDER[@]} -eq 0 ]] && error "Konnte keine Versionsnummern aus den Templates extrahieren." -# ── Die 3 relevantesten Versionen bestimmen: vorherige / aktuelle / nächste ──── -# "Aktuell" = höchste stabile Version (letzte in der sortierten Liste) -# "Vorherige" = eine davor -# "Nächste" = falls vorhanden (Alpha/Beta/RC Templates in PVE) -TOTAL=${#VER_ORDER[@]} -CURRENT_IDX=$(( TOTAL - 1 )) +# ── Immer genau 3 Versionen anzeigen: vorherige / aktuelle / nächste ─────────── +# PVE kennt oft nur 2 Versionen → nächste Version wird synthetisch erzeugt. +# Debian: Major-Integer hochzählen (12 → 13 → 14) +# Ubuntu: Jahreszahl um 2 erhöhen (24.04 → 26.04 → 28.04) -# Prüfen ob es eine "nächste" Version gibt (höher als die letzte stabile) -# PVE-Datenbank enthält manchmal schon Beta-Templates → nehmen wir mit -NEXT_IDX=$(( CURRENT_IDX + 1 )) # existiert nicht → wird unten abgefangen +TOTAL=${#VER_ORDER[@]} +CURRENT_IDX=$(( TOTAL - 1 )) # höchste bekannte = aktuell stabil PREV_IDX=$(( CURRENT_IDX - 1 )) -# Verfügbare Slots bauen +# Nächste Version berechnen +CURRENT_VER="${VER_ORDER[$CURRENT_IDX]}" +if [[ "$DISTRO" == "debian" ]]; then + NEXT_VER=$(( CURRENT_VER + 1 )) # z.B. 12 → 13 +else + # Ubuntu: 24.04 → 26.04 (Jahr +2, Minor bleibt .04) + IFS='.' read -r uyr umn <<< "$CURRENT_VER" + NEXT_VER="$(( uyr + 2 )).${umn}" +fi + +# Prüfen ob PVE die nächste Version bereits kennt +NEXT_VER_IN_PVE=false +NEXT_TEMPLATE_PVE="" +if [[ -n "${VER_TO_TEMPLATE[$NEXT_VER]+x}" ]]; then + NEXT_VER_IN_PVE=true + NEXT_TEMPLATE_PVE="${VER_TO_TEMPLATE[$NEXT_VER]}" +fi + +# Vorherige Version: entweder aus PVE oder synthetisch +if (( PREV_IDX >= 0 )); then + PREV_VER="${VER_ORDER[$PREV_IDX]}" + PREV_IN_PVE=true + PREV_TEMPLATE="${VER_TO_TEMPLATE[$PREV_VER]}" +else + # Synthetisch rückwärts berechnen + if [[ "$DISTRO" == "debian" ]]; then + PREV_VER=$(( CURRENT_VER - 1 )) + else + IFS='.' read -r uyr umn <<< "$CURRENT_VER" + PREV_VER="$(( uyr - 2 )).${umn}" + fi + PREV_IN_PVE=false + PREV_TEMPLATE="" +fi + +# ── Anzeige-Arrays aufbauen ──────────────────────────────────────────────────── declare -a SHOW_VERS=() declare -a SHOW_LABELS=() +declare -a SHOW_AVAIL=() # true/false ob Template in PVE vorhanden -# Vorherige Version (falls vorhanden) -if (( PREV_IDX >= 0 )); then - SHOW_VERS+=("${VER_ORDER[$PREV_IDX]}") - SHOW_LABELS+=("Vorherige Version (${VER_ORDER[$PREV_IDX]})") +# Slot 1: Vorherige Version +SHOW_VERS+=("$PREV_VER") +if $PREV_IN_PVE; then + SHOW_LABELS+=("Vorherige Version (${DISTRO_LABEL} ${PREV_VER})") + SHOW_AVAIL+=("true") +else + SHOW_LABELS+=("Vorherige Version (${DISTRO_LABEL} ${PREV_VER}) [kein Template in PVE]") + SHOW_AVAIL+=("false") fi -# Aktuelle Version (Standard) -SHOW_VERS+=("${VER_ORDER[$CURRENT_IDX]}") -SHOW_LABELS+=("Aktuelle Version (${VER_ORDER[$CURRENT_IDX]}) ← empfohlen") -DEFAULT_VER_IDX=$(( ${#SHOW_VERS[@]} )) # 1-basierter Default für die Ausgabe +# Slot 2: Aktuelle Version (Standard) +SHOW_VERS+=("$CURRENT_VER") +SHOW_LABELS+=("Aktuelle Version (${DISTRO_LABEL} ${CURRENT_VER}) ← empfohlen") +SHOW_AVAIL+=("true") +DEFAULT_VER_IDX=2 # 1-basiert → Slot 2 = aktuell -# Nächste Version (nur wenn tatsächlich ein neueres Template existiert) -# → In der Praxis liefert PVE hier manchmal schon den nächsten LTS -if (( NEXT_IDX < TOTAL )); then - SHOW_VERS+=("${VER_ORDER[$NEXT_IDX]}") - SHOW_LABELS+=("Nächste Version (${VER_ORDER[$NEXT_IDX]}) [experimentell]") +# Slot 3: Nächste Version +SHOW_VERS+=("$NEXT_VER") +if $NEXT_VER_IN_PVE; then + SHOW_LABELS+=("Nächste Version (${DISTRO_LABEL} ${NEXT_VER}) [experimentell]") + SHOW_AVAIL+=("true") +else + SHOW_LABELS+=("Nächste Version (${DISTRO_LABEL} ${NEXT_VER}) [noch kein Template in PVE]") + SHOW_AVAIL+=("false") fi -echo -e " Gefundene ${DISTRO_LABEL}-Versionen:\n" +# ── Versionsauswahl ausgeben ─────────────────────────────────────────────────── +echo -e " ${DISTRO_LABEL}-Versionen (aus PVE-Datenbank + Berechnung):\n" for i in "${!SHOW_VERS[@]}"; do num=$(( i + 1 )) + avail="${SHOW_AVAIL[$i]}" if (( num == DEFAULT_VER_IDX )); then echo -e " ${BOLD}[${num}]${NC} ${GREEN}${SHOW_LABELS[$i]}${NC}" + elif [[ "$avail" == "false" ]]; then + echo -e " ${BOLD}[${num}]${NC} ${RED}${SHOW_LABELS[$i]}${NC} ← nicht wählbar" else echo -e " ${BOLD}[${num}]${NC} ${SHOW_LABELS[$i]}" fi @@ -158,8 +203,21 @@ while true; do read -r ver_sel ver_sel="${ver_sel:-$DEFAULT_VER_IDX}" if [[ "$ver_sel" =~ ^[0-9]+$ ]] && (( ver_sel >= 1 && ver_sel <= ${#SHOW_VERS[@]} )); then + # Nicht wählbar wenn kein Template vorhanden + if [[ "${SHOW_AVAIL[$((ver_sel-1))]}" == "false" ]]; then + warn "Für ${DISTRO_LABEL} ${SHOW_VERS[$((ver_sel-1))]} ist noch kein Template in PVE verfügbar." + warn "Bitte wähle eine der verfügbaren Versionen." + continue + fi CHOSEN_VER="${SHOW_VERS[$((ver_sel-1))]}" - CHOSEN_TEMPLATE="${VER_TO_TEMPLATE[$CHOSEN_VER]}" + # Template zuweisen (aus PVE-Map oder vorherige) + if [[ "$ver_sel" == "1" ]] && $PREV_IN_PVE; then + CHOSEN_TEMPLATE="$PREV_TEMPLATE" + elif [[ "$ver_sel" == "3" ]] && $NEXT_VER_IN_PVE; then + CHOSEN_TEMPLATE="$NEXT_TEMPLATE_PVE" + else + CHOSEN_TEMPLATE="${VER_TO_TEMPLATE[$CHOSEN_VER]}" + fi success "Gewählt: ${BOLD}${DISTRO_LABEL} ${CHOSEN_VER}${NC} → ${CHOSEN_TEMPLATE}" break else