mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-03 16:15:54 +00:00
* Standardize exit codes and add mappings Replace generic exit 1 usages with specific numeric exit codes and add corresponding explanations to the error lookup. This commit updates multiple misc/* scripts to return distinct codes for validation, Proxmox/LXC, networking, download and curl errors (e.g. 103-123, 64, 107-120, 206, 0 for explicit user cancels). It also updates curl error handling to propagate the original curl exit code and adds new entries in explain_exit_code and the error handler to improve diagnostics. * Set exit code 115 for update_os errors Change exit status from 6 to 115 in misc/alpine-install.func's update_os() error handlers when failing to download tools.func or when the expected functions are missing. This gives a distinct exit code for these specific failure cases. * Add tools/addon exit codes and use them Introduce exit codes 232-238 for Tools & Addon scripts in misc/api.func and misc/error_handler.func. Update addon scripts (tools/addon/adguardhome-sync.sh, tools/addon/copyparty.sh, tools/addon/cronmaster.sh) to return specific codes instead of generic exit 1: 238 for unsupported OS and 233 when the application is not installed/upgrade prerequisites are missing. This makes failures more descriptive and aligns scripts with the central error explanations. * Standardize exit codes in exporter addons Unify exit codes across exporter addon scripts: return 238 for unsupported OS detections and 233 when an update is requested but the exporter is not installed. Applied to nextcloud-exporter.sh, pihole-exporter.sh, prometheus-paperless-ngx-exporter.sh, and qbittorrent-exporter.sh to make failure modes distinguishable for callers/automation. * Use specific exit codes in addon scripts Replace generic exit 1 with distinct exit codes across multiple addon scripts to enable finer-grained error handling in automation. Exit codes introduced: 10 for Docker/Compose missing or user-declined Docker install, 233 for "nothing to update" cases, and 238 for unsupported OS cases. Affected files: tools/addon/arcane.sh, coolify.sh, dockge.sh, dokploy.sh, filebrowser-quantum.sh, filebrowser.sh, immich-public-proxy.sh, jellystat.sh, runtipi.sh. * Use specific exit codes in addon scripts Replace generic exit 1 with specific exit codes across multiple addon scripts to improve error signaling and handling. Files updated: tools/addon/add-netbird-lxc.sh (exit 238 on unsupported distro), tools/addon/add-tailscale-lxc.sh (treat user cancel as exit 0), tools/addon/glances.sh (exit 233 when not installed), tools/addon/komodo.sh (distinct exits for missing compose, legacy DB, backup/download failures, docker checks), tools/addon/netdata.sh (distinct exits for unsupported PVE versions, OS/codename detection, repo lookups), and tools/addon/phpmyadmin.sh (distinct exits for unsupported OS, network/download issues, package install/start failures, and invalid input). These changes make failures easier to identify and automate recovery or reporting. * Use specific exit codes in PVE scripts Replace generic exit 1 with distinct exit codes across tools/pve scripts to provide clearer failure signals for callers. post-pve-install.sh now returns 105 for unsupported Proxmox versions; pve-privilege-converter.sh uses 104 for non-root, 234 when no containers, and 235 for backup/conversion failures; update-apps.sh maps backup failures to 235, missing containers/selections to 234 (and UI cancellations to 0), missing backup storage to 119, and returns the actual container update exit code on failure. These changes improve diagnostics and allow external tooling to react to specific error conditions. * Standardize exit codes and behaviors Adjust exit codes and abort handling across multiple PVE helper scripts to provide clearer outcomes for automation and interactive flows. Changes include: - container-restore-from-backup.sh, core-restore-from-backup.sh: return 235 when no backups found (was 1). - fstrim.sh: treat user cancellation of non-ext4 warning as non-error (exit 0 instead of 1). - kernel-clean.sh: treat no selection or user abort as non-error (exit 0 instead of 1). - lxc-delete.sh: return 234 when no containers are present; treat no selection as non-error (exit 0). - nic-offloading-fix.sh: use specific non-zero codes for root check and tool install failures (exit 104, 237) and 236 when no matching interfaces (was 1). - pbs_microcode.sh, post-pmg-install.sh, post-pbs-install.sh: use distinct exit codes (232 and 105) for detected VM/PVE/unsupported distro conditions instead of generic 1. These modifications make scripts return distinct codes for different failure modes and ensure user-initiated aborts or benign conditions exit with 0 where appropriate. * Use exit 105 for unsupported PVE versions Standardize error handling by replacing generic exit 1 with exit 105 in pve_check() across multiple VM template scripts to indicate unsupported Proxmox VE versions. Also add API exit code 226 message for "Proxmox: VM disk import or post-creation setup failed" in misc/api.func. Affected files include misc/api.func and various vm/*-vm.sh scripts. * Use specific exit codes in VM scripts Replace generic exit 1 with distinct exit codes across vm/*.sh to make failures more actionable for callers. Changes include: use 226 for missing imported-disk references, 237 for pv installation failures, 115 for download/extract/ISO-related failures, 214 for insufficient disk space during FreeBSD decompression, and 119 for missing storage detection. Updated scripts: archlinux-vm.sh, docker-vm.sh, haos-vm.sh, openwrt-vm.sh, opnsense-vm.sh, truenas-vm.sh, umbrel-os-vm.sh.
690 lines
26 KiB
Bash
690 lines
26 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# Copyright (c) 2021-2026 tteck
|
||
# Author: tteckster | MickLesk (CanbiZ)
|
||
# License: MIT
|
||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||
|
||
header_info() {
|
||
clear
|
||
cat <<"EOF"
|
||
____ _ ________ ____ __ ____ __ ____
|
||
/ __ \ | / / ____/ / __ \____ _____/ /_ / _/___ _____/ /_____ _/ / /
|
||
/ /_/ / | / / __/ / /_/ / __ \/ ___/ __/ / // __ \/ ___/ __/ __ `/ / /
|
||
/ ____/| |/ / /___ / ____/ /_/ (__ ) /_ _/ // / / (__ ) /_/ /_/ / / /
|
||
/_/ |___/_____/ /_/ \____/____/\__/ /___/_/ /_/____/\__/\__,_/_/_/
|
||
|
||
EOF
|
||
}
|
||
|
||
RD=$(echo "\033[01;31m")
|
||
YW=$(echo "\033[33m")
|
||
GN=$(echo "\033[1;92m")
|
||
CL=$(echo "\033[m")
|
||
BFR="\\r\\033[K"
|
||
HOLD="-"
|
||
CM="${GN}✓${CL}"
|
||
CROSS="${RD}✗${CL}"
|
||
|
||
set -euo pipefail
|
||
shopt -s inherit_errexit nullglob
|
||
|
||
msg_info() {
|
||
local msg="$1"
|
||
echo -ne " ${HOLD} ${YW}${msg}..."
|
||
}
|
||
|
||
msg_ok() {
|
||
local msg="$1"
|
||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||
}
|
||
|
||
msg_error() {
|
||
local msg="$1"
|
||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||
}
|
||
|
||
# Telemetry
|
||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pve-install" "pve"
|
||
|
||
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 105
|
||
fi
|
||
start_routines_8
|
||
elif [[ "$PVE_MAJOR" == "9" ]]; then
|
||
if ((PVE_MINOR < 0 || PVE_MINOR > 1)); then
|
||
msg_error "Only Proxmox 9.0-9.1.x is currently supported"
|
||
exit 105
|
||
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–9.1.x"
|
||
exit 105
|
||
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)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Correcting Proxmox VE Sources"
|
||
cat <<EOF >/etc/apt/sources.list
|
||
deb http://deb.debian.org/debian bookworm main contrib
|
||
deb http://deb.debian.org/debian bookworm-updates main contrib
|
||
deb http://security.debian.org/debian-security bookworm-security main contrib
|
||
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" ;;
|
||
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 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Disabling 'pve-enterprise' repository"
|
||
cat <<EOF >/etc/apt/sources.list.d/pve-enterprise.list
|
||
# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
|
||
EOF
|
||
msg_ok "Disabled '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 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Enabling 'pve-no-subscription' repository"
|
||
cat <<EOF >/etc/apt/sources.list.d/pve-install-repo.list
|
||
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" ;;
|
||
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 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Correcting 'ceph package repositories'"
|
||
cat <<EOF >/etc/apt/sources.list.d/ceph.list
|
||
# deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise
|
||
# deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
|
||
# deb https://enterprise.proxmox.com/debian/ceph-reef bookworm enterprise
|
||
# deb http://download.proxmox.com/debian/ceph-reef bookworm no-subscription
|
||
EOF
|
||
msg_ok "Corrected '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 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Adding 'pvetest' repository and set disabled"
|
||
cat <<EOF >/etc/apt/sources.list.d/pvetest-for-beta.list
|
||
# deb http://download.proxmox.com/debian/pve bookworm pvetest
|
||
EOF
|
||
msg_ok "Added '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 || true
|
||
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 'pve-enterprise' repository"
|
||
# Use Enabled: false instead of commenting to avoid malformed entry
|
||
for file in /etc/apt/sources.list.d/*.sources; do
|
||
if grep -q "Components:.*pve-enterprise" "$file"; then
|
||
if grep -q "^Enabled:" "$file"; then
|
||
sed -i 's/^Enabled:.*/Enabled: false/' "$file"
|
||
else
|
||
echo "Enabled: false" >>"$file"
|
||
fi
|
||
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 'ceph enterprise' repository"
|
||
# Use Enabled: false instead of commenting to avoid malformed entry
|
||
for file in /etc/apt/sources.list.d/*.sources; do
|
||
if grep -q "enterprise.proxmox.com.*ceph" "$file"; then
|
||
if grep -q "^Enabled:" "$file"; then
|
||
sed -i 's/^Enabled:.*/Enabled: false/' "$file"
|
||
else
|
||
echo "Enabled: false" >>"$file"
|
||
fi
|
||
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
|
||
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'"
|
||
# Use Enabled: false for .sources files, comment for .list files
|
||
for file in /etc/apt/sources.list.d/*.sources; do
|
||
if grep -q "enterprise.proxmox.com.*ceph" "$file" 2>/dev/null; then
|
||
if grep -q "^Enabled:" "$file"; then
|
||
sed -i 's/^Enabled:.*/Enabled: false/' "$file"
|
||
else
|
||
echo "Enabled: false" >>"$file"
|
||
fi
|
||
fi
|
||
done
|
||
find /etc/apt/sources.list.d/ -type f -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 "pve-test"; then
|
||
msg_ok "'pve-test' repository already exists (skipped)"
|
||
else
|
||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" \
|
||
--menu "The 'pve-test' 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 'pve-test' repository (deb822, disabled)"
|
||
cat >/etc/apt/sources.list.d/pve-test.sources <<EOF
|
||
Types: deb
|
||
URIs: http://download.proxmox.com/debian/pve
|
||
Suites: trixie
|
||
Components: pve-test
|
||
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
|
||
Enabled: false
|
||
EOF
|
||
msg_ok "Added 'pve-test' 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)
|
||
case $CHOICE in
|
||
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"
|
||
# Create external script, this is needed because DPkg::Post-Invoke is fidly with quote interpretation
|
||
mkdir -p /usr/local/bin
|
||
cat >/usr/local/bin/pve-remove-nag.sh <<'EOF'
|
||
#!/bin/sh
|
||
WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
|
||
if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then
|
||
echo "Patching Web UI nag..."
|
||
sed -i -e "/data\.status/ s/!//" -e "/data\.status/ s/active/NoMoreNagging/" "$WEB_JS"
|
||
fi
|
||
|
||
MOBILE_TPL=/usr/share/pve-yew-mobile-gui/index.html.tpl
|
||
MARKER="<!-- MANAGED BLOCK FOR MOBILE NAG -->"
|
||
if [ -f "$MOBILE_TPL" ] && ! grep -q "$MARKER" "$MOBILE_TPL"; then
|
||
echo "Patching Mobile UI nag..."
|
||
printf "%s\n" \
|
||
"$MARKER" \
|
||
"<script>" \
|
||
" function removeSubscriptionElements() {" \
|
||
" // --- Remove subscription dialogs ---" \
|
||
" const dialogs = document.querySelectorAll('dialog.pwt-outer-dialog');" \
|
||
" dialogs.forEach(dialog => {" \
|
||
" const text = (dialog.textContent || '').toLowerCase();" \
|
||
" if (text.includes('subscription')) {" \
|
||
" dialog.remove();" \
|
||
" console.log('Removed subscription dialog');" \
|
||
" }" \
|
||
" });" \
|
||
"" \
|
||
" // --- Remove subscription cards, but keep Reboot/Shutdown/Console ---" \
|
||
" const cards = document.querySelectorAll('.pwt-card.pwt-p-2.pwt-d-flex.pwt-interactive.pwt-justify-content-center');" \
|
||
" cards.forEach(card => {" \
|
||
" const text = (card.textContent || '').toLowerCase();" \
|
||
" const hasButton = card.querySelector('button');" \
|
||
" if (!hasButton && text.includes('subscription')) {" \
|
||
" card.remove();" \
|
||
" console.log('Removed subscription card');" \
|
||
" }" \
|
||
" });" \
|
||
" }" \
|
||
"" \
|
||
" const observer = new MutationObserver(removeSubscriptionElements);" \
|
||
" observer.observe(document.body, { childList: true, subtree: true });" \
|
||
" removeSubscriptionElements();" \
|
||
" setInterval(removeSubscriptionElements, 300);" \
|
||
" setTimeout(() => {observer.disconnect();}, 10000);" \
|
||
"</script>" \
|
||
"" >> "$MOBILE_TPL"
|
||
fi
|
||
EOF
|
||
chmod 755 /usr/local/bin/pve-remove-nag.sh
|
||
|
||
cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF'
|
||
DPkg::Post-Invoke { "/usr/local/bin/pve-remove-nag.sh"; };
|
||
EOF
|
||
chmod 644 /etc/apt/apt.conf.d/no-nag-script
|
||
|
||
msg_ok "Disabled subscription nag (Delete browser cache)"
|
||
;;
|
||
no)
|
||
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_error "Selected no to Disabling subscription nag"
|
||
[[ -f /etc/apt/apt.conf.d/no-nag-script ]] && rm /etc/apt/apt.conf.d/no-nag-script
|
||
;;
|
||
esac
|
||
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" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Enabling high availability"
|
||
systemctl enable -q --now pve-ha-lrm
|
||
systemctl enable -q --now pve-ha-crm
|
||
systemctl enable -q --now corosync
|
||
msg_ok "Enabled high availability"
|
||
;;
|
||
no) msg_error "Selected no to Enabling high availability" ;;
|
||
esac
|
||
fi
|
||
|
||
if systemctl is-active --quiet pve-ha-lrm; then
|
||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "If you plan to utilize a single node instead of a clustered environment, you can disable unnecessary high availability (HA) services, thus reclaiming system resources.\n\nIf HA becomes necessary at a later stage, the services can be re-enabled.\n\nDisable high availability?" 18 58 2 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Disabling high availability"
|
||
systemctl disable -q --now pve-ha-lrm
|
||
systemctl disable -q --now pve-ha-crm
|
||
msg_ok "Disabled high availability"
|
||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "COROSYNC" --menu "Disable Corosync for a Proxmox VE Cluster?" 10 58 2 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Disabling Corosync"
|
||
systemctl disable -q --now corosync
|
||
msg_ok "Disabled Corosync"
|
||
;;
|
||
no) msg_error "Selected no to Disabling Corosync" ;;
|
||
esac
|
||
;;
|
||
no) msg_error "Selected no to Disabling high availability" ;;
|
||
esac
|
||
fi
|
||
|
||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox VE now?" 11 58 2 \
|
||
"yes" " " \
|
||
"no" " " 3>&2 2>&1 1>&3)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Updating Proxmox VE (Patience)"
|
||
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" ;;
|
||
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)
|
||
case $CHOICE in
|
||
yes)
|
||
msg_info "Rebooting Proxmox VE"
|
||
sleep 2
|
||
msg_ok "Completed Post Install Routines"
|
||
reboot
|
||
;;
|
||
no)
|
||
msg_error "Selected no to Rebooting Proxmox VE (Reboot recommended)"
|
||
msg_ok "Completed Post Install Routines"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
main
|