Refactor: Post-PVE-Script (PVe9 Support) (#6626)

This commit is contained in:
CanbiZ 2025-08-07 19:35:19 +02:00 committed by GitHub
parent a4de1efae8
commit a750932b3a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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.08.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 <<EOF
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie-updates
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
msg_ok "Corrected Proxmox VE 9 (Trixie) Sources"
;;
no) msg_error "Selected no to Correcting Proxmox VE Sources" ;;
esac
fi
# ---- PVE-ENTERPRISE ----
if component_exists_in_sources "pve-enterprise"; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "PVE-ENTERPRISE" \
--menu "'pve-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 '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 <<EOF
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pve-enterprise' repository"
;;
no) msg_error "Selected no to Adding 'pve-enterprise' repository" ;;
esac
fi
# ---- CEPH-ENTERPRISE ----
if grep -q "enterprise.proxmox.com.*ceph" /etc/apt/sources.list.d/*.sources 2>/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 <<EOF
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pve-no-subscription' repository"
;;
no) msg_error "Selected no to Adding 'pve-no-subscription' repository" ;;
esac
fi
# ---- CEPH ----
if component_exists_in_sources "no-subscription"; then
msg_ok "'ceph' package repository (no-subscription) already exists (skipped)"
else
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 (deb822).\n\nAdd 'ceph package sources?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'ceph package repositories' (deb822)"
cat >/etc/apt/sources.list.d/ceph.sources <<EOF
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'ceph package repositories'"
;;
no)
msg_error "Selected no to Adding 'ceph package repositories'"
find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \
-exec sed -i '/enterprise.proxmox.com.*ceph/s/^/# /' {} \;
msg_ok "Disabled all Ceph Enterprise repositories"
;;
esac
fi
# ---- PVETEST ----
if component_exists_in_sources "pvetest"; then
msg_ok "'pvetest' repository already exists (skipped)"
else
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 (deb822)?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'pvetest' repository (deb822, disabled)"
cat >/etc/apt/sources.list.d/pvetest.sources <<EOF
# Types: deb
# URIs: http://download.proxmox.com/debian/pve
# Suites: trixie
# Components: pvetest
# Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pvetest' repository"
;;
no) msg_error "Selected no to Adding 'pvetest' repository" ;;
esac
fi
post_routines_common
}
post_routines_common() {
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
"yes" " " \
"no" " " 3>&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