Compare commits

..

1 Commits
master ... v02a

Author SHA1 Message Date
Scott B
99479f5a29 fixup for v02a release 2020-01-21 03:12:22 -08:00
4 changed files with 92 additions and 217 deletions

View File

@ -1,73 +1,19 @@
## pve-nag-buster pve-nag-buster
https://github.com/foundObjects/pve-nag-buster Persistent license nag removal for Proxmox VE 5.x
`pve-nag-buster` is a dpkg hook script that persistently removes license nags A bash script and dpkg pre/post install hooks to persistently remove the license nags from Proxmox VE 5.x.
from Proxmox VE 6.x and up. Install it once and you won't see another license
nag until the Proxmox team changes their web-ui code in a way that breaks the patch.
Please support the Proxmox team by [buying a subscription](https://www.proxmox.com/en/proxmox-ve/pricing) if it's within your The main script does two things: it removes the "unlicensed node" popup nag from the web gui and it switches repositories from pve-enterprise to pve-no-subscription. The script is called every time a package updates the web gui or the
means. High quality open source software like Proxmox needs our support! pve-enterprise source list and will only run if packages containing those files are changed. There are no external dependencies beyond the base packages installed with PVE by default (awk, sed, grep, wget).
### News: For your convenience the install script also contains a base64 encoded copy of pve-nag-buster.sh for use offline. I'd have just packed everything into install.sh by default but making everyone download, unxz and base64 decode a HEREDOC to look at my code seemed rude.
Last updated for: pve-manager/6.4-4/337d6701 (running kernel: 5.4.106-1-pve) To install:
### How does it work? ```
The included hook script removes the "unlicensed node" popup nag from the web
gui and disables the pve-enterprise repository list. This script is called
every time a package updates the web gui or the pve-enterprise source list and
will only run if packages containing those files are changed.
The installer installs the dpkg hook script, adds the pve-no-subscription repo list
and calls the hook script once. There are no external dependencies beyond the base
packages installed with PVE by default.
### Installation
```sh
wget https://raw.githubusercontent.com/foundObjects/pve-nag-buster/master/install.sh wget https://raw.githubusercontent.com/foundObjects/pve-nag-buster/master/install.sh
# Read the script
# Always read scripts downloaded from the internet before running them with sudo chmod +x install.sh && ./install.sh
sudo bash install.sh
# or ..
chmod +x install.sh && sudo ./install.sh
``` ```
With Git:
```sh
git clone https://github.com/foundObjects/pve-nag-buster.git
# Always read scripts downloaded from the internet before running them with sudo
cd pve-nag-buster && sudo ./install.sh
```
### Uninstall:
```sh
sudo ./install.sh --uninstall
# remove /etc/apt/sources.list.d/pve-no-subscription.list if desired
```
### Notes:
#### Why is there base64 in my peanut-butter?
For convenience the install script also contains a base64 encoded copy of the
hook script, this makes installation possible without access to github or a
full clone of the project directory.
To inspect the base64 encoded script run `./install.sh --emit`; this dumps the
encoded copy to stdout and quits. To install using the stored copy just run
`sudo ./install.sh --offline`, no internet required.
### Thanks to:
- John McLaren for his [blog post](https://www.reddit.com/user/seaqueue) documenting the web gui patch.
- [Marlin Sööse](https://github.com/msoose) for the update for PVE 6.3+
### Contact:
[Open an issue](https://github.com/foundObjects/pve-nag-buster/issues) on GitHub
Please get in touch if you find a way to improve anything, otherwise enjoy! Please get in touch if you find a way to improve anything, otherwise enjoy!

View File

@ -1,11 +1,9 @@
#!/bin/sh #!/bin/bash
# shellcheck disable=SC2064
set -eu
# pve-nag-buster (v04) https://github.com/foundObjects/pve-nag-buster # pve-nag-buster (v02a) https://github.com/foundObjects/pve-nag-buster
# Copyright (C) 2019 /u/seaQueue (reddit.com/u/seaQueue) # Copyright (C) 2019 /u/seaQueue (reddit.com/u/seaQueue)
# #
# Removes Proxmox VE 6.x+ license nags automatically after updates # Removes Proxmox VE 5.x license nags automatically after updates
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,147 +19,73 @@ set -eu
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# ensure a predictable environment RELEASE=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release)
PATH=/usr/sbin:/usr/bin:/sbin:/bin
\unalias -a
# installer main body: # create the pve-no-subscription list
_main() {
# ensure $1 exists so 'set -u' doesn't error out
{ [ "$#" -eq "0" ] && set -- ""; } > /dev/null 2>&1
case "$1" in echo "$0: Creating PVE no-subscription repo list ..."
"--emit") cat <<EOF>"/etc/apt/sources.list.d/pve-no-subscription.list"
# call the emit_script() function to stdout and exit, use this to verify # .list file automatically generated by pve-nag-buster:$0 at $(date)
# that the base64 encoded script below isn't doing anything malicious #
# does not require root # If $0 is run again this file will likely be overwritten
emit_script #
;;
"--uninstall")
# uninstall, requires root
assert_root
_uninstall
;;
"--install" | "--offline" | "")
# install dpkg hooks, requires root
assert_root
_install "$@"
;;
*)
# unknown flags, print usage and exit
_usage
;;
esac
exit 0
}
_uninstall() { deb http://download.proxmox.com/debian/pve $RELEASE pve-no-subscription
set -x EOF
[ -f "/etc/apt/apt.conf.d/86pve-nags" ] &&
rm -f "/etc/apt/apt.conf.d/86pve-nags"
[ -f "/usr/share/pve-nag-buster.sh" ] &&
rm -f "/usr/share/pve-nag-buster.sh"
echo "Script and dpkg hooks removed, please manually remove /etc/apt/sources.list.d/pve-no-subscription.list if desired" # create dpkg pre/post install hooks for persistence
}
_install() { cat <<'EOF' >/etc/apt/apt.conf.d/86pve-nags
# create hooks and no-subscription repo list, install hook script, run once DPkg::Pre-Install-Pkgs {
VERSION_CODENAME=''
ID=''
. /etc/os-release
if [ -n "$VERSION_CODENAME" ]; then
RELEASE="$VERSION_CODENAME"
else
RELEASE=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release)
fi
# create the pve-no-subscription list
echo "Creating PVE no-subscription repo list ..."
cat <<- EOF > "/etc/apt/sources.list.d/pve-no-subscription.list"
# .list file automatically generated by pve-nag-buster at $(date)
#
# If pve-nag-buster is installed again this file will be overwritten
#
deb http://download.proxmox.com/debian/pve $RELEASE pve-no-subscription
EOF
# create dpkg pre/post install hooks for persistence
echo "Creating dpkg hooks in /etc/apt/apt.conf.d ..."
cat <<- 'EOF' > "/etc/apt/apt.conf.d/86pve-nags"
DPkg::Pre-Install-Pkgs {
"while read -r pkg; do case $pkg in *proxmox-widget-toolkit* | *pve-manager*) touch /tmp/.pve-nag-buster && exit 0; esac done < /dev/stdin"; "while read -r pkg; do case $pkg in *proxmox-widget-toolkit* | *pve-manager*) touch /tmp/.pve-nag-buster && exit 0; esac done < /dev/stdin";
}; };
DPkg::Post-Invoke { DPkg::Post-Invoke {
"[ -f /tmp/.pve-nag-buster ] && { /usr/share/pve-nag-buster.sh; rm -f /tmp/.pve-nag-buster; }; exit 0"; "[ -f /tmp/.pve-nag-buster ] && { /usr/share/pve-nag-buster.sh; rm -f /tmp/.pve-nag-buster; }; exit 0";
}; };
EOF EOF
# install the hook script # fetch the post-install patch script, patches license nag and switches to pve-no-subscription repository as needed
temp=''
if [ "$1" = "--offline" ]; then
# packed script requested
temp="$(mktemp)" && trap "rm -f $temp" EXIT
emit_script > "$temp"
elif [ -f "pve-nag-buster.sh" ]; then
# local copy available
temp="pve-nag-buster.sh"
else
# fetch from github
echo "Fetching hook script from GitHub ..."
tempd="$(mktemp -d)" &&
trap "echo 'Cleaning up temporary files ...'; rm -f $tempd/*; rmdir $tempd" EXIT
temp="$tempd/pve-nag-buster.sh"
wget https://raw.githubusercontent.com/foundObjects/pve-nag-buster/master/pve-nag-buster.sh \
-q --show-progress -O "$temp"
fi
echo "Installing hook script as /usr/share/pve-nag-buster.sh"
install -o root -m 0550 "$temp" "/usr/share/pve-nag-buster.sh"
echo "Running patch script" if true ; then
wget https://raw.githubusercontent.com/foundObjects/pve-nag-buster/v02-tracking/pve-nag-buster.sh \
-O "/usr/share/pve-nag-buster.sh" && \
chmod +x "/usr/share/pve-nag-buster.sh" && \
/usr/share/pve-nag-buster.sh /usr/share/pve-nag-buster.sh
return 0 exit 0
} fi
# emit a stored copy of pve-nag-buster.sh offline -- this is intended to be used during # this is the end, example offline code below
# offline provisioning where we don't have access to github or a full cloned copy of the
# project
# run 'install.sh --emit' to dump stored script to stdout # Example code for inclusion into host provisioning scripts offline: this is just pve-nag-buster.sh
# run through "xz -z -9 -c pve-nag-buster.sh | base64" to avoid needing to fetch the script from github
# To use this installer offline just nuke the entire if block above.
# Important: if you're not me you should probably decode this and read it to make sure I'm not doing # Important: if you're not me you should probably decode this and read it to make sure I'm not doing
# something malicious like mining dogecoin or stealing your valuable cat pictures # something malicious like mining dogecoin or stealing your valuable cat pictures
# pve-nag-buster.sh (v04) encoded below: # pve-nag-buster.sh (v02a) inline:
emit_script() { base64 -d << 'YEET' | unxz > "/usr/share/pve-nag-buster.sh"
base64 -d << 'YEET' | unxz /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4AXRA3pdABGIQkY99Bhqpmevep/kIs9shoiNvzAP074w
/Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4AYGA5ZdABGIQkY99BY0cwoNj8U0dcgowbs41qLC+aej LI3FnbhLtpij4weS6O58RswsnT67TBgH7Rsc8bxwiB1Lv5br0YsbPNnFQy7KRCCnjq5BmHl8ewli
mGQYj9kDeUYQYXlWIuqhoJLO08e8hIe8MoGJqvcVxM5VQehFNPqq4OH1KhbHgYGz5QSdcYFBPv2D cLpDi7Dc9/I2MuIMG6VK2B75w9dhZxmw2qavBgM1xg/3AR3JXu1327pC0chiEZiMlF+b78M632pi
jY49io85pCEdBXRw6wLkkTOpm7NoQQs6ZJ5F+vtHWz70HmnRfNhHpjrb16GcK0ERg/VLAx58EUIU tQ0In1VHA0ZBFVckOw4jS/HuGSg70cM3HD/VI9Ti9RPFQ3HeBWx+oUBu2z99IyGp4hdPpWnO2WPX
t9OVgypxnKVdJL7/XxL/nUYLT65sn6ZQvKn4HpuPvK5eKgjZfBYJ3Q0CPDeFlXWIew43sqJTwmlX dHFRnKjqWKt4ncwq4MINFu6gygPSCuSIc8J942/4kb/QWg8UQjKA542BRKizHXX0GnlkXGwaLS8m
drWBSOlU6yMbmhWTJvfLpK9UfBAh6Qwp6UJ6i0Hbwe+d8qKO/SQ1Ciz6qDbM/cLTIENPYvVjlqzV NHuNdLtwoM/s2jzZHRgmRs6XpOq4P2KJlsPVb/HeaNDL9ijvpxpOnS8Fyf/aPdxkyw1grarTJlZ5
jDmBtzdGMfqXXuFbtNB1uIJVUd3o1rRgH0Pau7yYXZVjDxJ5a32NnSwbbxsYqvcDc5QARfe321vH bncMjA4vulLpT25lwKp+obTdDzejbniN50IQ/m3XjEWp/GhgraLFAjfHLQNHrHsmB5Wp/vo/nEhm
ICPQMtds3p/nuCpmMNex8SorApU6X0jvw18w9uMIF7dE2tk0Ge58qiIOH/+V2uVZzAUAUpTa7Gb8 OLG0W2mMgQ3dEMzQJLw7aR5Q20wf0S/+ijId4mvKjxSE9LY8EJyXA2ihO/50xQSKIt6QJ/dP/QM/
0aKWiai6f4bMXfLwvUOiDOucGAW2mMzXClpI7m4jrBy+TjSjPSR1JvS2e9ppcVH2vwcXdUOxxybB xbElPe8mEtKKSj5QHoRvamJ0Nk5fIzOeRB16UGJG8Dhej7SAG7k8brDhQQYxX+hUq5cBJFV9h2yK
aDCozlkd9DecONOygFJz7J+V323Oe/kocpUmrZjsQTv0kIveFoPKTTkVYX7JPhePK4FJ884pSafp RCkvjnDWWkQ87YFbH72ptzPRNGAUxXaR0woN8sFrAl/+obO7BVlqyG/v4ARhHqS/7WN7qiHp28bL
D+KYD3iGv3QqUt0rJBFP1IHhCKsRBNAGgDEaWUUCpT7XVRgGnhXcbQYyegBik+zenQOK6VV/t61Y 9xYdlrDvYPkMb27lp3ntyFHd3ogtqiniP+GNqfSqgL93nAPJCPy1jPAR6u8wLvGdi3KCFvzw79wx
S4Jy/U332GBwLIFRjJotutij5xQmly2AnADFu5LauI9Ud8/JaR9A/AnY05eP8LbotD5oAZf973pI vb9Xe3NWBaJ8hTnA6vMgPcCiA20TWYJbnKoYG/AuFXXaRGtSMWeNYF3HM0S7BMSs5JdK9smn771X
UJ5kAdMn+tgw4OP26QC35iaDK/EPWNOyz+1pjrfY/cybwBjwstmu4BaTdbNzb3im39wIX7wOcX8e X61EpggTzccoPWc5AdrAAsBCrh2eKDABd9mY+8IAsStKVcH1KIkF56Nmt0WdR9XiNn/JmmkhAy+m
NCixn7Q/gi9gDK+i0Ulfi5R20+QenkgNssOJ3kLfhuutsj5mYJ6wYeEE0mshgzDuXK2fW+ehHqtS 0DLIrdyLcgrIirfPgSIPkVX8FC6tSu7KcSzikxuWt7SmQO9es6Q/wVmVQ4rQL2LHGLPqSHBPs4HE
SOTIUn3cTl74GhjX9tlotUaFGdt/yR/8N8TDzc9dRd7As9Eg4gKfP6pnZJnutTB7k7feponsA+3h msa/VSTNw2Efqk5Ofdble0Yi2ECr1YAyVQshkg859YgMg/QJ5qwjBhahG5oU4Db6lWHbQkrWLH+T
Qbgm0NdjrxL93IdmB6cgJnMUm/A6GJTv5UynUDYwjZO82rUl3zkVGfu5nNKyEWN7K5gfRBi2l5oQ CIpfCvwJBQQnyyb0bAPgEJtbDVyjoaEkC9pTzwPvDkiJA+0cFEydxEOfMqvG3HMCcKIPN+EMh0tW
kckHNZJwTLt7Vta4OAfd5fraF37aRquLfrI0TGU+wHAqKpwoBpU3YOZ7o5//2CEVk7vrz5O4N6e4 Vm9ABSQn4A9kAAAAxDleg/tFU5sAAZYH0gsAAGBjQjqxxGf7AgAAAAAEWVo=
erl0B2a6XTQ2u/ICDkCLaA2q4FIbMtlCsNHjkKPV5xQO+/maKQAAABUX772XxF0fAAGyB4cMAABV
zeNfscRn+wIAAAAABFla
YEET YEET
} chmod +x "/usr/share/pve-nag-buster.sh"
/usr/share/pve-nag-buster.sh
assert_root() { [ "$(id -u)" -eq '0' ] || { echo "This action requires root." && exit 1; }; }
_usage() { echo "Usage: $(basename "$0") (--emit|--offline|--uninstall)"; }
_main "$@"

View File

@ -1,16 +1,22 @@
#!/bin/sh #!/bin/sh
_VERS="v04" _VERS="v02a"
_BRANCH=$(git rev-parse --abbrev-ref HEAD) >/dev/null 2>&1 || _BRANCH=$(git branch --show-current) ||
{ echo "can't poll branch, defaulting to master" && _BRANCH="master"; } { echo "can't poll branch, defaulting to master" && _BRANCH="master"; }
# update versions before packing install.sh # update versions before packing install.sh
sed -i -r \ sed -i \
-e "s;\(v[[:digit:]][[:digit:]].?\);\($_VERS\);" \ -e "s;(v[[:digit:]][[:digit:]]);($_VERS);" \
-e "s;(nag-buster/).*(/(pve-nag-buster|install)\.sh);\1$_BRANCH\2;" \ -e "s;nag-buster/.*/;nag-buster/$_BRANCH/;" \
pve-nag-buster.sh install.sh README.md pve-nag-buster.sh install.sh README.md
#sed -i -e "s/([v[[:digit:]][[:digit:]])/($_VERS)/" pve-nag-buster.sh install.sh
#sed -i -e "s;nag-buster/.*/;nag-buster/$_BRANCH/;" install.sh README.md
# TODO there's probably a two liner to handle all of this in awk: # I have no idea what I'm doing 🐶
#awk 'FNR==NR{s=(!s)?$0:s RS $0;next} /__BASE64__/{sub(/__BASE64__/, s)} 1' \
# <(xz -z -9 -c pve-nag-buster.sh | base64) src/install > install.sh
# TODO: there's probably a two liner to handle all of this in awk
# pack install.sh # pack install.sh
{ {

View File

@ -1,9 +1,9 @@
#!/bin/sh #!/bin/bash
# #
# pve-nag-buster.sh (v04) https://github.com/foundObjects/pve-nag-buster # pve-nag-buster.sh (v02a) https://github.com/foundObjects/pve-nag-buster
# Copyright (C) 2019 /u/seaQueue (reddit.com/u/seaQueue) # Copyright (C) 2019 /u/seaQueue (reddit.com/u/seaQueue)
# #
# Removes Proxmox VE 6.x+ license nags automatically after updates # Removes Proxmox VE 5.x license nags automatically after updates
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -19,14 +19,13 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
NAGTOKEN="data.status.toLowerCase() !== 'active'" NAGTOKEN="data.status !== 'Active'"
NAGFILE="/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js" NAGFILE="/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js"
SCRIPT="$(basename "$0")"
# disable license nag: https://johnscs.com/remove-proxmox51-subscription-notice/ # disable license nag: https://johnscs.com/remove-proxmox51-subscription-notice/
if grep -qs "$NAGTOKEN" "$NAGFILE" > /dev/null 2>&1; then if grep -qs "$NAGTOKEN" "$NAGFILE" > /dev/null 2>&1; then
echo "$SCRIPT: Removing Nag ..." echo "$0: Removing Nag ..."
sed -i.orig "s/$NAGTOKEN/false/g" "$NAGFILE" sed -i.orig "s/$NAGTOKEN/false/g" "$NAGFILE"
systemctl restart pveproxy.service systemctl restart pveproxy.service
fi fi
@ -36,6 +35,6 @@ fi
PAID_BASE="/etc/apt/sources.list.d/pve-enterprise" PAID_BASE="/etc/apt/sources.list.d/pve-enterprise"
if [ -f "$PAID_BASE.list" ]; then if [ -f "$PAID_BASE.list" ]; then
echo "$SCRIPT: Disabling PVE paid repo list ..." echo "$0: Disabling PVE paid repo list ..."
mv -f "$PAID_BASE.list" "$PAID_BASE.disabled" mv -f "$PAID_BASE.list" "$PAID_BASE.disabled"
fi fi