62 lines
1.2 KiB
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
|
|
}
|