Compare commits

...

14 Commits

Author SHA1 Message Date
James Swineson 7fb0674976 update doc 2021-06-25 21:11:16 +08:00
James Swineson 698f2ca45f update 2021-06-25 20:43:02 +08:00
James Swineson e709acc4c2 update doc 2021-06-25 20:01:55 +08:00
James Swineson de21f2ae32 update doc 2021-06-25 20:01:09 +08:00
James Swineson a9d3405893 update doc 2021-06-25 19:52:59 +08:00
James Swineson c6623dff1a fix it not auto starting after installation 2021-06-25 07:37:41 +08:00
James Swineson d46e6b308e bump version to 0.0.6 2021-06-25 00:43:13 +08:00
James Swineson 170ea8fb0e fix auxiliary files 2021-06-25 00:39:36 +08:00
James Swineson 52888f4557 correct regdate & nextduedate format 2021-06-25 00:32:29 +08:00
James Swineson ec12e99343 PBS checksum does not need \n 2021-06-25 00:26:38 +08:00
James Swineson 2b7cb482ab fix wrong reference to generate_subscription_pve_pmg 2021-06-25 00:22:04 +08:00
James Swineson 12b98d61c9 more changes for PBS format 2021-06-25 00:20:25 +08:00
James Swineson 86e774ab19
remove dependence on libpve-common-perl since Proxmox Backup Server does not come with it 2021-06-25 00:00:36 +08:00
James Swineson d75f6d908d
some progress for PBS 2021-06-24 23:59:27 +08:00
5 changed files with 96 additions and 30 deletions

View File

