# RMM System — OPNsense & Linux/Proxmox

Remote Monitoring & Management fuer OPNsense Firewalls und Linux-Server (Proxmox, Debian, Ubuntu).
Go-basierter Agent + Backend mit WebSocket-Kommunikation, Session-basierten TCP-Tunneln und integriertem Web Terminal.

## Screenshots

| | |
|--|--|
| ![Firewalls](screenshots/01_firewalls_uebersicht.jpg) | ![Detail System](screenshots/02_firewall_detail_system.jpg) |
| Firewall-Übersicht | System-Metriken |
| ![Netzwerk Interfaces](screenshots/03_firewall_netzwerk_interfaces.jpg) | ![HAProxy](screenshots/04_firewall_netzwerk_haproxy.jpg) |
| Netzwerk / Interfaces | Netzwerk / HAProxy |
| ![Backups](screenshots/05_firewall_daten_backups.jpg) | ![Aufgaben](screenshots/06_firewall_daten_aufgaben.jpg) |
| Daten / Backups | Daten / Aufgaben |
| ![Tunnel](screenshots/07_firewall_daten_tunnel.jpg) | ![Updates](screenshots/08_firewall_system_updates.jpg) |
| Daten / Tunnel | System / Updates |
| ![Agent](screenshots/09_firewall_system_agent.jpg) | ![Login](screenshots/10_login.jpg) |
| System / Agent | Login |
| ![Dashboard](screenshots/11_dashboard.jpg) | ![Übersicht Detail](screenshots/12_firewall_uebersicht_detail.jpg) |
| Dashboard | Übersicht / Detail |
| ![Interfaces Detail](screenshots/13_netzwerk_interfaces_detail.jpg) | ![WireGuard](screenshots/14_netzwerk_wireguard.jpg) |
| Netzwerk / Interfaces | Netzwerk / WireGuard |
| ![Routen](screenshots/15_netzwerk_routen.jpg) | ![DHCP](screenshots/16_netzwerk_dhcp.jpg) |
| Netzwerk / Routen | Netzwerk / DHCP |
| ![Caddy](screenshots/17_netzwerk_caddy.jpg) | ![Zertifikate](screenshots/18_sicherheit_zertifikate.jpg) |
| Netzwerk / Caddy | Sicherheit / Zertifikate |
| ![Logins](screenshots/19_sicherheit_logins.jpg) | |
| Sicherheit / Logins | |

## Architektur

```
┌────────────────┐   HTTPS/WSS    ┌────────────────┐   TCP Proxy     ┌────────────┐
│  OPNsense FW   │◄──────────────►│  RMM Backend   │◄───────────────│  Browser/  │
│  (FreeBSD)     │  :8443         │  (Linux)       │  :10000-20000  │  SSH/etc.  │
│                │                │                │                └────────────┘
│  rmm-agent     │  Heartbeat     │  REST API      │                ┌────────────┐
│  rmm-updater   │  WebSocket     │  WebSocket Hub │◄───────────────│  Frontend  │
│  - Collectors  │  Binary Msgs   │  Tunnel Mgr    │  Nginx Proxy   │  (React)   │
│  - WS Client   │  PTY-Stream    │  PTY Bridge    │  :80           │  .20       │
│  - Tunnel Mgr  │                │  PostgreSQL +  │                └────────────┘
│  - PTY Manager │                │  TimescaleDB   │
└────────────────┘                └────────────────┘
     ▲
     │  identisches Protokoll
     ▼
┌────────────────┐
│  Linux Server  │
│  (Proxmox etc) │
│  rmm-agent     │
│  rmm-updater   │
│  - Collectors  │
│  - PTY Manager │
│  - PBS Monitor │
└────────────────┘
```

### Tunnel-Flow

```
Client ──► Backend:ProxyPort ──► WebSocket (Binary) ──► Agent ──► Zieldienst
           (TCP-Listener)        (Session-basiert)       (TCP)    (SSH/HTTPS/etc)
```

- Jeder Tunnel oeffnet einen dynamischen Proxy-Port (10000-20000) auf dem Backend
- Jede TCP-Verbindung am Proxy bekommt eine eigene **Session**
- Der Agent oeffnet pro Session eine separate Ziel-Verbindung (Lazy Connect)
- Mehrere gleichzeitige Verbindungen pro Tunnel moeglich
- Tunnel bleiben offen wenn einzelne Sessions beendet werden

