diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..7170c54 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,39 @@ +name: Build and release package + +on: + push: + tags: + - "v*" + +jobs: + build: + name: Build and release package + runs-on: ubuntu-latest + + outputs: + package_version: ${{ steps.get_version.outputs.PACKAGE_VERSION }} + + steps: + - name: Checkout repository + id: checkout_repository + uses: actions/checkout@v4 + + - name: Build package + id: build_package + uses: jtdor/build-deb-action@v1 + env: + DEB_BUILD_OPTIONS: noautodbgsym + with: + buildpackage-opts: -us -uc -b + + - name: Get package version + id: get_version + run: echo "PACKAGE_VERSION=$(echo debian/artifacts/fake-proxmox-subscription_*_all.deb | awk -F'[_]' '{ print $2 }')" >> $GITHUB_OUTPUT + + - name: Publish release + id: publish_release + uses: ncipollo/release-action@v1 + if: github.ref_type == 'tag' + with: + name: v${{ steps.get_version.outputs.package_version }} + artifacts: debian/artifacts/fake-proxmox-subscription_${{ steps.get_version.outputs.package_version }}_all.deb diff --git a/.gitignore b/.gitignore index 7842801..c50dd2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ -*.deb -/out/ +# Debian packaging files +debian/*.debhelper* +debian/fake-proxmox-subscription/ +debian/debhelper-build-stamp +debian/fake-proxmox-subscription.substvars +debian/files # Created by https://www.gitignore.io/api/macos,python,windows,visualstudiocode # Edit at https://www.gitignore.io/?templates=macos,python,windows,visualstudiocode diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9dd05e7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM docker.io/library/debian:stable-slim AS base + +ENV FOLDER=/opt/fake-proxmox-subscription + +WORKDIR /opt/fake-proxmox-subscription + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential debhelper dpkg-dev + +COPY . $FOLDER + +RUN dpkg-buildpackage -us -uc -b +RUN mkdir debian/artifacts +RUN mv /opt/fake-proxmox-subscription_* $FOLDER/debian/artifacts/ diff --git a/LICENSE b/LICENSE index b7cc35b..8d8761c 100644 --- a/LICENSE +++ b/LICENSE @@ -23,4 +23,4 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Good luck and Godspeed. \ No newline at end of file +Good luck and Godspeed. diff --git a/README.md b/README.md index 1337e5f..122bb89 100644 --- a/README.md +++ b/README.md @@ -1,98 +1,91 @@ -# pve-fake-subscription +## fake-proxmox-subscription +A Debian package that disables the "No valid subscription" dialog on all +Proxmox products (in theory), regardless of their version. -![JavaScript free](https://img.shields.io/badge/JavaScript-free-%09%23f7df1e "No JavaScript is involved in this project. ") +Based on [Jamesits/fake-pve-subscription][1]'s work. There are a few key +differences between his repository and this repository: -Disables the "No valid subscription" dialog on all Proxmox products. +1. The name `pve-fake-subscription` has been replaced with +`fake-proxmox-subscription`. This should have been done in the first place +since the package covers all 3 Proxmox products. +2. Added proper Debian packaging so that `dpkg-buildpackage` could be used +instead of `nFPM` nonsense. +3. Added GitHub Actions workflow to build and then publish `.deb` packages. -> I am really poor and I can't afford a license. I just want to get rid of the annoying dialog. +The 3rd point above is the most critical change here. This is because you +wouldn't download and install a .deb that you can't verify has not been +altered with, would you? -## Features - -Works for: - -- Proxmox VE (5.x or later; 3.x and 4.x [require some manual actions](#compatibility-information-for-old-proxmox-ve-versions)) +### Features +This package should work and patch: +- Proxmox VE (5.x or later - 3.x and 4.x requires some manual actions) - Proxmox Mail Gateway (5.x or later) - Proxmox Backup Server (1.x or later) -Highlights: +What this package does is: +1. **Non-Intrusive**: Performs 0 modifications to the system files. +2. **Future-Proof**: Requires no adjustments between system updates & major +upgrades. +3. **Hassle-Free**: Install (or uninstall) with ease. +4. **Debian-ized**: `fake-proxmox-license` is delivered as a proper Debian +package, fresh from GitHub CI/CD to provide transparency and automation. +5. **Fuck JavaScript**: No JavaScript is involved in the whole process, because +fuck JavaScript. -- Non-intrusive: zero modification of any system file -- Future-proof: persists between system updates & major upgrades -- Hassle-free: you can uninstall at any time -- Comes with standard Debian package, easy to manage and automate -- **No JavaScript is involved** in the whole process, as I believe JavaScript is harmful to developers +### Usage +#### Installation +Download the [latest `.deb`][2] file from the [releases][2] page and install it +with `apt` or `apt-get`: -## Usage - -### Installation - -1. [Download the latest release](https://github.com/Jamesits/pve-fake-subscription/releases/latest) -1. Install: run `dpkg -i pve-fake-subscription_*.deb` as root on every node -1. (Optional) `echo "127.0.0.1 shop.maurer-it.com" | sudo tee -a /etc/hosts` to prevent fake keys from being checked against the Proxmox servers - -Notes: - -After installation, please refrain yourself from clicking the "check" button on the "Subscription" page. It will invalidate the cache and temporary revert your instance into an unlicensed status. - -The fake subscription status doesn't grant you free access to the enterprise repository. You should switch to the no-subscription repository if not already done. Use the following method: - -- [Proxmox VE (PVE)](https://pve.proxmox.com/wiki/Package_Repositories#sysadmin_no_subscription_repo) -- [Proxmox Mail Gateway (PMG)](https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html#pmg_package_repositories) -- [Proxmox Backup Server (PBS)](https://pbs.proxmox.com/docs/installation.html#proxmox-backup-no-subscription-repository) +``` +# curl -s https://api.github.com/repos/arszilla/fake-proxmox-subscription/releases/latest | grep "browser_download_url.*deb" | cut -d : -f 2,3 | tr -d \" | wget -i - -O fake-proxmox-subscription.deb +# apt install ./fake-proxmox-subscription.deb +``` ### Uninstallation +To uninstall, run `apt` or `apt-get` with the `remove` flag and the package +name: -Run as root: - -```shell -apt purge pve-fake-subscription +``` +# apt remove fake-proxmox-subscription ``` -This will revert your system to a "no subscription key" status. +### Build It Yourself +You can easily build the package yourself, assuming you have a *Debian*-based +system: -## Development Notes - -### Building the Package - -Install [nFPM](https://nfpm.goreleaser.com/install/), then: - -```shell -./package.sh +``` +$ sudo apt-get update +$ sudo apt-get install -y --no-install-recommends build-essential debhelper dpkg-dev +$ git clone https://github.com/Arszilla/fake-proxmox-subscription +$ cd fake-proxmox-subscription/ +$ dpkg-buildpackage -us -uc -b +$ ls -al ../fake-proxmox-subscription_* ``` -### Compatibility Information for Old Proxmox VE Versions +While at it, you can view and validate the contents of your newly built `.deb`: -#### PVE 4.x - -After installation or updates, run: -```shell -sed -i'' -e's/pve8p/pve4p/g' /usr/bin/pve-fake-subscription -pve-fake-subscription +``` +$ dpkg-deb --info ../fake-proxmox-subscription_*.deb +$ dpkg-deb --contents ./fake-proxmox-subscription_*.deb ``` -#### PVE 3.x +Alternatively, if you want to use `podman` or `docker` to build the `.deb`, a +`Dockerfile` is available: -Installation with `dpkg -i` will not work because of missing dependencies. Use the following script to install manually: -```shell -# extract the deb package -mkdir -p /tmp/pve-fake-subscription -dpkg-deb -x pve-fake-subscription_*.deb /tmp/pve-fake-subscription - -# patch and install the script -sed -i'' -e's/python3/python/g' -e's/pve8p/pve4p/g' /tmp/pve-fake-subscription/usr/bin/pve-fake-subscription -mv /tmp/pve-fake-subscription/usr/bin/pve-fake-subscription /usr/local/bin/ - -# install the timer -ln -sf /usr/local/bin/pve-fake-subscription /etc/cron.hourly/pve-fake-subscription - -# invoke it once -/usr/local/bin/pve-fake-subscription - -# remove temporary files -rm -rf /tmp/pve-fake-subscription +``` +$ podman build -t fake-proxmox-subscription . +$ podman run -it fake-proxmox-subscription:latest /bin/bash -c "ls -al /opt/fake-proxmox-subscription/debian/artifacts/" ``` -Removal: -```shell -rm -f /usr/local/bin/pve-fake-subscription /etc/cron.hourly/pve-fake-subscription /etc/subscription -``` +Afterwards, transfer the generated `.deb` from +`/opt/fake-proxmox-subscription/debian/artifacts/`. + +The `Dockerfile` is basic and was primarily used for build testing, +validating packaging, etc. I've only kept it in case someone might be +interested in using it. + +[1]: https://github.com/Jamesits/pve-fake-subscription +[2]: https://github.com/Arszilla/fake-proxmox-subscription/releases/latest +[3]: https://github.com/Arszilla/fake-proxmox-subscription/releases +[4]: https://github.com/Jamesits diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..b44af00 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,19 @@ +fake-proxmox-subscription (1.0.0-3) trixie; urgency=medium + + * Update changelog + * Add "Conflicts" header to debian/control + + -- Arslan Masood Mon, 25 Aug 2025 08:10:55 +0300 + +fake-proxmox-subscription (1.0.0-2) trixie; urgency=medium + + * Update changelog + * Fix typo + + -- Arslan Masood Fri, 22 Aug 2025 00:45:35 +0300 + +fake-proxmox-subscription (1.0.0-1) trixie; urgency=medium + + * Initial release + + -- Arslan Masood Thu, 21 Aug 2025 23:30:35 +0300 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..bc752bf --- /dev/null +++ b/debian/control @@ -0,0 +1,24 @@ +Source: fake-proxmox-subscription +Section: misc +Priority: optional +Maintainer: Arslan Masood +Uploaders: Arslan Masood +Rules-Requires-Root: no +Build-Depends: + debhelper-compat (= 13), +Standards-Version: 4.7.0 +Homepage: https://github.com/Arszilla/fake-proxmox-subscription +Vcs-Browser: https://github.com/Arszilla/fake-proxmox-subscription +Vcs-Git: https://github.com/Arszilla/fake-proxmox-subscription.git + +Package: fake-proxmox-subscription +Architecture: all +Depends: + ${misc:Depends}, + ${shlibs:Depends}, + python3:any, +Conflicts: + pve-fake-subscription, +Description: Remove "No valid subscription" dialog box in Proxmox products + A Debian package that disables the "No valid subscription" dialog on all + Proxmox products (in theory), regardless of their version. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..27f6f3e --- /dev/null +++ b/debian/copyright @@ -0,0 +1,42 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Source: https://github.com/Arszilla/fake-proxmox-subscription +Upstream-Name: fake-proxmox-subscription +Upstream-Contact: Arslan Masood + +Files: usr/* +Copyright: + 2025 Arslan Masood + 2019-2024 Jamesits +License: GLWTS + +Files: debian/* +Copyright: 2025 Arslan Masood +License: GLWTS + +License: GLWTS + GLWTS(Good Luck With That Shit) Public License + Copyright (c) Every-fucking-one, except the Author + . + Everyone is permitted to copy, distribute, modify, merge, sell, publish, + sublicense or whatever the fuck they want with this software but at their + OWN RISK. + . + Preamble + . + The author has absolutely no fucking clue what the code in this project + does. It might just fucking work or not, there is no third option. + . + . + GOOD LUCK WITH THAT SHIT PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION + . + 0. You just DO WHATEVER THE FUCK YOU WANT TO as long as you NEVER LEAVE + A FUCKING TRACE TO TRACK THE AUTHOR of the original product to blame for + or held responsible. + . + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + . + Good luck and Godspeed. diff --git a/debian/fake-proxmox-subscription.install b/debian/fake-proxmox-subscription.install new file mode 100644 index 0000000..d9b9c21 --- /dev/null +++ b/debian/fake-proxmox-subscription.install @@ -0,0 +1,3 @@ +usr/bin/fake-proxmox-subscription usr/bin/ +usr/lib/systemd/system/fake-proxmox-subscription.service usr/lib/systemd/system/ +usr/lib/systemd/system/fake-proxmox-subscription.timer usr/lib/systemd/system/ diff --git a/scripts/postinst b/debian/fake-proxmox-subscription.postinst similarity index 52% rename from scripts/postinst rename to debian/fake-proxmox-subscription.postinst index da7c9c6..87a35fa 100755 --- a/scripts/postinst +++ b/debian/fake-proxmox-subscription.postinst @@ -1,39 +1,44 @@ #!/bin/sh -after_upgrade() { - : +DEBSYSTEMCTL=$(command -v deb-systemd-invoke || echo systemctl) +after_upgrade() { if command -v systemctl >/dev/null; then systemctl --system daemon-reload >/dev/null || true - debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) - if ! systemctl is-enabled pve-fake-subscription.timer >/dev/null - then - : # Ensure this if-clause is not empty. If it were empty, and we had an 'else', then it is an error in shell syntax - systemctl preset pve-fake-subscription.timer >/dev/null || true - $debsystemctl start pve-fake-subscription.timer >/dev/null || true + + if ! systemctl is-enabled fake-proxmox-subscription.timer >/dev/null; then + # Ensure this if-clause is not empty. + # If it was empty, and we had an 'else', then it is an error in shell syntax. + systemctl preset fake-proxmox-subscription.timer >/dev/null || true + $DEBSYSTEMCTL start fake-proxmox-subscription.timer >/dev/null || true + else - $debsystemctl restart pve-fake-subscription.timer >/dev/null || true + $DEBSYSTEMCTL restart fake-proxmox-subscription.timer >/dev/null || true + fi + else - ln -sf /usr/bin/pve-fake-subscription /etc/cron.hourly/pve-fake-subscription + ln -sf /usr/bin/fake-proxmox-subscription /etc/cron.hourly/fake-proxmox-subscription + fi - pve-fake-subscription + # Execute the fake-proxmox-subscription script: + fake-proxmox-subscription } after_install() { - : - if command -v systemctl >/dev/null; then systemctl --system daemon-reload >/dev/null || true - debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) - systemctl preset pve-fake-subscription.timer >/dev/null || true - $debsystemctl start pve-fake-subscription.timer >/dev/null || true + systemctl preset fake-proxmox-subscription.timer >/dev/null || true + $DEBSYSTEMCTL start fake-proxmox-subscription.timer >/dev/null || true + else - ln -sf /usr/bin/pve-fake-subscription /etc/cron.hourly/pve-fake-subscription + ln -sf /usr/bin/fake-proxmox-subscription /etc/cron.hourly/fake-proxmox-subscription + fi - pve-fake-subscription + # Execute the fake-proxmox-subscription script: + fake-proxmox-subscription } if { [ "${1}" = "configure" ] && [ -z "${2}" ]; } || [ "${1}" = "abort-remove" ]; then @@ -42,15 +47,18 @@ if { [ "${1}" = "configure" ] && [ -z "${2}" ]; } || [ "${1}" = "abort-remove" ] # In that case, this script, which should be idemptoent, is run # to ensure a clean roll-back of the removal. after_install + elif [ "${1}" = "configure" ] && [ -n "${2}" ]; then - upgradeFromVersion="${2}" + UPGRADEDFROMVERSION="${2}" # "after upgrade" here # NOTE: This slot is also used when deb packages are removed, # but their config files aren't, but a newer version of the # package is installed later, called "Config-Files" state. # basically, that still looks a _lot_ like an upgrade to me. after_upgrade "${2}" + elif echo "${1}" | grep -E -q "(abort|fail)"; then echo "Failed to install before the post-installation script was run." >&2 exit 1 + fi diff --git a/scripts/postrm b/debian/fake-proxmox-subscription.postrm similarity index 94% rename from scripts/postrm rename to debian/fake-proxmox-subscription.postrm index 77de063..003c242 100755 --- a/scripts/postrm +++ b/debian/fake-proxmox-subscription.postrm @@ -1,21 +1,18 @@ #!/bin/sh after_remove() { - : - rm -f /etc/subscription rm -f /etc/pmg/subscription rm -f /etc/proxmox-backup/subscription - - rm -f /etc/cron.hourly/pve-fake-subscription + rm -f /etc/cron.hourly/fake-proxmox-subscription } after_purge() { - : + true } dummy() { - : + true } if [ "${1}" = "remove" ] || [ "${1}" = "abort-install" ]; then @@ -24,11 +21,13 @@ if [ "${1}" = "remove" ] || [ "${1}" = "abort-install" ]; then # In that case, this script, which should be idemptoent, is run # to ensure a clean roll-back of the installation. after_remove + elif [ "${1}" = "purge" ] && [ -z "${2}" ]; then # like "on remove", but executes after dpkg deletes config files # 'apt-get purge' runs 'on remove' section, then this section. # There is no equivalent in RPM or ARCH. after_purge + elif [ "${1}" = "upgrade" ]; then # This represents the case where the old package's postrm is called after # the 'preinst' script is called. @@ -37,7 +36,9 @@ elif [ "${1}" = "upgrade" ]; then # upgrade, not the uninstalled one, since it can't anticipate what new # things it will have to do to upgrade for the new version. dummy + elif echo "${1}" | grep -E -q '(fail|abort)'; then echo "Failed to install before the post-removal script was run." >&2 exit 1 + fi diff --git a/debian/fake-proxmox-subscription.prerm b/debian/fake-proxmox-subscription.prerm new file mode 100755 index 0000000..9b8b9d0 --- /dev/null +++ b/debian/fake-proxmox-subscription.prerm @@ -0,0 +1,31 @@ +#!/bin/sh + +DEBSYSTEMCTL=$(command -v deb-systemd-invoke || echo systemctl) + +before_remove() { + $DEBSYSTEMCTL stop fake-proxmox-subscription.timer >/dev/null || true + systemctl disable fake-proxmox-subscription.timer >/dev/null || true + systemctl --system daemon-reload >/dev/null || true +} + +dummy() { + true +} + +if [ "${1}" = "remove" ] && [ -z "${2}" ]; then + # "before remove" goes here: + before_remove + +elif [ "${1}" = "upgrade" ]; then + # This section is executed before the old version is removed upon upgrade. + # Generally, we should not be doing anything here for the purposes of this + # package. The newly installed package should do the upgrade, not the + # uninstalled one. This is mainly because the uninstalled one cannot + # anticipate what the updated package will change. + dummy + +elif echo "${1}" | grep -E -q "(fail|abort)"; then + echo "Failed to install before the pre-removal script was run." >&2 + exit 1 + +fi diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..1a08679 --- /dev/null +++ b/debian/rules @@ -0,0 +1,15 @@ +#!/usr/bin/make -f + +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + +%: + dh $@ + +override_dh_install: + dh_install + + chmod 0755 usr/bin/fake-proxmox-subscription + chmod 0644 usr/lib/systemd/system/fake-proxmox-subscription.service + chmod 0644 usr/lib/systemd/system/fake-proxmox-subscription.timer + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/upstream/metadata b/debian/upstream/metadata new file mode 100644 index 0000000..08b7637 --- /dev/null +++ b/debian/upstream/metadata @@ -0,0 +1,5 @@ +--- +Bug-Database: https://github.com/Arszilla/fake-proxmox-subscription/issues +Bug-Submit: https://github.com/Arszilla/fake-proxmox-subscription/issues/new +Repository-Browse: https://github.com/Arszilla/fake-proxmox-subscription +Repository: https://github.com/Arszilla/fake-proxmox-subscription.git diff --git a/nfpm.yaml b/nfpm.yaml deleted file mode 100644 index db06427..0000000 --- a/nfpm.yaml +++ /dev/null @@ -1,40 +0,0 @@ -name: "pve-fake-subscription" -arch: "all" -platform: "linux" -version: "0.0.11" -version_schema: "semver" -version_metadata: "git" - -epoch: 0 -release: 1 -section: "admin" -priority: "optional" - -maintainer: "Nobody " - -depends: -- python3 -description: | - Pollute the subscription cache of Proxmox VE (>=5.0), Proxmox Mail Gateway (>=5.0) & Proxmox Backup Server (>=1.0) so it won't alert you on dashboard login -vendor: "none" -homepage: "https://github.com/Jamesits/pve-fake-subscription" -license: "GLWTS(Good Luck With That Shit) Public License" - -contents: -- src: "./usr/bin/pve-fake-subscription" - dst: "/usr/bin/pve-fake-subscription" - file_info: - mode: 0755 -- src: "./usr/lib/systemd" - dst: "/usr/lib/systemd" - file_info: - mode: 0644 -- src: "./usr/share/doc/pve-fake-subscription" - dst: "/usr/share/doc/pve-fake-subscription" - file_info: - mode: 0644 - -scripts: - postinstall: "./scripts/postinst" - preremove: "./scripts/prerm" - postremove: "./scripts/postrm" diff --git a/package.sh b/package.sh deleted file mode 100755 index 21d60da..0000000 --- a/package.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -Eeuo pipefail -cd "$( dirname "${BASH_SOURCE[0]}" )" || exit 1 - -OUT_DIR="out" - -rm -rf "${OUT_DIR}" -mkdir -p "${OUT_DIR}" - -# build package -nfpm pkg --packager deb --target "${OUT_DIR}" - -# generate checksum -pushd "${OUT_DIR}" >/dev/null -sha256sum -b -- * > sha256sum.txt -popd >/dev/null diff --git a/scripts/prerm b/scripts/prerm deleted file mode 100755 index fdb3552..0000000 --- a/scripts/prerm +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -before_remove() { - : - - debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) - $debsystemctl stop pve-fake-subscription.timer >/dev/null || true - systemctl disable pve-fake-subscription.timer >/dev/null || true - systemctl --system daemon-reload >/dev/null || true -} - -dummy() { - : -} - -if [ "${1}" = "remove" ] && [ -z "${2}" ]; then - # "before remove" goes here - before_remove -elif [ "${1}" = "upgrade" ]; then - # Executed before the old version is removed - # upon upgrade. - # We should generally not do anything here. The newly installed package - # should do the upgrade, not the uninstalled one, since it can't anticipate - # what new things it will have to do to upgrade for the new version. - dummy -elif echo "${1}" | grep -E -q "(fail|abort)"; then - echo "Failed to install before the pre-removal script was run." >&2 - exit 1 -fi diff --git a/usr/bin/pve-fake-subscription b/usr/bin/fake-proxmox-subscription similarity index 62% rename from usr/bin/pve-fake-subscription rename to usr/bin/fake-proxmox-subscription index 41e1798..550fb25 100755 --- a/usr/bin/pve-fake-subscription +++ b/usr/bin/fake-proxmox-subscription @@ -1,8 +1,16 @@ #!/usr/bin/env python3 -# Pollute Proxmox software subscription cache so it won't alert you on dashboard login -# Should be scheduled to run every few hours with a timer to prevent cache from expiring -# If you need to prevent it checking keys against a server, please block "shop.maurer-it.com" in your hosts file +""" +Pollutes the Proxmox software subscription cache so it won't doesn't nag you +on login. + +The script should be scheduled to run every few hours using a timer to prevent +the cache from expiring. + +If you need to prevent it from checking keys against a server, block +"shop.maurer-it.com" in your /etc/hosts file (or block network traffic to the +host) +""" from __future__ import print_function import hashlib @@ -14,38 +22,46 @@ import sys import os from datetime import datetime, timedelta + # PVE & PMG: /usr/share/perl5/PVE/Subscription.pm -# PBS: /usr/lib/x86_64-linux-gnu/proxmox-backup/* (source code at `https://git.proxmox.com/git/proxmox-backup.git`) +# PBS: /usr/lib/x86_64-linux-gnu/proxmox-backup/* +# (Source code available at https://git.proxmox.com/?p=proxmox-backup.git) shared_key_data = "kjfdlskfhiuewhfk947368" server_key_file = "/etc/ssh/ssh_host_rsa_key.pub" -# Default license keys -lic_pve = "pve8p-1145141919" -lic_pmg = "pmgp-1145141919" -lic_pbs = "pbst-1145141919" +# Default license keys: +license_pve = "pve8p-1145141919" +license_pmg = "pmgp-1145141919" +license_pbs = "pbst-1145141919" + +# UI customization: +ui_product_name = "Proxmox" +ui_message = "Jamesits and Arszilla has got your back" +ui_url = "https://github.com/Arszilla/fake-proxmox-subscription" -# UI customization -ui_product_name = "YajuuSenpai" -ui_message = "Yajuu Senpai has got your back" -ui_url = "https://github.com/Jamesits/pve-fake-subscription" def get_timestamp(): return int(time.time()) -# Perl's md5_base64 implementation -def md5_base64_perl(x): - return base64.b64encode(hashlib.md5(x.encode()).digest()).strip(b'=').decode() -# Rust's `base64::encode(tools::md5sum("something")?);` +# Perl's md5_base64 implementation: +def md5_base64_perl(x): + return base64.b64encode(hashlib.md5(x.encode()).digest()).strip(b"=").decode() + + +# Rust's 'base64::encode(tools::md5sum("something")?);': def md5_base64_rs(x): return base64.b64encode(hashlib.md5(x.encode()).digest()).decode() + def generate_server_id(key): return hashlib.md5(key.encode()).hexdigest().upper() + def dt_string(format, offset_secs=0): return (datetime.now() + timedelta(seconds=offset_secs)).strftime(format) + def generate_subscription_pve_pmg(key, server_ids, product_name=ui_product_name): localinfo = { "checktime": get_timestamp(), @@ -63,74 +79,84 @@ def generate_subscription_pve_pmg(key, server_ids, product_name=ui_product_name) return key + "\n" + csum + "\n" + data + "\n" -# key_pattern can be find in /usr/share/perl5/{PVE,PMG}/API2/Subscription.pm -# PVE5+: r'pve([1248])([cbsp])-[0-9a-f]{10}' -# PVE3/4: r'pve([124])([cbsp])-[0-9a-f]{10}' -# PMG: r'pmg([cbsp])-[0-9a-f]{10}' + +# key_pattern can be found in /usr/share/perl5/{PVE,PMG}/API2/Subscription.pm +# PVE5+: r'pve([1248])([cbsp])-[0-9a-f]{10}' +# PVE3/4: r'pve([124])([cbsp])-[0-9a-f]{10}' +# PMG: r'pmg([cbsp])-[0-9a-f]{10}' def activate_pve_pmg(key, subscription_file, *args, **kwargs): - # check if the key format is correct + # Check if the key format is correct: # pattern = re.compile(key_pattern) # if not pattern.match(key): # print("key format error", file=sys.stderr) # sys.exit(1) - # get machine ID + # Get machine ID: server_id = "" with open(server_key_file, "r") as f: server_id = generate_server_id(f.read()) - # generate a license file + # Generate a license file: subscription = generate_subscription_pve_pmg(key, [server_id], *args, **kwargs) - # write license file + # Write the license file: with open(subscription_file, "w") as f: f.write(subscription) + def generate_subscription_pbs(key, server_ids, product_name=ui_product_name, message=ui_message, url=ui_url): localinfo = { - "status": "active", # PBS: `new`, `notfound`, `active`, `invalid` + # Possible values for "status" in PBS: + # - new + # - notfound + # - active + # - invalid + "status": "active", "serverid": ",".join(server_ids), "checktime": get_timestamp(), "key": key, "message": message, "productname": product_name, "regdate": dt_string("%Y-%m-%d %H:%M:%S"), - "nextduedate": dt_string("%Y-%m-%d", 1296000), # 1296000: MAX_LOCAL_KEY_AGE in src/tools/subscription.rs + # 1296000 is the MAX_LOCAL_KEY_AGE in src/tools/subscription.rs + "nextduedate": dt_string("%Y-%m-%d", 1296000), "url": url, } data = base64.standard_b64encode(json.dumps(localinfo).encode()).decode() cat = str(localinfo["checktime"]) + data + shared_key_data - csum = md5_base64_rs(cat) + checksum = md5_base64_rs(cat) + + return key + "\n" + checksum + "\n" + data + "\n" - return key + "\n" + csum + "\n" + data + "\n" # Key pattern: pbst-xxxxxxxxxx def activate_pbs(key, subscription_file, *args, **kwargs): - # get machine ID + # Get machine ID: server_id = "" with open(server_key_file, "r") as f: server_id = generate_server_id(f.read()) - # generate a license file + # Generate a license file: subscription = generate_subscription_pbs(key, [server_id], *args, **kwargs) - # write license file + # Write the license file: with open(subscription_file, "w") as f: f.write(subscription) + if __name__ == "__main__": # Proxmox VE if os.path.exists("/etc/pve"): print("Activating Proxmox VE...") - activate_pve_pmg(lic_pve, "/etc/subscription") + activate_pve_pmg(license_pve, "/etc/subscription") # Proxmox Mail Gateway if os.path.exists("/etc/pmg"): print("Activating Proxmox Mail Gateway...") - activate_pve_pmg(lic_pmg, "/etc/pmg/subscription") + activate_pve_pmg(license_pmg, "/etc/pmg/subscription") # Proxmox Backup Server if os.path.exists("/etc/proxmox-backup"): print("Activating Proxmox Backup Server...") - activate_pbs(lic_pbs, "/etc/proxmox-backup/subscription") + activate_pbs(license_pbs, "/etc/proxmox-backup/subscription") diff --git a/usr/lib/systemd/system-preset/fake-proxmox-subscription.preset b/usr/lib/systemd/system-preset/fake-proxmox-subscription.preset new file mode 100644 index 0000000..7a0e5f1 --- /dev/null +++ b/usr/lib/systemd/system-preset/fake-proxmox-subscription.preset @@ -0,0 +1 @@ +enable fake-proxmox-subscription.timer diff --git a/usr/lib/systemd/system-preset/pve-fake-subscription.preset b/usr/lib/systemd/system-preset/pve-fake-subscription.preset deleted file mode 100644 index b9e8888..0000000 --- a/usr/lib/systemd/system-preset/pve-fake-subscription.preset +++ /dev/null @@ -1 +0,0 @@ -enable pve-fake-subscription.timer diff --git a/usr/lib/systemd/system/fake-proxmox-subscription.service b/usr/lib/systemd/system/fake-proxmox-subscription.service new file mode 100644 index 0000000..34289b6 --- /dev/null +++ b/usr/lib/systemd/system/fake-proxmox-subscription.service @@ -0,0 +1,6 @@ +[Unit] +Description=Fake Proxmox Subscription - Service + +[Service] +Type=oneshot +ExecStart=/usr/bin/fake-proxmox-subscription diff --git a/usr/lib/systemd/system/pve-fake-subscription.timer b/usr/lib/systemd/system/fake-proxmox-subscription.timer similarity index 67% rename from usr/lib/systemd/system/pve-fake-subscription.timer rename to usr/lib/systemd/system/fake-proxmox-subscription.timer index f609151..2589e75 100644 --- a/usr/lib/systemd/system/pve-fake-subscription.timer +++ b/usr/lib/systemd/system/fake-proxmox-subscription.timer @@ -1,5 +1,5 @@ [Unit] -Description=Refresh fake Proxmox VE subscription cache every day +Description=Fake Proxmox Subscription - Refresher [Timer] OnActiveSec=0s diff --git a/usr/lib/systemd/system/pve-fake-subscription.service b/usr/lib/systemd/system/pve-fake-subscription.service deleted file mode 100644 index 46eb64d..0000000 --- a/usr/lib/systemd/system/pve-fake-subscription.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Fake a Proxmox VE subscription - -[Service] -Type=oneshot -ExecStart=/usr/bin/pve-fake-subscription diff --git a/usr/share/doc/pve-fake-subscription/copyright b/usr/share/doc/pve-fake-subscription/copyright deleted file mode 100644 index 2f77829..0000000 --- a/usr/share/doc/pve-fake-subscription/copyright +++ /dev/null @@ -1,7 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: pve-fake-subscription -Source: https://github.com/Jamesits/pve-fake-subscription - -Files: * -Copyright: 2019 Nobody -License: GLWTS(Good Luck With That Shit) Public License