Bulk-VM-Agent-Update tut nichts: latest_version-Pfad falsch (→ (any)) + optimistischer Erfolg ohne Verifikation #28

Closed
opened 2026-06-01 21:11:37 +00:00 by chinux · 0 comments
Owner

Symptom

Bulk-„VM-Agent-Update" meldet für alle VMs „Update gesendet (kein Versions-Check)", Ziel-Version „(any)" — es wird aber faktisch nichts aktualisiert.

Root Cause (zwei zusammenwirkende Defekte)

A) Pfad-Mismatch → latest_version leer → „(any)"

server/routers/deploy_router.py:988 _read_vm_agent_latest_version():

cargo = pathlib.Path(__file__).parent.parent.parent / "VM-Guest-Agent" / "Cargo.toml"

__file__ = server/routers/deploy_router.py.parent.parent.parent = Repo-Root/VM-Guest-Agent.

Der Binary-Endpoint server/main.py:345 vm_agent_binary_for_os serviert dagegen aus:

root = pathlib.Path(__file__).parent          # server/
agent_dir = root / "VM-Guest-Agent"           # server/VM-Guest-Agent/

→ zwei verschiedene Verzeichnisse. Im Deployment (nur server/ ausgeliefert) existiert der Repo-Root-Pfad nicht → read_text wirft → Funktion liefert ""latest_version leer → „(any)". (In der Dev-Checkout-Umgebung liest sie zufällig, deshalb fällt's nur in Prod auf.)

B) Leere latest_version → optimistischer „Erfolg" ohne Verifikation

Node-Agent/src/vm_self_update.rs update_one:

} else if latest_version.is_empty() {
    // No version target given — best effort, optimistically accept.
    say(out, cmd_id, format!("VM {vmid}: Update gesendet (kein Versions-Check)"));
    tcp_ok = true;     // ← zählt sofort als OK
}

Es wird fire-and-forget gesendet und sofort als „aktualisiert" gezählt — kein wait_for_reconnect, kein QEMU-Fallback. Scheitert das Self-Update im Gast (Binary-404, Download-Fehler, …), bleibt es unbemerkt.

Fix

1. Version zuverlässig auflösen (Backend)

_read_vm_agent_latest_version() aus derselben Quelle lesen, aus der das Binary serviert wird (Path(__file__).parent.parent / "VM-Guest-Agent" = server/), und sicherstellen, dass das Packaging die Version dort mitliefert (Cargo.toml oder eine VERSION-Datei neben dem Binary). Wenn nicht auffindbar: definierter Fallback (Konstante/ENV) statt stillem "". Ziel: latest_version ist im Normalbetrieb nie leer.

2. Empty-Version-Zweig nicht blind als Erfolg werten (Agent)

Mit (1) läuft ohnehin der wait_for_reconnect-Pfad (verifiziert). Zusätzlich den latest_version.is_empty()-Zweig härten:

  • Nicht tcp_ok = true setzen. Stattdessen: auf Reconnect des Agents warten (Drop→Reconnect = Erfolg, auch ohne fixe Zielversion) oder in den QEMU-Fallback fallen, der real installiert.
  • Ergebnis als eigenes Outcome „gesendet, unbestätigt" führen, nicht als „aktualisiert".

3. Reporting

In der Zusammenfassung „aktualisiert" (verifiziert) vs. „gesendet, unbestätigt" unterscheiden, damit das UI keinen Erfolg meldet, wenn nichts passiert ist.

