From f3bda28338398a3b5870afe582ffc9a8948d5ea6 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Tue, 22 Sep 2026 23:22:51 +0200 Subject: [PATCH] refactor(oci): remove the shell entry point nothing runs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `oci/proxmenux-oci.sh` was installed on every Proxmox host and used on none of them. The menu entry goes straight to the orchestrator: scripts/oci/oci_manager_apps.sh runs `python3 -m proxmenux_oci` with PYTHONPATH pointing at the engine. Its only remaining caller was a message telling the reader to open it on the Proxmox host — which is not how anyone gets in, and is what sent one there to run it. That message now names the menu entry. It could not be fetched and run either: it needs requirements.txt and src/ beside it, so `wget | bash` resolved its own directory to the working directory and failed on a path nobody chose. Making that work would mean writing a second installer next to the one that already ships the engine. What it did offer was a virtualenv for a contributor generating the catalog. The README now gives the direct invocation and names the two distribution packages it needs. Co-Authored-By: Claude Opus 5 (1M context) --- lang/de.json | 1 - lang/es.json | 2 +- lang/fr.json | 1 - lang/it.json | 1 - lang/pt.json | 1 - lang/sk.json | 1 - lang/sv.json | 1 - oci/PACKAGE-CONTENTS.md | 1 - oci/README.md | 22 +++++------ oci/proxmenux-oci.sh | 58 ----------------------------- oci/src/proxmenux_oci/management.py | 2 +- 11 files changed, 12 insertions(+), 79 deletions(-) delete mode 100755 oci/proxmenux-oci.sh diff --git a/lang/de.json b/lang/de.json index 35c732f6..3e0bc6e9 100644 --- a/lang/de.json +++ b/lang/de.json @@ -6209,7 +6209,6 @@ "This installation will:": "Diese Installation wird:", "This installer will:": "Dieses Installationsprogramm wird:", "This interface is configured but doesn't exist physically": "Diese Schnittstelle ist konfiguriert, aber physisch nicht vorhanden", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Diese Schnittstelle läuft auf dem Proxmox-Knoten als root. Öffnen Sie proxmenux-oci.sh auf dem Proxmox-Host.", "This is IRREVERSIBLE.": "Das ist irreversibel.", "This is a destructive action": "Dies ist eine destruktive Aktion", "This is a simple configuration change": "Dies ist eine einfache Konfigurationsänderung", diff --git a/lang/es.json b/lang/es.json index 178f0c3c..20186114 100644 --- a/lang/es.json +++ b/lang/es.json @@ -6209,7 +6209,7 @@ "This installation will:": "Esta instalación:", "This installer will:": "Este instalador:", "This interface is configured but doesn't exist physically": "Esta interfaz está configurada pero no existe físicamente.", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Esta interfaz se ejecuta en el nodo Proxmox como root. Abre proxmenux-oci.sh en el host Proxmox.", + "This interface runs on the Proxmox node as root. Open OCI manager Apps from the ProxMenux menu on the Proxmox host.": "Esta interfaz se ejecuta en el nodo Proxmox como root. Abre OCI manager Apps desde el menú de ProxMenux en el host Proxmox.", "This is IRREVERSIBLE.": "Esto es IRREVERSIBLE.", "This is a destructive action": "Esta es una acción destructiva.", "This is a simple configuration change": "Este es un cambio de configuración simple.", diff --git a/lang/fr.json b/lang/fr.json index 1f052d64..2b676ca2 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -6209,7 +6209,6 @@ "This installation will:": "Cette installation va :", "This installer will:": "Ce programme d'installation va :", "This interface is configured but doesn't exist physically": "Cette interface est configurée mais n'existe pas physiquement", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Cette interface fonctionne sur le nœud Proxmox comme racine. Ouvrez proxmenux-oci.sh sur l'hôte Proxmox.", "This is IRREVERSIBLE.": "C’est IRRÉVERSIBLE.", "This is a destructive action": "Il s’agit d’une action destructrice", "This is a simple configuration change": "Il s'agit d'un simple changement de configuration", diff --git a/lang/it.json b/lang/it.json index 7bda9ab7..1834d2f8 100644 --- a/lang/it.json +++ b/lang/it.json @@ -6209,7 +6209,6 @@ "This installation will:": "Questa installazione:", "This installer will:": "Questo programma di installazione:", "This interface is configured but doesn't exist physically": "Questa interfaccia è configurata ma non esiste fisicamente", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Questa interfaccia funziona sul nodo Proxmox come root. Aprire proxmenux-oci.sh sull'host Proxmox.", "This is IRREVERSIBLE.": "questo è IRREVERSIBILE.", "This is a destructive action": "Questa è un'azione distruttiva", "This is a simple configuration change": "Si tratta di una semplice modifica della configurazione", diff --git a/lang/pt.json b/lang/pt.json index aae7cb49..a874f7d8 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -6209,7 +6209,6 @@ "This installation will:": "Esta instalação irá:", "This installer will:": "Este instalador irá:", "This interface is configured but doesn't exist physically": "Esta interface está configurada, mas não existe fisicamente", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Esta interface é executada no nó Proxmox como root. Abra proxmenux-oci.sh no host Proxmox.", "This is IRREVERSIBLE.": "Isso é IRREVERSÍVEL.", "This is a destructive action": "Esta é uma ação destrutiva", "This is a simple configuration change": "Esta é uma simples mudança de configuração", diff --git a/lang/sk.json b/lang/sk.json index 02b811ca..b9b235b9 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -6209,7 +6209,6 @@ "This installation will:": "Táto inštalácia urobí toto:", "This installer will:": "Tento inštalátor urobí toto:", "This interface is configured but doesn't exist physically": "Toto rozhranie je nastavené, ale fyzicky neexistuje", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Toto rozhranie beží na uzle Proxmox ako koreň. Otvorte proxmenux-oci.sh na hostiteľovi Proxmox.", "This is IRREVERSIBLE.": "Toto je NEVRATNÉ.", "This is a destructive action": "Toto je deštruktívna akcia", "This is a simple configuration change": "Ide o jednoduchú zmenu nastavenia", diff --git a/lang/sv.json b/lang/sv.json index 1df374a9..42cfb71f 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -6209,7 +6209,6 @@ "This installation will:": "Denna installation kommer att:", "This installer will:": "Detta installationsprogram kommer att:", "This interface is configured but doesn't exist physically": "Detta gränssnitt är konfigurerat men existerar inte fysiskt", - "This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.": "Detta gränssnitt körs på Proxmox-noden som rot. Öppna proxmenux-oci.sh på Proxmox-värden.", "This is IRREVERSIBLE.": "Detta är IRREVERSIBELT.", "This is a destructive action": "Detta är en destruktiv handling", "This is a simple configuration change": "Detta är en enkel konfigurationsändring", diff --git a/oci/PACKAGE-CONTENTS.md b/oci/PACKAGE-CONTENTS.md index d7d6fc8e..6247e40e 100644 --- a/oci/PACKAGE-CONTENTS.md +++ b/oci/PACKAGE-CONTENTS.md @@ -2,7 +2,6 @@ Runtime distribution only: -- `proxmenux-oci.sh`: entry point, run from this directory. - `catalog/`: index, application templates, curated definitions and overlays. - `src/`: menu and deployment orchestrator. - `remote/`: native Proxmox OCI/LXC installation and lifecycle helpers. diff --git a/oci/README.md b/oci/README.md index 4c4871e3..2405ba10 100644 --- a/oci/README.md +++ b/oci/README.md @@ -58,26 +58,24 @@ compatible merely because conversion succeeded. ## Catalog maintenance -The catalog is generated rather than written by hand. `proxmenux-oci.sh` is the -tool that produces and inspects it, and it is what a contributor adding an -application runs: +The catalog is generated rather than written by hand. A contributor adding an +application runs the orchestrator directly from this directory: ```bash -./proxmenux-oci.sh sync -./proxmenux-oci.sh list --filter sonarr -./proxmenux-oci.sh generate sonarr -./proxmenux-oci.sh show sonarr -GITHUB_TOKEN=github_pat_xxx ./proxmenux-oci.sh generate-all +export PYTHONPATH=src +python3 -m proxmenux_oci sync +python3 -m proxmenux_oci list --filter sonarr +python3 -m proxmenux_oci generate sonarr +python3 -m proxmenux_oci show sonarr +GITHUB_TOKEN=github_pat_xxx python3 -m proxmenux_oci generate-all ``` `generate` writes one application's template from its published recipe; `show` prints what the installation would create, which is the fastest way to see whether a translation came out right before installing anything. -On Debian and Proxmox the launcher reuses the distribution packages -`python3-yaml` and `python3-jsonschema` when they are present, so nothing is -installed into the system Python. Where they are absent, install them with APT -before generating the catalog. +It needs `python3-yaml` and `python3-jsonschema`. On Debian and Proxmox both +are distribution packages; install them with APT before generating the catalog. `GITHUB_TOKEN` is optional and only raises the public API rate limit, which the full `generate-all` pass reaches. Never commit a token; `.env` files are diff --git a/oci/proxmenux-oci.sh b/oci/proxmenux-oci.sh deleted file mode 100755 index efd13d63..00000000 --- a/oci/proxmenux-oci.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash -set -Eeuo pipefail - -ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) -VENV_DIR="$ROOT_DIR/.venv" -REQUIREMENTS="$ROOT_DIR/requirements.txt" -STAMP="$VENV_DIR/.requirements.sha256" - -# The orchestrator lives beside this script, so it has to run from where it -# was installed. Piped from a URL there is no directory to read: $0 is "bash", -# ROOT_DIR becomes the working directory, and the first missing file reports a -# path nobody asked for. -if [ ! -r "$REQUIREMENTS" ] || [ ! -d "$ROOT_DIR/src/proxmenux_oci" ]; then - cat >&2 </dev/null 2>&1 || { - echo "ERROR: Python 3 is required." >&2 - exit 1 -} - -if python3 -c 'import yaml, jsonschema' >/dev/null 2>&1; then - PYTHON=python3 -else - if [[ ! -x "$VENV_DIR/bin/python" ]] || ! "$VENV_DIR/bin/python" -m pip --version >/dev/null 2>&1; then - echo "Preparing the local Python environment..." - rm -rf "$VENV_DIR" - python3 -m venv "$VENV_DIR" || { - echo "ERROR: could not create the virtual environment. On Debian, install python3-venv, python3-yaml and python3-jsonschema." >&2 - exit 1 - } - fi - if command -v shasum >/dev/null 2>&1; then - CURRENT_HASH=$(shasum -a 256 "$REQUIREMENTS" | awk '{print $1}') - else - CURRENT_HASH=$(sha256sum "$REQUIREMENTS" | awk '{print $1}') - fi - INSTALLED_HASH=$(cat "$STAMP" 2>/dev/null || true) - if [[ "$CURRENT_HASH" != "$INSTALLED_HASH" ]]; then - echo "Installing the converter dependencies..." - "$VENV_DIR/bin/python" -m pip install --disable-pip-version-check -r "$REQUIREMENTS" - printf '%s\n' "$CURRENT_HASH" >"$STAMP" - fi - PYTHON="$VENV_DIR/bin/python" -fi - -export PYTHONPATH="$ROOT_DIR/src${PYTHONPATH:+:$PYTHONPATH}" -exec "$PYTHON" -m proxmenux_oci "$@" diff --git a/oci/src/proxmenux_oci/management.py b/oci/src/proxmenux_oci/management.py index 91a2eba4..685017fc 100644 --- a/oci/src/proxmenux_oci/management.py +++ b/oci/src/proxmenux_oci/management.py @@ -141,7 +141,7 @@ def interactive_management(project, ui): def _interactive_management(project, ui): if os.geteuid() != 0 or not shutil.which('pct'): - ui.message(translate('This interface runs on the Proxmox node as root. Open proxmenux-oci.sh on the Proxmox host.'), translate('OCI management')) + ui.message(translate('This interface runs on the Proxmox node as root. Open OCI manager Apps from the ProxMenux menu on the Proxmox host.'), translate('OCI management')) return rows = saved_inventory(project) if not rows: