From eef7f960f3c378a7294df402c21ddf37e782b3e3 Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 24 Jul 2025 20:41:23 +0000 Subject: [PATCH] Add proxmox-nag-remover.sh --- proxmox-nag-remover.sh | 214 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 proxmox-nag-remover.sh diff --git a/proxmox-nag-remover.sh b/proxmox-nag-remover.sh new file mode 100644 index 0000000..ea0dddb --- /dev/null +++ b/proxmox-nag-remover.sh @@ -0,0 +1,214 @@ +#!/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 "$@" \ No newline at end of file