rmm2/agent-bsd/collector/routing.go

62 lines
1.2 KiB
Go

package collector
import (
"os/exec"
"strings"
)
type Route struct {
Destination string `json:"destination"`
Gateway string `json:"gateway"`
Flags string `json:"flags"`
Interface string `json:"interface"`
}
// CollectRoutes liest die Routing-Tabelle via netstat -rn
func CollectRoutes() []Route {
out, err := exec.Command("/usr/bin/netstat", "-rn", "-f", "inet").Output()
if err != nil {
return nil
}
var routes []Route
inTable := false
for _, line := range strings.Split(string(out), "\n") {
trimmed := strings.TrimSpace(line)
// Header erkennen
if strings.HasPrefix(trimmed, "Destination") {
inTable = true
continue
}
if !inTable || trimmed == "" {
continue
}
fields := strings.Fields(trimmed)
if len(fields) < 4 {
continue
}
route := Route{
Destination: fields[0],
Gateway: fields[1],
Flags: fields[2],
}
// Interface ist typischerweise das letzte oder vorletzte Feld
// FreeBSD netstat -rn: Destination Gateway Flags Refs Use Netif Expire
// Mindestens 6 Felder fuer Netif
if len(fields) >= 6 {
route.Interface = fields[5]
} else if len(fields) >= 4 {
route.Interface = fields[len(fields)-1]
}
routes = append(routes, route)
}
return routes
}