Akzeptanz

  • Bulk-Update zeigt eine echte Ziel-Version (nicht „(any)") und pro VM ein verifiziertes Ergebnis (Reconnect mit neuer Version bzw. Fallback-Resultat).
  • VMs, deren Update scheitert, erscheinen als Fehler — nicht als „gesendet/ok".
  • cargo build/clippy grün — Agent-Build vor Merge.

Branch

fix/vm-agent-bulk-update-version

## Symptom Bulk-„VM-Agent-Update" meldet für alle VMs „Update gesendet (kein Versions-Check)", Ziel-Version „(any)" — es wird aber faktisch nichts aktualisiert. ## Root Cause (zwei zusammenwirkende Defekte) ### A) Pfad-Mismatch → `latest_version` leer → „(any)" `server/routers/deploy_router.py:988` `_read_vm_agent_latest_version()`: ```python cargo = pathlib.Path(__file__).parent.parent.parent / "VM-Guest-Agent" / "Cargo.toml" ``` `__file__` = `server/routers/deploy_router.py` → `.parent.parent.parent` = **Repo-Root**/VM-Guest-Agent. Der Binary-Endpoint `server/main.py:345` `vm_agent_binary_for_os` serviert dagegen aus: ```python root = pathlib.Path(__file__).parent # server/ agent_dir = root / "VM-Guest-Agent" # server/VM-Guest-Agent/ ``` → zwei **verschiedene** Verzeichnisse. Im Deployment (nur `server/` ausgeliefert) existiert der Repo-Root-Pfad nicht → `read_text` wirft → Funktion liefert `""` → `latest_version` leer → „(any)". (In der Dev-Checkout-Umgebung liest sie zufällig, deshalb fällt's nur in Prod auf.) ### B) Leere `latest_version` → optimistischer „Erfolg" ohne Verifikation `Node-Agent/src/vm_self_update.rs` `update_one`: ```rust } else if latest_version.is_empty() { // No version target given — best effort, optimistically accept. say(out, cmd_id, format!("VM {vmid}: Update gesendet (kein Versions-Check)")); tcp_ok = true; // ← zählt sofort als OK } ``` Es wird fire-and-forget gesendet und **sofort als „aktualisiert" gezählt** — kein `wait_for_reconnect`, kein QEMU-Fallback. Scheitert das Self-Update im Gast (Binary-404, Download-Fehler, …), bleibt es unbemerkt. ## Fix ### 1. Version zuverlässig auflösen (Backend) `_read_vm_agent_latest_version()` aus **derselben** Quelle lesen, aus der das Binary serviert wird (`Path(__file__).parent.parent / "VM-Guest-Agent"` = `server/`), und sicherstellen, dass das Packaging die Version dort mitliefert (Cargo.toml **oder** eine `VERSION`-Datei neben dem Binary). Wenn nicht auffindbar: definierter Fallback (Konstante/ENV) statt stillem `""`. Ziel: `latest_version` ist im Normalbetrieb nie leer. ### 2. Empty-Version-Zweig nicht blind als Erfolg werten (Agent) Mit (1) läuft ohnehin der `wait_for_reconnect`-Pfad (verifiziert). Zusätzlich den `latest_version.is_empty()`-Zweig härten: - **Nicht** `tcp_ok = true` setzen. Stattdessen: auf Reconnect des Agents warten (Drop→Reconnect = Erfolg, auch ohne fixe Zielversion) **oder** in den QEMU-Fallback fallen, der real installiert. - Ergebnis als eigenes Outcome „gesendet, unbestätigt" führen, nicht als „aktualisiert". ### 3. Reporting In der Zusammenfassung „aktualisiert" (verifiziert) vs. „gesendet, unbestätigt" unterscheiden, damit das UI keinen Erfolg meldet, wenn nichts passiert ist. ## Akzeptanz - Bulk-Update zeigt eine echte Ziel-Version (nicht „(any)") und pro VM ein **verifiziertes** Ergebnis (Reconnect mit neuer Version bzw. Fallback-Resultat). - VMs, deren Update scheitert, erscheinen als Fehler — nicht als „gesendet/ok". - `cargo build`/`clippy` grün — Agent-Build vor Merge. ## Branch `fix/vm-agent-bulk-update-version`
chinux changed title from Keine Agent Updates auf alle VM's to Bulk-VM-Agent-Update tut nichts: latest_version-Pfad falsch (→ (any)) + optimistischer Erfolg ohne Verifikation 2026-06-01 21:31:26 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#28
No description provided.