diff --git a/tools/pve/post-pve-install.sh b/tools/pve/post-pve-install.sh index d62e22bf2..b8ab2da1e 100644 --- a/tools/pve/post-pve-install.sh +++ b/tools/pve/post-pve-install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) +# Author: tteckster | MickLesk (CanbiZ) # License: MIT # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -44,9 +44,66 @@ msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } -start_routines() { +get_pve_version() { + local pve_ver + pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + echo "$pve_ver" +} + +get_pve_major_minor() { + local ver="$1" + local major minor + IFS='.' read -r major minor _ <<<"$ver" + echo "$major $minor" +} + +component_exists_in_sources() { + local component="$1" + grep -h -E "^[^#]*Components:[^#]*\b${component}\b" /etc/apt/sources.list.d/*.sources 2>/dev/null | grep -q . +} + +main() { + header_info + echo -e "\nThis script will Perform Post Install Routines.\n" + while true; do + read -p "Start the Proxmox VE Post Install Script (y/n)? " yn + case $yn in + [Yy]*) break ;; + [Nn]*) + clear + exit + ;; + *) echo "Please answer yes or no." ;; + esac + done + + local PVE_VERSION PVE_MAJOR PVE_MINOR + PVE_VERSION="$(get_pve_version)" + read -r PVE_MAJOR PVE_MINOR <<<"$(get_pve_major_minor "$PVE_VERSION")" + + if [[ "$PVE_MAJOR" == "8" ]]; then + if ((PVE_MINOR < 0 || PVE_MINOR > 9)); then + msg_error "Unsupported Proxmox 8 version" + exit 1 + fi + start_routines_8 + elif [[ "$PVE_MAJOR" == "9" ]]; then + if ((PVE_MINOR != 0)); then + msg_error "Only Proxmox 9.0 is currently supported" + exit 1 + fi + start_routines_9 + else + msg_error "Unsupported Proxmox VE major version: $PVE_MAJOR" + echo -e "Supported: 8.0–8.9.x and 9.0" + exit 1 + fi +} + +start_routines_8() { header_info + # === Bookworm/8.x: .list-Files === CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SOURCES" --menu "The package manager will use the correct sources to update and install packages on your Proxmox VE server.\n \nCorrect Proxmox VE sources?" 14 58 2 \ "yes" " " \ "no" " " 3>&2 2>&1 1>&3) @@ -61,9 +118,7 @@ EOF echo 'APT::Get::Update::SourceListWarnings::NonFreeFirmware "false";' >/etc/apt/apt.conf.d/no-bookworm-firmware.conf msg_ok "Corrected Proxmox VE Sources" ;; - no) - msg_error "Selected no to Correcting Proxmox VE Sources" - ;; + no) msg_error "Selected no to Correcting Proxmox VE Sources" ;; esac CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-ENTERPRISE" --menu "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription.\n \nDisable 'pve-enterprise' repository?" 14 58 2 \ @@ -77,9 +132,7 @@ EOF EOF msg_ok "Disabled 'pve-enterprise' repository" ;; - no) - msg_error "Selected no to Disabling 'pve-enterprise' repository" - ;; + no) msg_error "Selected no to Disabling 'pve-enterprise' repository" ;; esac CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-NO-SUBSCRIPTION" --menu "The 'pve-no-subscription' repository provides access to all of the open-source components of Proxmox VE.\n \nEnable 'pve-no-subscription' repository?" 14 58 2 \ @@ -93,9 +146,7 @@ deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription EOF msg_ok "Enabled 'pve-no-subscription' repository" ;; - no) - msg_error "Selected no to Enabling 'pve-no-subscription' repository" - ;; + no) msg_error "Selected no to Enabling 'pve-no-subscription' repository" ;; esac CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CEPH PACKAGE REPOSITORIES" --menu "The 'Ceph Package Repositories' provides access to both the 'no-subscription' and 'enterprise' repositories (initially disabled).\n \nCorrect 'ceph package sources?" 14 58 2 \ @@ -112,9 +163,7 @@ EOF EOF msg_ok "Corrected 'ceph package repositories'" ;; - no) - msg_error "Selected no to Correcting 'ceph package repositories'" - ;; + no) msg_error "Selected no to Correcting 'ceph package repositories'" ;; esac CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" --menu "The 'pvetest' repository can give advanced users access to new features and updates before they are officially released.\n \nAdd (Disabled) 'pvetest' repository?" 14 58 2 \ @@ -128,11 +177,337 @@ EOF EOF msg_ok "Added 'pvetest' repository" ;; - no) - msg_error "Selected no to Adding 'pvetest' repository" - ;; + no) msg_error "Selected no to Adding 'pvetest' repository" ;; esac + post_routines_common +} + +start_routines_9() { + header_info + + # check if deb822 Sources (*.sources) exist + if find /etc/apt/sources.list.d/ -maxdepth 1 -name '*.sources' | grep -q .; then + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Deb822 sources detected" \ + --msgbox "Modern deb822 sources (*.sources) already exist.\n\nNo changes to sources format required.\n\nYou may still have legacy sources.list or .list files, which you can disable in the next step." 12 65 + else + check_and_disable_legacy_sources() { + local LEGACY_COUNT=0 + local listfile="/etc/apt/sources.list" + + # Check sources.list + if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then + ((LEGACY_COUNT++)) + fi + + # Check .list files + local list_files + list_files=$(find /etc/apt/sources.list.d/ -type f -name "*.list" 2>/dev/null) + if [[ -n "$list_files" ]]; then + LEGACY_COUNT=$((LEGACY_COUNT + $(echo "$list_files" | wc -l))) + fi + + if ((LEGACY_COUNT > 0)); then + # Show summary to user + local MSG="Legacy APT sources found:\n" + [[ -f "$listfile" ]] && MSG+=" - /etc/apt/sources.list\n" + [[ -n "$list_files" ]] && MSG+="$(echo "$list_files" | sed 's|^| - |')\n" + MSG+="\nDo you want to disable (comment out/rename) all legacy sources and use ONLY deb822 .sources format?\n\nRecommended for Proxmox VE 9." + + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Disable legacy sources?" \ + --yesno "$MSG" 18 80 + if [[ $? -eq 0 ]]; then + # Backup and disable sources.list + if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then + cp "$listfile" "$listfile.bak" + sed -i '/^\s*deb /s/^/# Disabled by Proxmox Helper Script /' "$listfile" + msg_ok "Disabled entries in sources.list (backup: sources.list.bak)" + fi + # Rename all .list files to .list.bak + if [[ -n "$list_files" ]]; then + while IFS= read -r f; do + mv "$f" "$f.bak" + done <<<"$list_files" + msg_ok "Renamed legacy .list files to .bak" + fi + else + msg_error "Kept legacy sources as-is (may cause APT warnings)" + fi + fi + } + + check_and_disable_legacy_sources + # === Trixie/9.x: deb822 .sources === + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SOURCES" --menu \ + "The package manager will use the correct sources to update and install packages on your Proxmox VE 9 server.\n\nMigrate to deb822 sources format?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Correcting Proxmox VE Sources (deb822)" + # remove all existing .list files + rm -f /etc/apt/sources.list.d/*.list + # remove bookworm and proxmox entries from sources.list + sed -i '/proxmox/d;/bookworm/d' /etc/apt/sources.list || true + # Create new deb822 sources + cat >/etc/apt/sources.list.d/debian.sources <&2 2>&1 1>&3) + case $CHOICE in + keep) + msg_ok "Kept 'pve-enterprise' repository" + ;; + disable) + msg_info "Disabling (commenting) 'pve-enterprise' repository" + # Comment out every non-comment line in the file that has 'pve-enterprise' in Components + for file in /etc/apt/sources.list.d/*.sources; do + if grep -q "Components:.*pve-enterprise" "$file"; then + sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$file" + fi + done + msg_ok "Disabled 'pve-enterprise' repository" + ;; + delete) + msg_info "Deleting 'pve-enterprise' repository file" + for file in /etc/apt/sources.list.d/*.sources; do + if grep -q "Components:.*pve-enterprise" "$file"; then + rm -f "$file" + fi + done + msg_ok "Deleted 'pve-enterprise' repository file" + ;; + esac + else + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --title "PVE-ENTERPRISE" \ + --menu "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription.\n\nAdd 'pve-enterprise' repository (deb822)?" 14 58 2 \ + "no" " " \ + "yes" " " \ + --default-item "no" \ + 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Adding 'pve-enterprise' repository (deb822)" + cat >/etc/apt/sources.list.d/pve-enterprise.sources </dev/null; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --title "CEPH-ENTERPRISE" \ + --menu "'ceph enterprise' repository already exists.\n\nWhat do you want to do?" 14 58 2 \ + "keep" "Keep as is" \ + "disable" "Comment out (disable) this repo" \ + "delete" "Delete this repo file" \ + 3>&2 2>&1 1>&3) + case $CHOICE in + keep) + msg_ok "Kept 'ceph enterprise' repository" + ;; + disable) + msg_info "Disabling (commenting) 'ceph enterprise' repository" + for file in /etc/apt/sources.list.d/*.sources; do + if grep -q "enterprise.proxmox.com.*ceph" "$file"; then + sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$file" + fi + done + msg_ok "Disabled 'ceph enterprise' repository" + ;; + delete) + msg_info "Deleting 'ceph enterprise' repository file" + for file in /etc/apt/sources.list.d/*.sources; do + if grep -q "enterprise.proxmox.com.*ceph" "$file"; then + rm -f "$file" + fi + done + msg_ok "Deleted 'ceph enterprise' repository file" + ;; + esac + fi + + # ---- PVE-NO-SUBSCRIPTION ---- + REPO_FILE="" + REPO_ACTIVE=0 + REPO_COMMENTED=0 + # Suche nach existierendem Block (aktiv oder auskommentiert) + for file in /etc/apt/sources.list.d/*.sources; do + if grep -q "Components:.*pve-no-subscription" "$file"; then + REPO_FILE="$file" + if grep -E '^[^#]*Components:.*pve-no-subscription' "$file" >/dev/null; then + REPO_ACTIVE=1 + elif grep -E '^#.*Components:.*pve-no-subscription' "$file" >/dev/null; then + REPO_COMMENTED=1 + fi + break + fi + done + + if [[ "$REPO_ACTIVE" -eq 1 ]]; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --title "PVE-NO-SUBSCRIPTION" \ + --menu "'pve-no-subscription' repository is currently ENABLED.\n\nWhat do you want to do?" 14 58 3 \ + "keep" "Keep as is" \ + "disable" "Comment out (disable)" \ + "delete" "Delete repo file" \ + 3>&2 2>&1 1>&3) + case $CHOICE in + keep) + msg_ok "Kept 'pve-no-subscription' repository" + ;; + disable) + msg_info "Disabling (commenting) 'pve-no-subscription' repository" + sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$REPO_FILE" + msg_ok "Disabled 'pve-no-subscription' repository" + ;; + delete) + msg_info "Deleting 'pve-no-subscription' repository file" + rm -f "$REPO_FILE" + msg_ok "Deleted 'pve-no-subscription' repository file" + ;; + esac + + elif [[ "$REPO_COMMENTED" -eq 1 ]]; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --title "PVE-NO-SUBSCRIPTION" \ + --menu "'pve-no-subscription' repository is currently DISABLED (commented out).\n\nWhat do you want to do?" 14 58 3 \ + "enable" "Uncomment (enable)" \ + "keep" "Keep disabled" \ + "delete" "Delete repo file" \ + 3>&2 2>&1 1>&3) + case $CHOICE in + enable) + msg_info "Enabling (uncommenting) 'pve-no-subscription' repository" + sed -i '/^#\s*Types:/,/^$/s/^#\s*//' "$REPO_FILE" + msg_ok "Enabled 'pve-no-subscription' repository" + ;; + keep) + msg_ok "Kept 'pve-no-subscription' repository disabled" + ;; + delete) + msg_info "Deleting 'pve-no-subscription' repository file" + rm -f "$REPO_FILE" + msg_ok "Deleted 'pve-no-subscription' repository file" + ;; + esac + else + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-NO-SUBSCRIPTION" \ + --menu "The 'pve-no-subscription' repository provides access to all of the open-source components of Proxmox VE.\n\nAdd 'pve-no-subscription' repository (deb822)?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Adding 'pve-no-subscription' repository (deb822)" + cat >/etc/apt/sources.list.d/proxmox.sources <&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Adding 'ceph package repositories' (deb822)" + cat >/etc/apt/sources.list.d/ceph.sources <&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Adding 'pvetest' repository (deb822, disabled)" + cat >/etc/apt/sources.list.d/pvetest.sources <&2 2>&1 1>&3) @@ -140,7 +515,7 @@ EOF yes) whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58 msg_info "Disabling subscription nag" - echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script + echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script msg_ok "Disabled subscription nag (Delete browser cache)" ;; no) @@ -149,8 +524,7 @@ EOF rm /etc/apt/apt.conf.d/no-nag-script 2>/dev/null ;; esac - apt --reinstall install proxmox-widget-toolkit &>/dev/null - + apt --reinstall install proxmox-widget-toolkit &>/dev/null || msg_error "Widget toolkit reinstall failed" if ! systemctl is-active --quiet pve-ha-lrm; then CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \ "yes" " " \ @@ -163,9 +537,7 @@ EOF systemctl enable -q --now corosync msg_ok "Enabled high availability" ;; - no) - msg_error "Selected no to Enabling high availability" - ;; + no) msg_error "Selected no to Enabling high availability" ;; esac fi @@ -188,14 +560,10 @@ EOF systemctl disable -q --now corosync msg_ok "Disabled Corosync" ;; - no) - msg_error "Selected no to Disabling Corosync" - ;; + no) msg_error "Selected no to Disabling Corosync" ;; esac ;; - no) - msg_error "Selected no to Disabling high availability" - ;; + no) msg_error "Selected no to Disabling high availability" ;; esac fi @@ -205,15 +573,24 @@ EOF case $CHOICE in yes) msg_info "Updating Proxmox VE (Patience)" - apt-get update &>/dev/null - apt-get -y dist-upgrade &>/dev/null + apt update &>/dev/null || msg_error "apt update failed" + apt -y dist-upgrade &>/dev/null || msg_error "apt dist-upgrade failed" msg_ok "Updated Proxmox VE" ;; - no) - msg_error "Selected no to Updating Proxmox VE" - ;; + no) msg_error "Selected no to Updating Proxmox VE" ;; esac + # Final message for all hosts in cluster and browser cache + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Post-Install Reminder" --msgbox \ + "IMPORTANT: + +If you have multiple Proxmox VE hosts in a cluster, please make sure to run this script on every node individually. + +After completing these steps, it is strongly recommended to REBOOT your node. + +After the upgrade or post-install routines, always clear your browser cache or perform a hard reload (Ctrl+Shift+R) before using the Proxmox VE Web UI to avoid UI display issues. +" 20 80 + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox VE now? (recommended)" 11 58 2 \ "yes" " " \ "no" " " 3>&2 2>&1 1>&3) @@ -231,26 +608,4 @@ EOF esac } -header_info -echo -e "\nThis script will Perform Post Install Routines.\n" -while true; do - read -p "Start the Proxmox VE Post Install Script (y/n)?" yn - case $yn in - [Yy]*) break ;; - [Nn]*) - clear - exit - ;; - *) echo "Please answer yes or no." ;; - esac -done - -if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then - msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.0 or later." - echo -e "Exiting..." - sleep 2 - exit -fi - -start_routines +main