# Proxmox VE ohne Subscription: kostenlose Repositories nutzen und Subscription-Hinweis ausblenden

# Proxmox VE 9: No-Subscription-Popup deaktivieren

## Fix

Betroffene Datei:

```
/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
```

Datei öffnen:

```
nano /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
```

Mit **Strg + W** nach folgendem Text suchen:

```
checked_command: function (orig_cmd)
```

Den **vollständigen** `checked_command`-Block löschen und an exakt derselben Position durch diesen Block ersetzen. Die vorhandene Einrückung beibehalten:

```
        checked_command: function (orig_cmd) {
            orig_cmd();
        },
```

**Wichtig:** Der komplette bisherige Inhalt der Funktion wird entfernt. Es bleibt kein alter Subscription-Code unterhalb von `orig_cmd()` stehen.

Danach speichern, Nano schließen und `pveproxy` neu starten:

```
systemctl restart pveproxy
```

Anschließend die Proxmox-Weboberfläche mit **Strg + F5** neu laden.

## Quick-Befehl

Wenn du die Datei nicht manuell bearbeiten willst, als `root` direkt in der Terminal-Session ausführen:

```
python3 -c '
from pathlib import Path
import re, shutil

p = Path("/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js")
s = p.read_text()

m = re.search(r"^([ \t]*)checked_command:\s*function\s*\(orig_cmd\)\s*\{", s, re.M)
if not m:
    raise SystemExit("FEHLER: checked_command wurde nicht gefunden")

indent = m.group(1)
start = m.start()
brace = s.find("{", m.start())
depth = 0
end = None

for i in range(brace, len(s)):
    if s[i] == "{":
        depth += 1
    elif s[i] == "}":
        depth -= 1
        if depth == 0:
            end = i + 1
            break

if end is None:
    raise SystemExit("FEHLER: Ende von checked_command wurde nicht gefunden")

if end >= len(s) or s[end] != ",":
    raise SystemExit("FEHLER: Abschließendes Komma von checked_command wurde nicht gefunden")
end += 1

replacement = (
    f"{indent}checked_command: function (orig_cmd) {{\n"
    f"{indent}    orig_cmd();\n"
    f"{indent}}},"
)

if s[start:end] == replacement:
    print("Patch ist bereits sauber gesetzt")
else:
    shutil.copy2(p, str(p) + ".bak")
    p.write_text(s[:start] + replacement + s[end:])
    print("Patch angewendet; Backup: " + str(p) + ".bak")
' && systemctl restart pveproxy && systemctl is-active pveproxy
```

Der Befehl übernimmt die **vorhandene Einrückung** der `checked_command`-Zeile und ersetzt den vollständigen Funktionsblock. Danach steht der Block an derselben Position wie vorher und ist sauber wie folgt eingerückt:

```
        checked_command: function (orig_cmd) {
            orig_cmd();
        },
```

Der alte Subscription-Code wird vollständig entfernt. Wenn tatsächlich eine Änderung vorgenommen wird, wird die vorherige Datei als `proxmoxlib.js.bak` gesichert.

Wenn am Ende `active` ausgegeben wird, läuft `pveproxy` wieder.

## Änderung rückgängig machen

```
cp -a /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy && systemctl is-active pveproxy
```

## Nach Updates

Ein Update von `proxmox-widget-toolkit` kann `proxmoxlib.js` ersetzen. Wenn das Popup danach wieder erscheint, den Quick-Befehl erneut ausführen. Vor einem erneuten tatsächlichen Patch wird die dann aktuelle Paketversion wieder als `.bak` gesichert.