# Agent — Installation & Konfiguration

Der RMM-Agent laeuft auf OPNsense (FreeBSD) und wird als OPNsense-Plugin mit WebGUI-Konfiguration installiert.

## Komponenten

- **Collectors**: Hardware, CPU, Memory, Disk, Network, Services, WireGuard, DHCP, Routing, Gateways, Zertifikate, Plugins, Updates, Cron
- **WebSocket Client**: Persistente Verbindung zum Backend, automatisches Reconnect mit Backoff
- **Command Handler**: Remote-Befehlsausfuehrung, Tunnel-Connect/Disconnect
- **Tunnel Manager**: Session-basierte TCP-Verbindungen zu lokalen Diensten

## 1. Agent bauen

```bash
make agent    # Erzeugt build/rmm-agent (freebsd/amd64)
```

## 2. Plugin installieren

```bash
# Binary + Installer auf die Firewall kopieren
scp build/rmm-agent root@OPNSENSE:/tmp/
scp opnsense-plugin/install.sh root@OPNSENSE:/tmp/

# Installer ausfuehren
ssh root@OPNSENSE '/bin/sh /tmp/install.sh'
```

Der Installer richtet alles ein:
- Binary nach `/usr/local/rmm/rmm-agent`
- rc.d Service (`/usr/local/etc/rc.d/rmm_agent`)
- OPNsense MVC Plugin (Model, Controller, View)
- configd Actions (start/stop/restart/status/reconfigure)
- Plugin-Hook fuer Service-Integration
- Setup-Script das Config aus dem Model generiert

## 3. WebGUI konfigurieren

1. OPNsense WebGUI oeffnen
2. **Services > RMM Agent**
3. Felder ausfuellen:
   - **Aktiviert**: Ankreuzen
   - **Backend URL**: `https://BACKEND_IP:8443`
   - **API Key**: Backend API-Key eintragen
   - **Agent Name**: Optional (Standard: Hostname)
   - **Heartbeat Intervall**: 60 (Sekunden)
   - **Self-Signed Zertifikate**: Ankreuzen bei self-signed Backend-Certs
4. **Speichern & Anwenden** klicken

Der Agent startet automatisch und meldet sich am Backend an.

### OPNsense Plugin WebGUI Fix (v1.0.3)

Der `SettingsController` wurde gefixt:
- **Config-Parsing**: Korrektes Parsen von `rmmagent[general][KEY]` Formular-Feldern (OPNsense MVC-Konvention)
- **Initialer config.xml Eintrag**: Beim ersten Speichern wird automatisch der `<rmmagent>` Knoten in der `config.xml` angelegt

## 4. Verifizieren

```bash
# Status in der WebGUI: Badge zeigt "Running"

# Oder per SSH:
ssh root@OPNSENSE 'service rmm_agent status'

# Auf dem Backend: Agent sollte erscheinen
curl -sk -H "X-API-Key: DEIN_API_KEY" https://BACKEND_IP:8443/api/v1/agents
```

## Pre-Registration

Firewalls koennen vorab im System registriert werden, bevor der Agent installiert wird:

1. Im Frontend auf "Firewall hinzufuegen" klicken (oder `POST /api/v1/agents`)
2. Name und optionalen Kunden angeben
3. Agent wird mit `hostname="(ausstehend)"` angelegt
4. Bei der eigentlichen Agent-Registration wird automatisch nach Name gematcht (`GetAgentByName`)
5. Der pre-registrierte Eintrag wird mit den echten Agent-Daten aktualisiert

## Agent-Update (via Updater — empfohlen)

Der **rmm-updater** ist ein separater Daemon, der auf jeder Firewall neben dem Agent laeuft.
Er prueft alle 60 Sekunden ob ein Update ansteht und fuehrt es automatisch durch.

**Flow:**
1. Neue Agent-Binary im Frontend hochladen (Firmware-Seite)
2. Update-Button bei einzelnem Agent oder "Alle updaten" klicken
3. Updater erkennt den Flag, laedt die Binary vom Backend, stoppt Agent, ersetzt Binary, startet Agent
4. Flag wird automatisch zurueckgesetzt

**Technische Details:**
- Separates Go-Binary (`rmm-updater`), laeuft als `rmm_updater` rc.d Service
- Liest die gleiche `config.yaml` wie der Agent (Backend-URL, API-Key)
- 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`

**Manuelles Update (Fallback):**

```bash
make agent
scp build/rmm-agent root@OPNSENSE:/tmp/
ssh root@OPNSENSE '/bin/sh -c "service rmm_agent stop; cp /tmp/rmm-agent /usr/local/rmm/rmm-agent; chmod +x /usr/local/rmm/rmm-agent; service rmm_agent start"'
```

Oder Plugin komplett neu installieren (`install.sh` ist idempotent — installiert Agent + Updater).

## Service-Filter (v1.0.3)

Boot- und Init-Scripts werden nicht mehr in der Dienste-Liste angezeigt:
- **Gefiltert**: `bgfsck`, `cleanvar`, `dmesg`, `hostid`, `ldconfig`, `motd`, `newsyslog`, `ntpd`, `resolv`, `syslogd`, `var` und andere System-Boot-Scripts
- **Angezeigt**: Nur echte OPNsense-Dienste (OpenVPN, Unbound, DHCPd, WireGuard, etc.)
- `pluginctl` wird mit vollem Pfad `/usr/local/sbin/pluginctl` aufgerufen (FreeBSD-Kompatibilitaet)

## Hinweise

- **Agent-ID** wird persistent in `/usr/local/rmm/agent_id` gespeichert — ueberlebt Neuinstallationen
- **Config** wird bei "Speichern & Anwenden" aus dem OPNsense-Model nach `/usr/local/rmm/config.yaml` generiert
- **Logs**: `/var/log/rmm-agent.log`
- **PID-File**: `/var/run/rmm_agent.pid`
- Agent braucht **root** auf OPNsense (fuer Hardware-/Service-Daten)
- OPNsense WebGUI typischerweise auf **Port 4444** (nicht 443)
