Rust-Node-Agent: Formparität mit Python-Agent herstellen (Logs/Temp/SSH-Key/Version/Backups/Netz/Jobs) #14

Closed
opened 2026-06-01 14:39:59 +00:00 by chinux · 0 comments
Owner

Sammel-Issue mit fertigem Claude-Code-Prompt, um den Rust-Node-Agent auf Formparität mit dem Python-Agent zu bringen. Verifizierte Fundstellen, Referenz ist durchgängig theprox_agent/.

Hintergrund: Der frühere „nur 6 Commands fehlen"-Diff war irreführend — er prüfte nur, ob ein Action-Name im Rust-Code vorkommt. Die tatsächlichen Defekte liegen überwiegend an fehlenden Datenfeldern und Frame-/JSON-Form-Mismatches. Verwandt: #2 (Konsolidierung).

Direkt umsetzbar ohne laufenden Node: Der Python-Agent-Quellcode (Node-Agent/theprox_agent/) ist die maßgebliche Referenz für jede Frame-/JSON-Form. cc kann ihn lesen — ein echter Node ist NICHT nötig. Verifikation = Python-Quelle treffen + cargo build + cargo clippy.


Prompt für Claude Code

Du arbeitest im Repo theProx. Es gibt zwei parallele Node-Agent-Implementierungen:
- Python (Node-Agent/theprox_agent/) — VOLLSTÄNDIG, funktionierend = REFERENZ / Source of Truth
- Rust (Node-Agent/src/) — kanonisch geplant, aber nicht an Parität

Mehrere Features sind auf Rust-Nodes kaputt, weil Handler fehlen ODER eine
andere JSON-Form/Frame-Typen liefern als der Python-Agent. Das Backend
(server/routers/, server/websocket/) erwartet exakt die Python-Form.

ZIEL: Rust-Agent so anpassen, dass er fuer die unten genannten Punkte
byte-genau dieselben Frame-Typen (type-Strings), Feldnamen und JSON-
Verschachtelung liefert wie der Python-Agent. Form-Paritaet ist das
Kriterium, nicht "ungefaehr".

DU BRAUCHST KEINEN LAUFENDEN NODE. Leite die erwartete Form direkt aus dem
Python-Quellcode ab (massgeblich) und gegen den Backend-Konsumenten in
server/. Verifikation pro Punkt: Python-Form getroffen + `cd Node-Agent &&
cargo build` + `cargo clippy` sauber.

ARBEITSWEISE pro Punkt:
1. Python-Referenz lesen: welcher type / welche Felder werden gesendet.
2. Backend-Konsument lesen (server/...): welche Form wird erwartet/geparst.
3. Rust-Handler implementieren/fixen, sodass er die Python-Form trifft.
4. cargo build + cargo clippy gruen. Bestehende Handler NICHT brechen.
5. Definition of Done abhaken (siehe pro Punkt).

Rust-Architektur: commands.rs (sync match), commands_async.rs (async, hat
State), dispatcher.rs (Streaming + Routing), data.rs (collect/Telemetrie),
proxmox.rs/qm.rs/pct.rs (pvesh-Wrapper), log_tail.rs, term.rs.

────────────────────────────────────────────────────────────
DIE PROBLEME (verifizierte Fundstellen, mit Definition of Done):

1. LOG-LIVE-TAIL zeigt nichts (Frame-Typ-Mismatch) — EINFACH, ZUERST
   - Rust sendet type "node_log_tail" (Node-Agent/src/log_tail.rs ~Z.56, var
     frame_type ~Z.89).
   - Python sendet type "node_logs" (theprox_agent/_agent_logs.py:201).
   - Backend/Frontend hoert auf "node_logs".
   DoD: Rust sendet type "node_logs"; Entry-Felder (unit, message, timestamp
   o.ae.) stimmen mit _agent_logs.py:_parse_syslog_line ueberein.

