# Firmware-Management & Update-Prozess Multi-Plattform Firmware-Verwaltung fuer Agent-Binaries und OPNsense-Updates. Die Firmware-Seite im Frontend hat **zwei unabhaengige Bereiche**: | Bereich | Zweck | Format | |---------|-------|--------| | **Agent-Binary** | OTA-Updates auf bestehenden Agents | Raw Binary (kein ZIP) | | **Installer-Paket** | Erstinstallation auf neuen Geraeten | ZIP (Agent + Updater + install.sh) | --- ## 1. Installer-Paket (Erstinstallation) ### Inhalt des ZIP Das Installer-ZIP enthaelt beide Binaries + Installationsskript: ``` rmm-freebsd-1.0.3.zip ├── rmm-agent ← Agent-Binary (FreeBSD) ├── rmm-updater-freebsd ← Updater-Binary (FreeBSD) └── install.sh ← Installationsskript ``` ### ZIP bauen ```bash # Auf dem Build-Server (Linux mit Go 1.24+) cd /opt/rmm make release VERSION=1.0.3 # → build/release/rmm-freebsd-1.0.3.zip # → build/release/rmm-linux-1.0.3.zip ``` ### ZIP im Frontend hochladen **Frontend → Firmware → Installer-Pakete → Plattform waehlen → ZIP hochladen** Oder per API: ```bash curl -sk -X POST "https://your-backend:8443/api/v1/installer/upload?platform=freebsd" \ -H "X-API-Key: YOUR_API_KEY" \ -F "file=@build/release/rmm-freebsd-1.0.3.zip" ``` ### Erstinstallation auf neuem Geraet (OPNsense) Nach dem Upload zeigt das Frontend den fertigen Installationsbefehl mit Copy-Button. Auf der OPNsense-Firewall (SSH als root): ```bash fetch --no-verify-peer --no-verify-hostname \ -o /tmp/installer.zip \ "https://BACKEND_IP:8443/api/v1/installer/download?platform=freebsd&api_key=DEIN_API_KEY" \ && cd /tmp && unzip -o installer.zip && sh /tmp/install.sh ``` ### API-Endpoints (Installer) | Methode | Endpoint | Beschreibung | |---------|----------|-------------| | GET | `/api/v1/installer` | Hochgeladene Installer-Pakete anzeigen | | POST | `/api/v1/installer/upload?platform=X` | ZIP hochladen | | GET | `/api/v1/installer/download?platform=X&api_key=Y` | ZIP herunterladen (fuer Firewall) | --- ## 2. Agent-Binary (OTA-Updates bestehender Agents) ### Ueberblick Fuer Updates auf bereits installierten Agents — der `rmm-updater` Daemon holt das neue Binary selbststaendig vom Backend. Ablauf: 1. Neue Agent-Binary im Frontend hochladen (nur das Binary, kein ZIP) 2. Update-Flag bei einzelnem Agent oder "Alle updaten" setzen 3. Updater auf der Firewall erkennt den Flag (pollt alle 60s) 4. Binary wird vom Backend heruntergeladen und SHA256-verifiziert 5. Agent wird gestoppt, Binary ersetzt, Agent gestartet 6. Flag wird automatisch zurueckgesetzt ### Binary im Frontend hochladen **Frontend → Firmware → Agent-Binary → Version + Plattform → Binary hochladen** Oder per API: ```bash # FreeBSD Agent-Binary hochladen curl -sk -X POST "https://your-backend:8443/api/v1/firmware/upload?version=1.0.3&platform=freebsd" \ -H "X-API-Key: YOUR_API_KEY" \ --data-binary @build/rmm-agent # Linux Agent-Binary hochladen curl -sk -X POST "https://your-backend:8443/api/v1/firmware/upload?version=1.0.3&platform=linux" \ -H "X-API-Key: YOUR_API_KEY" \ --data-binary @build/rmm-agent-linux ``` ### Update ausloesen ```bash # Einzelnen Agent updaten curl -sk -X POST "https://your-backend:8443/api/v1/agents/AGENT_ID/request-update" \ -H "X-API-Key: YOUR_API_KEY" # Alle Agents updaten curl -sk -X POST "https://your-backend:8443/api/v1/agents/request-update-all" \ -H "X-API-Key: YOUR_API_KEY" ``` ### API-Endpoints (Agent-Binary) | Methode | Endpoint | Beschreibung | |---------|----------|-------------| | GET | `/api/v1/firmware` | Alle hochgeladenen Binaries | | GET | `/api/v1/firmware?platform=freebsd` | Binaries einer Plattform | | POST | `/api/v1/firmware/upload?version=X&platform=Y` | Binary hochladen (Raw) | | GET | `/api/v1/firmware/download?platform=Y` | Binary herunterladen (Updater intern) | | POST | `/api/v1/agents/{id}/request-update` | Update-Flag setzen | | DELETE | `/api/v1/agents/{id}/request-update` | Update-Flag zuruecksetzen | | POST | `/api/v1/agents/request-update-all` | Alle Agents updaten | ### Unterstuetzte Plattformen | Plattform | Binary | Ziel | |-----------|--------|------| | `freebsd` | `rmm-agent` | OPNsense Firewalls (amd64) | | `linux` | `rmm-agent-linux` | Linux/Proxmox Agents | ### Updater — Technische Details - Separates Go-Binary (`rmm-updater-freebsd`), laeuft als `rmm_updater` rc.d Service - Liest dieselbe `config.yaml` wie der Agent (Backend-URL, API-Key) - Prueft alle 60s ob `update_requested = true` fuer den eigenen Agent - Download ueber `GET /api/v1/firmware/download?platform=freebsd` - SHA256-Verifizierung vor Ersetzung - Automatisches Rollback bei fehlgeschlagenem Agent-Start - Backup der alten Binary als `.bak` waehrend des Updates - Logs: `/var/log/rmm-updater.log` ## OPNsense-Updates (Core + Packages) ### Normales Update Patches innerhalb der gleichen Version: 1. `opnsense-update` — Core-Update herunterladen 2. `pkg upgrade -y` — Paket-Updates installieren 3. Nachpruefung: `opnsense-update -c` — Exit 1 = Reboot noetig Response enthaelt `reboot_required: true/false` fuer das Frontend. ### Major-Upgrade z.B. 25.7 → 26.1: 1. `opnsense-update -r -bkp` — Repository wechseln + Base + Kernel + Packages herunterladen 2. `pkg-static update -f` — Repository-Katalog forciert aktualisieren 3. `pkg-static upgrade -y` — Alle Pakete auf neue Version installieren 4. **Reboot erforderlich** (immer bei Major-Upgrade) ### API-Endpoints | Methode | Endpoint | Beschreibung | |---------|----------|-------------| | POST | `/api/v1/agents/{id}/update-check` | Verfuegbare Updates pruefen | | POST | `/api/v1/agents/{id}/update` | Normales Update (Core + Packages) | | POST | `/api/v1/agents/{id}/major-update` | Major-Upgrade auf Zielversion | | POST | `/api/v1/agents/{id}/reboot` | Reboot ausfuehren | ### Beispiele ```bash # Verfuegbare Updates pruefen curl -sk -H "X-API-Key: YOUR_API_KEY" -X POST \ https://your-backend:8443/api/v1/agents/e92e87a684b20db15d8d2344583c5887/update-check # Normales Update mit Reboot curl -sk -H "X-API-Key: YOUR_API_KEY" -X POST \ https://your-backend:8443/api/v1/agents/e92e87a684b20db15d8d2344583c5887/update \ -d '{"reboot":true}' # Major-Upgrade auf Version 26.7 curl -sk -H "X-API-Key: YOUR_API_KEY" -X POST \ https://your-backend:8443/api/v1/agents/e92e87a684b20db15d8d2344583c5887/major-update \ -d '{"version":"26.7","reboot":true}' # Reboot (5s Verzoegerung default) curl -sk -H "X-API-Key: YOUR_API_KEY" -X POST \ https://your-backend:8443/api/v1/agents/e92e87a684b20db15d8d2344583c5887/reboot ```