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