## Komponenten

| Komponente | Beschreibung | Dokumentation |
|------------|-------------|---------------|
| **Backend** | REST API, WebSocket Hub, Tunnel Manager, PostgreSQL + TimescaleDB | [docs/BACKEND.md](docs/BACKEND.md) |
| **Agent BSD** | OPNsense/FreeBSD Agent — Installation, Firmware, OTA-Updates, OPNsense-Updates | [agent-bsd/README.md](agent-bsd/README.md) |
| **Agent Linux** | Linux/Proxmox Agent — Installation, Monitoring, Remote-Commands | [agent-linux/README.md](agent-linux/README.md) |
| **Updater** | OTA-Update-Daemon fuer Agent-Binaries (FreeBSD + Linux, cross-platform) | [updater/README.md](updater/README.md) |
| **Frontend** | React + Vite + TailwindCSS Web-Frontend | [docs/FRONTEND.md](docs/FRONTEND.md) |
| **API** | Vollstaendige REST API mit allen Endpoints | [docs/API.md](docs/API.md) |

## Agent-Faehigkeiten

### Datensammlung (automatisch bei jedem Heartbeat, alle 60s)

| Collector | Daten | Quelle |
|-----------|-------|--------|
| Hardware | Hersteller, Modell, Seriennummer, BIOS | `kenv`, `sysctl` |
| CPU | Modell, Cores, Threads, Frequenz, Auslastung | `sysctl` |
| Memory | Total, Used, Free | `sysctl` |
| Disks | ZFS Datasets, Belegung, Mountpoints | `zfs list` |
| Network | Interfaces, IPs, Status, MAC, Statistiken | `ifconfig` |
| Services | Laufende OPNsense-Dienste (gefiltert) | `service -e`, `configctl`, `/usr/local/sbin/pluginctl` |
| WireGuard | Tunnel, Peers, Transfer, Handshake | `wg show` |
| DHCP | Aktive Leases (KEA/ISC/dnsmasq) | Lease-Dateien, KEA JSON |
| Routing | Routing-Tabelle | `netstat -rn` |
| Gateways | Gateway-Status, RTT, Loss | `configctl interface gateways status` |
| Zertifikate | Alle Certs + CAs, Ablaufdatum, Aussteller | `config.xml` + PEM-Parsing |
| Plugins | Installierte OPNsense-Plugins | `pkg info` |
| Updates | Pending Core + Package Updates | `opnsense-update -c`, `pkg upgrade -n` |
| Cron | System-Crontab + OPNsense config.xml Jobs | `crontab -l`, `config.xml` |

### Remote-Commands (via WebSocket, on-demand)

| Command | Beschreibung |
|---------|-------------|
| `exec` | Beliebigen Shell-Befehl ausfuehren |
| `backup` | Config-Backup (`/conf/config.xml`) erstellen |
| `update_check` | Verfuegbare Updates pruefen |
| `update` | Normales Update (Core + Packages, opt. Reboot) |
| `major_update` | Major-Upgrade (2-Phasen: Base/Kernel → Reboot → Packages) |
| `reboot` | Reboot mit konfigurierbarer Verzoegerung |
| `wg_add_peer` | WireGuard-Peer anlegen (Keypair + Config) |
| `wg_list_peers` | Alle Peers einer WG-Instanz auflisten |
| `wg_delete_peer` | WireGuard-Peer loeschen |
| `tunnel_connect` | TCP-Tunnel zu lokalem Dienst oeffnen |
| `tunnel_disconnect` | Tunnel schliessen |
| `agent_update` | Agent-Binary remote aktualisieren (Legacy) |
| `pty_start` | Interaktive Bash-Shell (PTY) starten — Web Terminal |
| `pty_stop` | PTY-Session beenden |
| `pty_resize` | PTY-Fenstergroesse anpassen |

## Features (v1.0.3)

### OPNsense Plugin WebGUI Fix
- **Config-Parsing**: Korrektes Parsen von `rmmagent[general][KEY]` Formular-Feldern (OPNsense MVC-Konvention)
- **Initialer config.xml Eintrag**: Automatisches Anlegen des `<rmmagent>` Knotens beim ersten Speichern