@ -1,18 +1,37 @@
I am really poor and I really can't afford a license. I just want to get rid of the annoying dialog on every login.
Disables the "No valid subscription" dialog on all Proxmox products.
> I am really poor and I can't afford a license. I just want to get rid of the annoying dialog.
## Features
* Works for any version >=5 (we've tested this from 5.3 to 6.0 without any changes in the code)
* Supports Proxmox VE and Proxmox Mail Gateway
* Non-intrusive, no changes to any system file, persists between system updates
* Comes with standard Debian package, easy to manage and automate
* You can uninstall at any time, hassle-free
* **No JavaScript**
Works for:
- Proxmox VE (5.x or later, tested up to 7.0)
- Proxmox Mail Gateway (5.x or later)
- Proxmox Backup Server (1.x)
Highlights:
- 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
## Installation
* Go to [release](https://github.com/Jamesits/pve-fake-subscription/releases/latest) to download the latest release
* Run `dpkg -i pve-fake-subscription_*.deb` as root on every Proxmox VE node
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:
The initial run will be scheduled within 1 minute of the installation. If you don't want to wait, you can invoke it immediately by executing `pve-fake-subscription`.
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)
## Uninstallation

View File

@ -4,16 +4,16 @@ cd "$( dirname "${BASH_SOURCE[0]}" )"
fpm -s dir -t deb --force \
-n pve-fake-subscription \
--description "Pollute Proxmox VE (>=5.0) and Proxmox Mail Gateway (>=5.0) subscription cache so it won't alert you on dashboard login" \
--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" \
--url "https://github.com/Jamesits/pve-fake-subscription" \
-v 0.0.5 \
-v 0.0.7 \
--license "GLWTS(Good Luck With That Shit) Public License" \
--depends "python3" \
--depends "libpve-common-perl" \
--architecture all \
--deb-dist "unstable" \
--deb-priority "optional" \
--deb-systemd "usr/lib/systemd/system/pve-fake-subscription.timer" \
--deb-systemd-enable --deb-systemd-auto-start --deb-systemd-restart-after-upgrade \
--after-remove "scripts/purge" \
./usr

View File

@ -1,2 +1,3 @@
rm -f /etc/subscription
rm -f /etc/pmg/subscription
rm -f /etc/pmg/subscription
rm -f /etc/proxmox-backup/subscription

View File

@ -1,7 +1,8 @@
#!/usr/bin/env python3
# Pollute Proxmox VE 5.x subscription cache so it won't alert you on dashboard login
# If you need to prevent it checking keys against a server, please block "shop.maurer-it.com"
# 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
import hashlib
import base64
import json
@ -10,22 +11,28 @@ import re
import sys
import os
from typing import List
from datetime import datetime, timedelta
# /usr/share/perl5/PVE/Subscription.pm
# 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`)
shared_key_data = "kjfdlskfhiuewhfk947368"
server_key_file = "/etc/ssh/ssh_host_rsa_key.pub"
def get_timestamp() -> int:
return int(time.time())
# perl's md5_base64 implementation
def md5_base64(x: str) -> str:
return base64.b64encode(hashlib.md5(x.encode()).digest()).strip(b'=')
# Perl's md5_base64 implementation
def md5_base64_perl(x: str) -> str:
return base64.b64encode(hashlib.md5(x.encode()).digest()).strip(b'=').decode()
# Rust's `base64::encode(tools::md5sum("something")?);`
def md5_base64_rs(x: str) -> str:
return base64.b64encode(hashlib.md5(x.encode()).digest()).decode()
def generate_server_id(key: str) -> str:
return hashlib.md5(key.encode()).hexdigest().upper()
def generate_subscription(key: str, server_ids: List[str]) -> str:
def generate_subscription_pve_pmg(key: str, server_ids: List[str]) -> str:
localinfo = {
"checktime": get_timestamp(),
"status": "Active",
@ -38,17 +45,19 @@ def generate_subscription(key: str, server_ids: List[str]) -> str:
data = base64.standard_b64encode(json.dumps(localinfo).encode()).decode()
cat = str(localinfo["checktime"]) + data + "\n" + shared_key_data
csum = md5_base64(cat).decode()
csum = md5_base64_perl(cat)
return key + "\n" + csum + "\n" + data + "\n"
# key_pattern can be find in /usr/share/perl5/{PVE,PMG}/API2/Subscription.pm
def activate(key: str, key_pattern: str, subscription_file: str) -> None:
# PVE: r'pve([1248])([cbsp])-[0-9a-f]{10}'
# PMG: r'pmg([cbsp])-[0-9a-f]{10}'
def activate_pve_pmg(key: str, subscription_file: str) -> None:
# 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)
# pattern = re.compile(key_pattern)
# if not pattern.match(key):
# print("key format error", file=sys.stderr)
# sys.exit(1)
# get machine ID
server_id = ""
@ -56,7 +65,40 @@ def activate(key: str, key_pattern: str, subscription_file: str) -> None:
server_id = generate_server_id(f.read())
# generate a license file
subscription = generate_subscription(key, [server_id])
subscription = generate_subscription_pve_pmg(key, [server_id])
# write license file
with open(subscription_file, "w") as f:
f.write(subscription)
def generate_subscription_pbs(key: str, server_ids: List[str]) -> str:
localinfo = {
"status": "active", # PBS: `new`, `notfound`, `active`, `invalid`
"serverid": ",".join(server_ids),
"checktime": get_timestamp(),
"key": key,
"message": "Yajuu Senpai has got your back",
"productname": "YajuuSenpai",
"regdate": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"nextduedate": (datetime.now() + timedelta(seconds=1296000)).strftime("%Y-%m-%d"), # 1296000: MAX_LOCAL_KEY_AGE in src/tools/subscription.rs
"url": "https://github.com/Jamesits/pve-fake-subscription",
}
data = base64.standard_b64encode(json.dumps(localinfo).encode()).decode()
cat = str(localinfo["checktime"]) + data + shared_key_data
csum = md5_base64_rs(cat)
return key + "\n" + csum + "\n" + data + "\n"
# Key pattern: pbst-xxxxxxxxxx
def activate_pbs(key: str, subscription_file: str) -> None:
# get machine ID
server_id = ""
with open(server_key_file, "r") as f:
server_id = generate_server_id(f.read())
# generate a license file
subscription = generate_subscription_pbs(key, [server_id])
# write license file
with open(subscription_file, "w") as f:
@ -66,9 +108,14 @@ if __name__ == "__main__":
# Proxmox VE
if os.path.exists("/etc/pve"):
print("Activating Proxmox VE...")
activate("pve8p-1145141919", r'pve([1248])([cbsp])-[0-9a-f]{10}', "/etc/subscription")
activate_pve_pmg("pve8p-1145141919", "/etc/subscription")
# Proxmox Mail Gateway
if os.path.exists("/etc/pmg"):
print("Activating Proxmox Mail Gateway...")
activate("pmgp-1145141919", r'pmg([cbsp])-[0-9a-f]{10}', "/etc/pmg/subscription")
activate_pve_pmg("pmgp-1145141919", "/etc/pmg/subscription")
# Proxmox Backup Server
if os.path.exists("/etc/proxmox-backup"):
print("Activating Proxmox Backup Server...")
activate_pbs("pbst-1145141919", "/etc/proxmox-backup/subscription")

View File

@ -10,4 +10,3 @@ Persistent=true
[Install]
WantedBy=timers.target