2. PROXMOX-VERSION leer (Form-Mismatch) — EINFACH, ZUERST
   - Rust sammelt node_version (data.rs:90) als rohes pvesh-Objekt von
     /nodes/X/version.
   - Pruefen, in welcher Form der Python-Agent node_version liefert und was
     das Backend daraus liest; Rust-Form angleichen.
   DoD: node_version hat denselben Key/Shape wie beim Python-Agent.

3. TEMPERATUR fehlt im node_status — MITTEL
   - Rust get_node_status (proxmox.rs:77) gibt nur rohes /nodes/X/status.
   - Python reichert temperature_sensors + cpu_temperature via `sensors` an
     (theprox_agent/proxmox_api.py:180-191, Sammelfn _collect_temperature_sensors
     ab :279).
   DoD: node_status enthaelt temperature_sensors + cpu_temperature in
   identischer Struktur/Feldnamen wie Python.

4. qm.ssh.inject_key FEHLT komplett — MITTEL
   - Python: Handler _agent_commands.py:410 + Logik _agent_ssh_keys.py
     (Node-Agent-Pubkey via qemu-guest-agent file-write in die VM injizieren).
   - Backend ruft es beim Terminal-Open mit ssh_key (server/routers/deploy_router.py).
   DoD: Rust-Handler vorhanden (qm.rs/commands.rs); Antwortform
   {status:"ok"|"error", ...} wie Python; Terminal-Open mit SSH-Key
   liefert nicht mehr "not implemented".

5. BACKUPS werden nicht angezeigt (Form-Mismatch) — MITTEL
   - Backend ruft backup.list_all (server/routers/backup_router.py:60),
     backup.tasks (:99), backup.list_jobs (:225).
   - Rust hat backup.list_all, liefert aber andere Form. Mit den Python-
     Pendants (proxmox_api.py / _agent_*) abgleichen.
   DoD: backup.list_all/-tasks/-list_jobs liefern dieselbe Listen-/Feldform
   wie Python; Backups-Tab zeigt Eintraege.

6. NETZWERK BEARBEITEN (Handler da, Verhalten/Form falsch) — MITTEL
   - Rust hat net.set_interface / net.apply / net.interfaces_live, verhaelt
     sich aber anders als Python.
   - Python-Netz-Handler vergleichen; Parameter-Parsing, pvesh-Pfade,
     Antwortform angleichen.
   DoD: Interface setzen + apply funktioniert; Antwortform = Python.

7. JOBS lassen sich nicht ausfuehren (Form/Verhalten) — MITTEL
   - Ausfuehrung via host.exec / agent.run_script (existieren in Rust).
   - Python-Verhalten + Ergebnis-/Streaming-Form vergleichen; pruefen, wie
     das Backend (schedule_router / services) das Ergebnis liest, und angleichen.
   DoD: Job-Run liefert dieselbe Ergebnisform wie Python; Job laeuft durch.

────────────────────────────────────────────────────────────
WICHTIG:
- Branch fix/rust-agent-parity-features von main anlegen.
- Reihenfolge: 1 + 2 zuerst (schnelle Wins, cargo build frueh gruen),
  dann 3 + 4, dann 5/6/7.
- Es existieren bereits Branches mit verwandten Fixes — NICHT duplizieren,
  ggf. als Basis nutzen / einbeziehen:
    feat/rust-agent-parity   -> 6 fehlende Commands (vm.config.set, storage.delete,
                                backup.create_job/update_job, node.refresh, rdp.get_vm_ip)
    fix/ct-terminal          -> ct.terminal.open + open_ct (pct enter)
    fix/update-count-refresh -> apt-Index-Refresh vor Update-Zaehlung
- Erwartete Form IMMER aus dem Python-Quellcode ableiten (massgeblich),
  nicht raten. Kein laufender Node noetig.
- Am Ende: pro Punkt 1-2 Zeilen dokumentieren, was geaendert wurde;
  cargo build + clippy gruen.