### Pre-Registration von Firewalls
- Firewalls vorab registrieren bevor der Agent installiert wird (`POST /api/v1/agents`)
- Automatisches Matching bei Agent-Registration nach Name wenn `hostname="(ausstehend)"`
- Frontend: "Firewall hinzufuegen" Dialog mit Installationsanleitung und Copy-Buttons

### Service-Filter
- Boot/Init-Scripts (`bgfsck`, `cleanvar`, `dmesg`, etc.) werden gefiltert — nur echte OPNsense-Dienste
- `pluginctl` mit vollem Pfad `/usr/local/sbin/pluginctl`

### OPNsense Business Edition Lizenz-Anzeige
- Product Name, Subscription Key, Ablaufdatum im Uebersicht-Tab
- Restlaufzeit mit visuellem Farbbalken (gruen/gelb/rot)

### Firmware Management
- Multi-Platform Upload (FreeBSD, Linux, Windows)
- Agent-Update per Button (einzeln oder alle)
- Siehe [agent-bsd/README.md](agent-bsd/README.md)

### Frontend
- Firewall loeschen (Papierkorb-Icon im AgentPanel)
- Agent-Tab mit Version, Update-Button und Remote-Befehlen
- Siehe [docs/FRONTEND.md](docs/FRONTEND.md)

## Voraussetzungen

- **Build-System**: Go 1.24+ (Cross-Compilation, kein CGO)
- **Backend-Server**: Linux (Debian 12+), PostgreSQL 17+, TimescaleDB 2.x
- **Agent-Ziel**: OPNsense / FreeBSD (amd64)

## Schnellstart

```bash
make all                    # Backend + Agent + Updater bauen
make certs                  # TLS-Zertifikate generieren
make deploy-backend         # Backend deployen
```

Agent auf OPNsense installieren → siehe [agent-bsd/README.md](agent-bsd/README.md)

## Dateistruktur

```
rmm/
├── Makefile
├── README.md
├── docs/                        # Detail-Dokumentation
│   ├── API.md                   # Vollstaendige API-Referenz
│   ├── BACKEND.md               # Backend Installation + Konfiguration
│   ├── FRONTEND.md              # Frontend Build + Deploy
│   └── POSTGRES_SETUP.md        # PostgreSQL + TimescaleDB Setup
├── agent-bsd/                   # Agent-Quellcode (FreeBSD/OPNsense)
│   ├── main.go
│   ├── config/config.go
│   ├── client/client.go
│   ├── collector/               # Hardware, CPU, Memory, Disk, Network, Services, ...
│   └── ws/                      # WebSocket Client, Handler, Tunnel, WireGuard
├── backend/                     # Backend-Quellcode (Linux)
│   ├── main.go
│   ├── config/config.go
│   ├── db/postgres.go
│   ├── models/
│   ├── monitor/monitor.go
│   ├── api/                     # REST Handler, Auth, Middleware
│   └── ws/                      # WebSocket Hub, Tunnel Manager
├── updater/                     # OTA-Update-Daemon (FreeBSD + Linux)
├── frontend/                    # React + Vite + TailwindCSS
│   └── src/
├── opnsense-plugin/             # OPNsense MVC Plugin + Installer
│   ├── install.sh
│   └── src/
└── build/                       # Kompilierte Binaries
```

## Technische Details

- **PostgreSQL 17 + TimescaleDB 2.x**: Agent-Registry, Config-Backups, Time-Series Metriken
- **Pure-Go**: pgx/v5 Driver, kein CGO noetig
- **Cross-Compilation**: Backend linux/amd64, Agent freebsd/amd64
- **TLS**: Self-signed Zertifikate (automatisch generiert)
- **WebSocket**: gorilla/websocket, Binary Messages fuer Tunnel-Daten
- **Persistente Agent-ID**: Ueberlebt Agent- und Backend-Neustarts
- **FreeBSD-kompatibel**: Volle Pfade (/usr/bin/netstat etc.), daemon statt nohup

## Zugangsdaten

```
Backend:   https://your-backend:8443
API-Key:   YOUR_API_KEY
Frontend:  http://your-backend (admin / Start!123)
```

## Lizenz

Intern.

---

## Donate

[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-donate-yellow?logo=buy-me-a-coffee)](https://buymeacoffee.com/muellerchen)
