- Go Agent (FreeBSD/amd64) fuer OPNsense - Go Backend (Linux/amd64) mit REST API + SQLite - Collector: Hardware, CPU, Memory, Disks, Network, Services, WireGuard, DHCP (KEA/ISC/dnsmasq), Routes, Gateways, Certificates, Plugins, Updates - Persistente Agent-ID - TLS + API-Key Auth - WebSocket-Infrastruktur (WIP): bidirektionaler Command-Kanal, TCP-Tunnel fuer Remote-Zugriff auf Firewall-WebUI - Lastenheft und README
69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
package collector
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os/exec"
|
|
)
|
|
|
|
type Gateway struct {
|
|
Name string `json:"name"`
|
|
Address string `json:"address"`
|
|
Status string `json:"status"`
|
|
Loss string `json:"loss,omitempty"`
|
|
Delay string `json:"delay,omitempty"`
|
|
Stddev string `json:"stddev,omitempty"`
|
|
Monitor string `json:"monitor,omitempty"`
|
|
}
|
|
|
|
// CollectGateways liest OPNsense Gateways via configctl
|
|
func CollectGateways() []Gateway {
|
|
out, err := exec.Command("/usr/local/sbin/configctl", "interface", "gateways", "status").Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var raw []struct {
|
|
Name string `json:"name"`
|
|
Address string `json:"address"`
|
|
Status string `json:"status"`
|
|
Loss string `json:"loss"`
|
|
Delay string `json:"delay"`
|
|
Stddev string `json:"stddev"`
|
|
Monitor string `json:"monitor"`
|
|
StatusTranslated string `json:"status_translated"`
|
|
}
|
|
|
|
if err := json.Unmarshal(out, &raw); err != nil {
|
|
return nil
|
|
}
|
|
|
|
var gateways []Gateway
|
|
for _, r := range raw {
|
|
gw := Gateway{
|
|
Name: r.Name,
|
|
Address: r.Address,
|
|
Status: r.StatusTranslated,
|
|
Loss: r.Loss,
|
|
Delay: r.Delay,
|
|
Stddev: r.Stddev,
|
|
Monitor: r.Monitor,
|
|
}
|
|
// Normalisiere "~" zu leer
|
|
if gw.Loss == "~" {
|
|
gw.Loss = ""
|
|
}
|
|
if gw.Delay == "~" {
|
|
gw.Delay = ""
|
|
}
|
|
if gw.Stddev == "~" {
|
|
gw.Stddev = ""
|
|
}
|
|
if gw.Monitor == "~" {
|
|
gw.Monitor = ""
|
|
}
|
|
gateways = append(gateways, gw)
|
|
}
|
|
|
|
return gateways
|
|
}
|