bettercap/routing/update_linux.go
2024-08-09 18:19:21 +02:00

84 lines
1.5 KiB
Go

package routing
import (
"regexp"
"strings"
"github.com/bettercap/bettercap/v2/core"
"github.com/evilsocket/islazy/str"
)
var (
routeHeadings []string
whitespaceParser = regexp.MustCompile(`\s+`)
)
func update() ([]Route, error) {
table = make([]Route, 0)
output, err := core.Exec("netstat", []string{"-r", "-n", "-4", "-6"})
if err != nil {
return nil, err
}
// because entries are separated by whitespace
output = strings.ReplaceAll(output, "Next Hop", "Gateway")
for _, line := range strings.Split(output, "\n") {
if line = str.Trim(line); len(line) != 0 {
parts := whitespaceParser.Split(line, -1)
if parts[0] == "Kernel" {
continue
}
if parts[0] == "Destination" {
routeHeadings = parts
continue
}
// skip line if no route headings found yet
if routeHeadings == nil {
continue
}
route := Route{}
for i, s := range parts {
switch routeHeadings[i] {
case "Destination":
route.Destination = s
break
case "Flag":
route.Flags = s
break
case "Flags":
route.Flags = s
break
case "Gateway":
route.Gateway = s
break
case "If":
route.Device = s
break
case "Iface":
route.Device = s
break
case "Netif":
route.Device = s
break
}
}
route.Default = strings.Contains(route.Flags, "G")
if strings.ContainsRune(route.Destination, '.') || strings.ContainsRune(route.Gateway, '.') {
route.Type = IPv4
} else {
route.Type = IPv6
}
table = append(table, route)
}
}
return table, nil
}