Akzeptanzkriterien (gesamt)

  • Live-Log zeigt Zeilen; Temperatur und Proxmox-Version erscheinen wieder; Terminal mit SSH-Key öffnet; Backups-Liste, Netzwerk-Bearbeiten und Jobs funktionieren.
  • cd Node-Agent && cargo build + cargo clippy ohne Fehler.
  • Keine Regression bei bestehenden Handlern.
Sammel-Issue mit fertigem Claude-Code-Prompt, um den Rust-Node-Agent auf Formparität mit dem Python-Agent zu bringen. Verifizierte Fundstellen, Referenz ist durchgängig `theprox_agent/`. > **Hintergrund:** Der frühere „nur 6 Commands fehlen"-Diff war irreführend — er prüfte nur, ob ein Action-*Name* im Rust-Code vorkommt. Die tatsächlichen Defekte liegen überwiegend an fehlenden Datenfeldern und Frame-/JSON-Form-Mismatches. Verwandt: #2 (Konsolidierung). > **Direkt umsetzbar ohne laufenden Node:** Der Python-Agent-Quellcode (`Node-Agent/theprox_agent/`) ist die maßgebliche Referenz für jede Frame-/JSON-Form. cc kann ihn lesen — ein echter Node ist NICHT nötig. Verifikation = Python-Quelle treffen + `cargo build` + `cargo clippy`. --- ## Prompt für Claude Code ``` Du arbeitest im Repo theProx. Es gibt zwei parallele Node-Agent-Implementierungen: - Python (Node-Agent/theprox_agent/) — VOLLSTÄNDIG, funktionierend = REFERENZ / Source of Truth - Rust (Node-Agent/src/) — kanonisch geplant, aber nicht an Parität Mehrere Features sind auf Rust-Nodes kaputt, weil Handler fehlen ODER eine andere JSON-Form/Frame-Typen liefern als der Python-Agent. Das Backend (server/routers/, server/websocket/) erwartet exakt die Python-Form. ZIEL: Rust-Agent so anpassen, dass er fuer die unten genannten Punkte byte-genau dieselben Frame-Typen (type-Strings), Feldnamen und JSON- Verschachtelung liefert wie der Python-Agent. Form-Paritaet ist das Kriterium, nicht "ungefaehr". DU BRAUCHST KEINEN LAUFENDEN NODE. Leite die erwartete Form direkt aus dem Python-Quellcode ab (massgeblich) und gegen den Backend-Konsumenten in server/. Verifikation pro Punkt: Python-Form getroffen + `cd Node-Agent && cargo build` + `cargo clippy` sauber. ARBEITSWEISE pro Punkt: 1. Python-Referenz lesen: welcher type / welche Felder werden gesendet. 2. Backend-Konsument lesen (server/...): welche Form wird erwartet/geparst. 3. Rust-Handler implementieren/fixen, sodass er die Python-Form trifft. 4. cargo build + cargo clippy gruen. Bestehende Handler NICHT brechen. 5. Definition of Done abhaken (siehe pro Punkt). Rust-Architektur: commands.rs (sync match), commands_async.rs (async, hat State), dispatcher.rs (Streaming + Routing), data.rs (collect/Telemetrie), proxmox.rs/qm.rs/pct.rs (pvesh-Wrapper), log_tail.rs, term.rs. ──────────────────────────────────────────────────────────── DIE PROBLEME (verifizierte Fundstellen, mit Definition of Done): 1. LOG-LIVE-TAIL zeigt nichts (Frame-Typ-Mismatch) — EINFACH, ZUERST - Rust sendet type "node_log_tail" (Node-Agent/src/log_tail.rs ~Z.56, var frame_type ~Z.89). - Python sendet type "node_logs" (theprox_agent/_agent_logs.py:201). - Backend/Frontend hoert auf "node_logs". DoD: Rust sendet type "node_logs"; Entry-Felder (unit, message, timestamp o.ae.) stimmen mit _agent_logs.py:_parse_syslog_line ueberein. 2. PROXMOX-VERSION leer (Form-Mismatch) — EINFACH, ZUERST - Rust sammelt node_version (data.rs:90) als rohes pvesh-Objekt von /nodes/X/version. - Pruefen, in welcher Form der Python-Agent node_version liefert und was das Backend daraus liest; Rust-Form angleichen. DoD: node_version hat denselben Key/Shape wie beim Python-Agent. 3. TEMPERATUR fehlt im node_status — MITTEL - Rust get_node_status (proxmox.rs:77) gibt nur rohes /nodes/X/status. - Python reichert temperature_sensors + cpu_temperature via `sensors` an (theprox_agent/proxmox_api.py:180-191, Sammelfn _collect_temperature_sensors ab :279). DoD: node_status enthaelt temperature_sensors + cpu_temperature in identischer Struktur/Feldnamen wie Python. 4. qm.ssh.inject_key FEHLT komplett — MITTEL - Python: Handler _agent_commands.py:410 + Logik _agent_ssh_keys.py (Node-Agent-Pubkey via qemu-guest-agent file-write in die VM injizieren). - Backend ruft es beim Terminal-Open mit ssh_key (server/routers/deploy_router.py). DoD: Rust-Handler vorhanden (qm.rs/commands.rs); Antwortform {status:"ok"|"error", ...} wie Python; Terminal-Open mit SSH-Key liefert nicht mehr "not implemented". 5. BACKUPS werden nicht angezeigt (Form-Mismatch) — MITTEL - Backend ruft backup.list_all (server/routers/backup_router.py:60), backup.tasks (:99), backup.list_jobs (:225). - Rust hat backup.list_all, liefert aber andere Form. Mit den Python- Pendants (proxmox_api.py / _agent_*) abgleichen. DoD: backup.list_all/-tasks/-list_jobs liefern dieselbe Listen-/Feldform wie Python; Backups-Tab zeigt Eintraege. 6. NETZWERK BEARBEITEN (Handler da, Verhalten/Form falsch) — MITTEL - Rust hat net.set_interface / net.apply / net.interfaces_live, verhaelt sich aber anders als Python. - Python-Netz-Handler vergleichen; Parameter-Parsing, pvesh-Pfade, Antwortform angleichen. DoD: Interface setzen + apply funktioniert; Antwortform = Python. 7. JOBS lassen sich nicht ausfuehren (Form/Verhalten) — MITTEL - Ausfuehrung via host.exec / agent.run_script (existieren in Rust). - Python-Verhalten + Ergebnis-/Streaming-Form vergleichen; pruefen, wie das Backend (schedule_router / services) das Ergebnis liest, und angleichen. DoD: Job-Run liefert dieselbe Ergebnisform wie Python; Job laeuft durch. ──────────────────────────────────────────────────────────── WICHTIG: - Branch fix/rust-agent-parity-features von main anlegen. - Reihenfolge: 1 + 2 zuerst (schnelle Wins, cargo build frueh gruen), dann 3 + 4, dann 5/6/7. - Es existieren bereits Branches mit verwandten Fixes — NICHT duplizieren, ggf. als Basis nutzen / einbeziehen: feat/rust-agent-parity -> 6 fehlende Commands (vm.config.set, storage.delete, backup.create_job/update_job, node.refresh, rdp.get_vm_ip) fix/ct-terminal -> ct.terminal.open + open_ct (pct enter) fix/update-count-refresh -> apt-Index-Refresh vor Update-Zaehlung - Erwartete Form IMMER aus dem Python-Quellcode ableiten (massgeblich), nicht raten. Kein laufender Node noetig. - Am Ende: pro Punkt 1-2 Zeilen dokumentieren, was geaendert wurde; cargo build + clippy gruen. ``` --- ## Akzeptanzkriterien (gesamt) - Live-Log zeigt Zeilen; Temperatur und Proxmox-Version erscheinen wieder; Terminal mit SSH-Key öffnet; Backups-Liste, Netzwerk-Bearbeiten und Jobs funktionieren. - `cd Node-Agent && cargo build` + `cargo clippy` ohne Fehler. - Keine Regression bei bestehenden Handlern.
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#14
No description provided.