diff --git a/pve-mod-nag-screen.sh b/pve-mod-nag-screen.sh new file mode 100644 index 0000000..5548264 --- /dev/null +++ b/pve-mod-nag-screen.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +# +# This bash script installs a modification to the Proxmox Virtual Environment (PVE) web user interface (UI) which deactivates the subscription nag screen. +# + +################### Configuration ############# + +# This script's working directory +SCRIPT_CWD="$(dirname "$(readlink -f "$0")")" + +# Files backup location +BACKUP_DIR="$SCRIPT_CWD/backup" + +# File paths +proxmoxlibjs="/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js" +proxmoxlibminjs="/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.min.js" + +############################################### + +# Helper functions +function msg { + echo -e "\e[0m$1\e[0m" +} + +#echo message in bold +function msgb { + echo -e "\e[1m$1\e[0m" +} + +function warn { + echo -e "\e[0;33m[warning] $1\e[0m" +} + +function err { + echo -e "\e[0;31m[error] $1\e[0m" + exit 1 +} +# End of helper functions + +# Function to display usage information +function usage { + msgb "\nUsage:\n$0 [install | uninstall]\n" + exit 1 +} + +function restart_proxy { + # Restart pveproxy + msg "\nRestarting PVE proxy..." + systemctl restart pveproxy +} + +function install_mod { + msg "\nPreparing mod installation..." + + local timestamp=$(date '+%Y-%m-%d_%H-%M-%S') + local restart=false + + if (! grep -q "// disable subscription nag screen" "$proxmoxlibjs"); then + if [ -f "$proxmoxlibjs" ]; then + mkdir -p "$BACKUP_DIR" || err "Error creating backup directory." + + # Create backup of original file + msg "Saving current version of \"$proxmoxlibjs\" to \"$BACKUP_DIR/proxmoxlib.js.$timestamp\"." + cp -P "$proxmoxlibjs" "$BACKUP_DIR/proxmoxlib.js.$timestamp" || err "Error creating backup." + + msg "Deactivating the nag screen..." + sed -i "/Ext.define('Proxmox.Utils',/ { + :a; + /checked_command:\s*function(orig_cmd)\s*{/!{N;ba;} + a\ + \\ + // disable subscription nag screen\n\ + orig_cmd();\n\ + return; + }" "$proxmoxlibjs" + fi + restart=true + else + warn "Nag screen already deactivated." + fi + + if [ ! -h "$proxmoxlibminjs" ]; then + msg "Disabling minified front-end library file..." + (mv "$proxmoxlibminjs" "$BACKUP_DIR/proxmoxlib.min.js.$timestamp" && \ + ln -s "$proxmoxlibjs" "$proxmoxlibminjs") || err "Error disabling minified front-end library file." + restart=true + else + warn "Minified front-end library file already disabled." + fi + + if [ $restart = true ]; then + restart_proxy + fi +} + +function uninstall_mod { + msg "\nRestoring modified files..." + + local restart=false + + # Find the latest backup file of proxmoxlib.js + local latest_proxmoxlibjs=$(find "$BACKUP_DIR" -name "proxmoxlib.js.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}') + + if [ -z "$latest_proxmoxlibjs" ]; then + warn "No proxmoxlib.js backup files found." + else + # Remove the latest proxmoxlib.js file + msg "Restoring \"$proxmoxlibjs\" from the latest backup file." + cp "$latest_proxmoxlibjs" "$proxmoxlibjs" + restart=true + fi + + local latest_proxmoxlibminjs=$(find "$BACKUP_DIR" -name "proxmoxlib.min.js.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}') + + if [ -z "$latest_proxmoxlibminjs" ]; then + warn "No proxmoxlib.min.js backup files found." + else + # Remove the latest proxmoxlib.min.js file + msg "Restoring \"$proxmoxlibminjs\" from the latest backup file." + rm "$proxmoxlibminjs" && cp "$latest_proxmoxlibminjs" "$proxmoxlibminjs" + restart=true + fi + + if [ $restart = true ]; then + restart_proxy + fi +} + +# Process the arguments using a while loop and a case statement +executed=0 +while [[ $# -gt 0 ]]; do + case "$1" in + install) + executed=$(($executed + 1)) + msgb "\nInstalling the Proxmox VE nag screen mod..." + install_mod + echo # add a new line + ;; + uninstall) + executed=$(($executed + 1)) + msgb "\nUninstalling the Proxmox VE nag screen mod..." + uninstall_mod + echo # add a new line + ;; + esac + shift +done + +# If no arguments were provided or all arguments have been processed, print the usage message +if [[ $executed -eq 0 ]]; then + usage +fi