From 8bb44d526af6ffebe617f60e31d001059f35cb19 Mon Sep 17 00:00:00 2001 From: Mikhail Iliasov Date: Thu, 4 Jun 2026 11:45:51 +0300 Subject: [PATCH] Refactor plugin + scripts; survive pve-manager upgrades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pve-trunks-plugin.js: убран мёртвый код (origHandler), идемпотентность (не добавлять поле дважды), null-safety при смене вёрстки PVE, вынос regex в trunksRegex, отдельный addTrunksField(); логика onGetValues/me.network сверена с реальной PVE.qemu.NetworkInputPanel (PVE 9.2). - install.sh: бэкап index.html.tpl, проверка , идемпотентность, и переживание apt upgrade: persistent-копия + pve-trunks-reapply.sh + apt-hook (рестарт pveproxy только при реальном изменении), cache-busting ?ver. - uninstall.sh: снимает плагин и всю reapply-машинерию, бэкап шаблона. - README: разделы про сериализацию и переживание обновлений. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 16 ++++++-- install.sh | 93 ++++++++++++++++++++++++++++++++++---------- pve-trunks-plugin.js | 66 +++++++++++++++++++------------ uninstall.sh | 26 ++++++++----- 4 files changed, 144 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 5f76274..2847138 100644 --- a/README.md +++ b/README.md @@ -72,10 +72,20 @@ ip link add link eth0 name eth0.200 type vlan id 200 ## Как работает -Плагин использует ExtJS `override` на `PVE.qemu.NetworkInputPanel` и добавляет поле Trunks в секцию Advanced. Оригинальные файлы Proxmox не модифицируются — загружается только новый JS-файл через index template. +Плагин использует ExtJS `override` на `PVE.qemu.NetworkInputPanel` и добавляет поле Trunks в секцию Advanced. Сериализацию делает штатный `PVE.Parser.printQemuNetwork` (он уже умеет `trunks=`), плагин лишь поддерживает `me.network.trunks`. Исходные файлы pvemanagerlib не правятся — добавляется только новый JS-файл, подключённый в index template после `pvemanagerlib.js`. + +### Переживание обновлений + +JS-файл (`/usr/share/pve-manager/js/`) и `index.html.tpl` принадлежат пакету `pve-manager`, поэтому `apt upgrade` их затирает. Установщик поэтому: + +- кладёт копию плагина в `/usr/local/share/pve-trunks-plugin/`; +- ставит идемпотентный `/usr/local/sbin/pve-trunks-reapply.sh` (восстанавливает JS и тег в шаблоне, перезапускает `pveproxy` только при реальном изменении); +- регистрирует apt-hook `/etc/apt/apt.conf.d/99-pve-trunks-plugin`, дёргающий reapply в конце apt-транзакции. + +`install.sh` и `uninstall.sh` идемпотентны; перед правкой `index.html.tpl` делается бэкап `index.html.tpl.pve-trunks-bak`. ## Файлы - `pve-trunks-plugin.js` — ExtJS override плагин -- `install.sh` — установщик -- `uninstall.sh` — удаление +- `install.sh` — установщик (+ reapply-hook для апгрейдов) +- `uninstall.sh` — удаление (вместе с reapply-машинерией) diff --git a/install.sh b/install.sh index ced34ee..1504334 100755 --- a/install.sh +++ b/install.sh @@ -1,42 +1,93 @@ #!/bin/bash # PVE Trunks Plugin - Installer -# Adds "Trunks" field to VM Network Device editor in Proxmox VE UI +# Adds a "Trunks" field to the VM Network Device editor in the Proxmox VE UI. # # Usage: bash install.sh +# +# Both the plugin JS and the index template belong to the `pve-manager` +# package, so an `apt upgrade` wipes them. This installer therefore also sets +# up a reapply hook so the plugin survives Proxmox updates. -set -e +set -euo pipefail PLUGIN_JS="pve-trunks-plugin.js" PVE_JS_DIR="/usr/share/pve-manager/js" INDEX_TPL="/usr/share/pve-manager/index.html.tpl" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -SCRIPT_TAG='' -# Check running as root +# Persistent copy + reapply machinery (so upgrades can restore the plugin). +STORE_DIR="/usr/local/share/pve-trunks-plugin" +REAPPLY="/usr/local/sbin/pve-trunks-reapply.sh" +APT_HOOK="/etc/apt/apt.conf.d/99-pve-trunks-plugin" +SCRIPT_TAG='' + if [ "$(id -u)" -ne 0 ]; then - echo "Error: run as root" + echo "Error: run as root" >&2 exit 1 fi -# Check Proxmox -if [ ! -d "$PVE_JS_DIR" ]; then - echo "Error: Proxmox VE not found ($PVE_JS_DIR missing)" +if [ ! -d "$PVE_JS_DIR" ] || [ ! -f "$INDEX_TPL" ]; then + echo "Error: Proxmox VE not found ($PVE_JS_DIR / $INDEX_TPL missing)" >&2 exit 1 fi -# Copy plugin JS -cp "$SCRIPT_DIR/$PLUGIN_JS" "$PVE_JS_DIR/$PLUGIN_JS" -echo "Installed $PVE_JS_DIR/$PLUGIN_JS" - -# Patch index template if not already patched -if ! grep -q "pve-trunks-plugin" "$INDEX_TPL"; then - # Insert before closing - sed -i "s||${SCRIPT_TAG}\n|" "$INDEX_TPL" - echo "Patched $INDEX_TPL" -else - echo "Index template already patched, skipping" +if [ ! -f "$SCRIPT_DIR/$PLUGIN_JS" ]; then + echo "Error: $PLUGIN_JS not found next to installer" >&2 + exit 1 fi -# Restart web UI -systemctl restart pveproxy +# 1) Persist the plugin source for the reapply hook. +install -d "$STORE_DIR" +install -m 0644 "$SCRIPT_DIR/$PLUGIN_JS" "$STORE_DIR/$PLUGIN_JS" + +# 2) Install the reapply script (idempotent; restarts pveproxy only on change). +cat > "$REAPPLY" </dev/null; then + install -m 0644 "\$STORE_DIR/\$PLUGIN_JS" "\$PVE_JS_DIR/\$PLUGIN_JS" + changed=1 +fi + +# Re-add the