#!/usr/bin/env bash # Universal Proxmox Subscription Nag Remover # Works with PVE (Proxmox VE), PBS (Proxmox Backup Server), and PMG (Proxmox Mail Gateway) # # Based on community-scripts by tteck and contributors # Original scripts: https://community-scripts.github.io/ProxmoxVE/ # License: MIT # Copyright (c) 2021-2025 community-scripts contributors set -euo pipefail # Colors for output RD=$(echo "\033[01;31m") YW=$(echo "\033[33m") GN=$(echo "\033[1;92m") BL=$(echo "\033[94m") CL=$(echo "\033[m") BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" INFO="${BL}ℹ${CL}" # Output functions 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}" } msg_note() { local msg="$1" echo -e " ${INFO} ${BL}${msg}${CL}" } # Header header_info() { clear cat <<"EOF" ╔═════════════════════════════════════════════════════════════════════════════╗ ║ Universal Proxmox Nag Remover ║ ║ PVE • PBS • PMG Support ║ ╚═════════════════════════════════════════════════════════════════════════════╝ EOF echo -e "${BL}Universal Subscription Nag Remover for All Proxmox Products${CL}" echo -e "${YW}Based on community-scripts: https://community-scripts.github.io/ProxmoxVE/${CL}" echo "" } # Detect Proxmox product detect_proxmox() { local product="" local version="" if command -v pveversion >/dev/null 2>&1; then product="PVE" version=$(pveversion | head -1) elif command -v proxmox-backup-manager >/dev/null 2>&1; then product="PBS" version=$(proxmox-backup-manager version 2>/dev/null | head -1 || echo "PBS detected") elif command -v pmgversion >/dev/null 2>&1; then product="PMG" version=$(pmgversion | head -1) elif [ -f /usr/bin/pmg-admin ]; then product="PMG" version="PMG detected" else msg_error "No supported Proxmox product detected" echo "" echo "This script supports:" echo " • Proxmox VE (PVE)" echo " • Proxmox Backup Server (PBS)" echo " • Proxmox Mail Gateway (PMG)" exit 1 fi echo "$product|$version" } # Apply nag removal based on product apply_nag_removal() { local product="$1" case $product in PVE) msg_info "Applying PVE subscription nag removal" # PVE uses the more comprehensive regex pattern cat > /etc/apt/apt.conf.d/no-nag-script << 'EOF' DPkg::Post-Invoke { "dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ $? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi"; }; EOF apt --reinstall install proxmox-widget-toolkit &>/dev/null msg_ok "PVE subscription nag removal applied" ;; PBS) msg_info "Applying PBS subscription nag removal" # PBS uses simpler regex pattern cat > /etc/apt/apt.conf.d/no-nag-script << 'EOF' DPkg::Post-Invoke { "dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ $? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi"; }; EOF apt --reinstall install proxmox-widget-toolkit &>/dev/null msg_ok "PBS subscription nag removal applied" ;; PMG) msg_info "Applying PMG subscription nag removal" # PMG needs both normal GUI and mobile GUI fixes cat > /etc/apt/apt.conf.d/no-nag-script << 'EOF' DPkg::Post-Invoke { "dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ $? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi"; }; DPkg::Post-Invoke { "dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ $? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi"; }; EOF apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null msg_ok "PMG subscription nag removal applied (desktop & mobile)" ;; esac } # Main execution main() { # Check if running as root if [[ $EUID -ne 0 ]]; then echo "This script must be run as root (use sudo)" exit 1 fi header_info # Detect Proxmox product msg_info "Detecting Proxmox product" detection_result=$(detect_proxmox) IFS='|' read -r PRODUCT VERSION <<< "$detection_result" msg_ok "Detected $PRODUCT" msg_note "$VERSION" echo "" # Check if already installed if [[ -f /etc/apt/apt.conf.d/no-nag-script ]]; then msg_info "Subscription nag removal already installed" echo "" echo "The nag removal is already active and will persist through updates." echo "To reinstall, delete /etc/apt/apt.conf.d/no-nag-script and run again." exit 0 fi # Show subscription support message echo -e "${YW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}" echo -e "${BL} Support Subscriptions${CL}" echo -e "${YW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}" echo "" echo "Supporting the software's development team is essential. Check their official" echo "website's Support Subscriptions for pricing. Without their dedicated work," echo "we wouldn't have this exceptional software." echo "" echo -e "${YW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}" echo "" # Confirm installation echo "This will disable the subscription nag message that appears when logging" echo "into the web interface. The fix will automatically reapply after updates." echo "" while true; do read -p "Continue with subscription nag removal? (y/n): " yn case $yn in [Yy]*) break ;; [Nn]*) echo "Aborted." exit 0 ;; *) echo "Please answer yes or no." ;; esac done echo "" # Apply the fix apply_nag_removal "$PRODUCT" echo "" echo -e "${GN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}" echo -e "${GN} Installation Complete${CL}" echo -e "${GN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}" echo "" echo "✓ The subscription nag has been disabled for $PRODUCT" echo "✓ The fix will automatically reapply after Proxmox updates" echo "✓ Clear your browser cache and refresh the web interface" echo "" if [[ "$PRODUCT" == "PMG" ]]; then echo "✓ Both desktop and mobile interfaces have been patched" echo "" fi echo -e "${YW}Original community-scripts: https://community-scripts.github.io/ProxmoxVE/${CL}" echo "" } # Run main function main "$@"