mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-11 11:06:24 +00:00
Merge pull request #224 from MacRimi/hotfix/v1.2.2.1-menu-self-heal
v1.2.2.1 part 2: self-heal monitor unit on menu launch (#222)
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
Single-purpose patch for [#222](https://github.com/MacRimi/ProxMenux/issues/222). Users updating from any v1.2.1.x stable installation to v1.2.2 hit a `proxmenux-monitor.service` that refused to start with `status=203/EXEC`. The v1.2.2 install layout extracts the AppImage into `/usr/local/share/proxmenux/monitor-app/` and runs `AppRun` out of that directory — but the installer's update path was reusing whichever unit file was already present and only refreshing the unit on a fresh install, so the inherited unit kept its old `ExecStart=/usr/local/share/proxmenux/ProxMenux-Monitor.AppImage` line. That path used to be a FUSE-mounted AppImage run, which v1.2.2 deliberately moved away from to clear a Wazuh rule-521 false positive on `/tmp/.mount_*`; under PVE 9.x / Debian 13 the bare AppImage failed to exec and the service entered the activating loop. The installer now always rewrites the unit to point at `AppRun` on every update — idempotent for installs whose unit is already correct, recovering for those whose isn't.
|
Single-purpose patch for [#222](https://github.com/MacRimi/ProxMenux/issues/222). Users updating from any v1.2.1.x stable installation to v1.2.2 hit a `proxmenux-monitor.service` that refused to start with `status=203/EXEC`. The v1.2.2 install layout extracts the AppImage into `/usr/local/share/proxmenux/monitor-app/` and runs `AppRun` out of that directory — but the installer's update path was reusing whichever unit file was already present and only refreshing the unit on a fresh install, so the inherited unit kept its old `ExecStart=/usr/local/share/proxmenux/ProxMenux-Monitor.AppImage` line. That path used to be a FUSE-mounted AppImage run, which v1.2.2 deliberately moved away from to clear a Wazuh rule-521 false positive on `/tmp/.mount_*`; under PVE 9.x / Debian 13 the bare AppImage failed to exec and the service entered the activating loop. The installer now always rewrites the unit to point at `AppRun` on every update — idempotent for installs whose unit is already correct, recovering for those whose isn't.
|
||||||
|
|
||||||
|
The `menu` launcher additionally self-heals on startup: if it detects the exact broken fingerprint (unit `ExecStart` pointing at the bare AppImage AND the extracted `AppRun` already present on disk) it rewrites the unit and bounces the service before showing the update prompt, so a user who dismisses the update by reflex still ends up with a working Monitor.
|
||||||
|
|
||||||
To recover an existing broken v1.2.2 install without waiting for the update prompt, run the installer manually once: `bash -c "$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)"`.
|
To recover an existing broken v1.2.2 install without waiting for the update prompt, run the installer manually once: `bash -c "$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)"`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
Parche puntual para [#222](https://github.com/MacRimi/ProxMenux/issues/222). Los usuarios que actualizaban desde una instalación v1.2.1.x estable a v1.2.2 se encontraban con un `proxmenux-monitor.service` que no arrancaba con `status=203/EXEC`. El layout de instalación de v1.2.2 extrae el AppImage en `/usr/local/share/proxmenux/monitor-app/` y ejecuta `AppRun` desde ese directorio — pero el path de update del installer reutilizaba la unit file existente y solo refrescaba la unit en instalación nueva, así que la unit heredada conservaba su `ExecStart=/usr/local/share/proxmenux/ProxMenux-Monitor.AppImage` antiguo. Ese path era un AppImage montado por FUSE, algo que v1.2.2 abandonó deliberadamente para eliminar un falso positivo de la regla 521 de Wazuh sobre `/tmp/.mount_*`; bajo PVE 9.x / Debian 13 ejecutar el AppImage directamente fallaba y el servicio entraba en bucle de activación. El installer ahora reescribe la unit para que apunte a `AppRun` en cada update — idempotente para instalaciones cuya unit ya es correcta, recuperando las que no lo son.
|
Parche puntual para [#222](https://github.com/MacRimi/ProxMenux/issues/222). Los usuarios que actualizaban desde una instalación v1.2.1.x estable a v1.2.2 se encontraban con un `proxmenux-monitor.service` que no arrancaba con `status=203/EXEC`. El layout de instalación de v1.2.2 extrae el AppImage en `/usr/local/share/proxmenux/monitor-app/` y ejecuta `AppRun` desde ese directorio — pero el path de update del installer reutilizaba la unit file existente y solo refrescaba la unit en instalación nueva, así que la unit heredada conservaba su `ExecStart=/usr/local/share/proxmenux/ProxMenux-Monitor.AppImage` antiguo. Ese path era un AppImage montado por FUSE, algo que v1.2.2 abandonó deliberadamente para eliminar un falso positivo de la regla 521 de Wazuh sobre `/tmp/.mount_*`; bajo PVE 9.x / Debian 13 ejecutar el AppImage directamente fallaba y el servicio entraba en bucle de activación. El installer ahora reescribe la unit para que apunte a `AppRun` en cada update — idempotente para instalaciones cuya unit ya es correcta, recuperando las que no lo son.
|
||||||
|
|
||||||
|
El lanzador `menu` se auto-repara además al arrancar: si detecta la huella exacta del bug (la unit con `ExecStart` apuntando al AppImage directo Y el `AppRun` extraído ya presente en disco) reescribe la unit y reinicia el servicio antes de mostrar el aviso de actualización, de modo que un usuario que descarte el update por reflejo termine con el Monitor funcionando.
|
||||||
|
|
||||||
Para recuperar una instalación v1.2.2 ya rota sin esperar al aviso de actualización, ejecuta el installer manualmente una vez: `bash -c "$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)"`.
|
Para recuperar una instalación v1.2.2 ya rota sin esperar al aviso de actualización, ejecuta el installer manualmente una vez: `bash -c "$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)"`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
65
menu
65
menu
@@ -46,6 +46,70 @@ is_beta() {
|
|||||||
[[ "$beta_flag" == "active" ]]
|
[[ "$beta_flag" == "active" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ── Recover broken Monitor unit before anything else ──────
|
||||||
|
#
|
||||||
|
# v1.2.2 changed the AppImage layout: the binary is extracted to
|
||||||
|
# /usr/local/share/proxmenux/monitor-app/ and the systemd unit
|
||||||
|
# executes AppRun out of that directory. The install_proxmenux.sh
|
||||||
|
# update path before v1.2.2.1 only rewrote the unit on fresh installs,
|
||||||
|
# so every user updating from v1.2.1 stable inherited the old unit
|
||||||
|
# whose ExecStart still pointed at the bare AppImage. On PVE 9.x /
|
||||||
|
# Debian 13 that bare AppImage hits status=203/EXEC immediately and
|
||||||
|
# the service enters the activating loop reported in #222.
|
||||||
|
#
|
||||||
|
# Re-running the new installer fixes it permanently, but the update
|
||||||
|
# prompt below uses --defaultno so a user pressing Enter by reflex
|
||||||
|
# stays broken. Patch the unit defensively at every menu launch: if
|
||||||
|
# the bug's exact fingerprint is present (unit ExecStart matches the
|
||||||
|
# bare AppImage path AND the extracted AppRun already exists) we
|
||||||
|
# silently rewrite the unit and bounce the service. The check is a
|
||||||
|
# no-op for healthy installs and for hosts that never installed the
|
||||||
|
# Monitor at all, so it's safe to run unconditionally.
|
||||||
|
auto_repair_monitor_unit() {
|
||||||
|
local unit_file="/etc/systemd/system/proxmenux-monitor.service"
|
||||||
|
local extracted_runtime="/usr/local/share/proxmenux/monitor-app"
|
||||||
|
local apprun="$extracted_runtime/AppRun"
|
||||||
|
local bare_appimage="/usr/local/share/proxmenux/ProxMenux-Monitor.AppImage"
|
||||||
|
|
||||||
|
[[ -f "$unit_file" && -x "$apprun" ]] || return 0
|
||||||
|
grep -q "^ExecStart=${bare_appimage}\$" "$unit_file" || return 0
|
||||||
|
|
||||||
|
local port working_dir
|
||||||
|
port=$(awk -F'"' '/^Environment="PORT=/ {print $2; exit}' "$unit_file" 2>/dev/null \
|
||||||
|
| sed 's/^PORT=//')
|
||||||
|
[[ -z "$port" ]] && port="8008"
|
||||||
|
working_dir=$(awk -F'=' '/^WorkingDirectory=/ {print $2; exit}' "$unit_file" 2>/dev/null)
|
||||||
|
[[ -z "$working_dir" ]] && working_dir="/usr/local/share/proxmenux"
|
||||||
|
|
||||||
|
cat > "$unit_file" <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=ProxMenux Monitor - Web Dashboard
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=$working_dir
|
||||||
|
ExecStart=$apprun
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
Environment="PORT=$port"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload >/dev/null 2>&1
|
||||||
|
systemctl restart proxmenux-monitor.service >/dev/null 2>&1
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
if systemctl is-active --quiet proxmenux-monitor.service 2>/dev/null; then
|
||||||
|
type msg_ok >/dev/null 2>&1 \
|
||||||
|
&& msg_ok "$(translate 'ProxMenux Monitor unit repaired and restarted')" \
|
||||||
|
|| echo "[ProxMenux] Monitor unit repaired and restarted"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ── Check for updates ──────────────────────────────────────
|
# ── Check for updates ──────────────────────────────────────
|
||||||
check_updates() {
|
check_updates() {
|
||||||
if is_beta; then
|
if is_beta; then
|
||||||
@@ -127,5 +191,6 @@ main_menu() {
|
|||||||
|
|
||||||
load_language
|
load_language
|
||||||
initialize_cache
|
initialize_cache
|
||||||
|
auto_repair_monitor_unit
|
||||||
check_updates
|
check_updates
|
||||||
main_menu
|
main_menu
|
||||||
|
|||||||
Reference in New Issue
Block a user