diff --git a/net/arp_parser_darwin.go b/net/arp_parser_darwin.go index c32af75b..45eaa28f 100644 --- a/net/arp_parser_darwin.go +++ b/net/arp_parser_darwin.go @@ -4,3 +4,6 @@ import "regexp" var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9:]{11,17})\\s+on\\s+([^\\s]+)\\s+.+$") var ArpTableTokens = 4 +var ArpTableTokenIndex = []uint{1, 2, 3} +var ArpCmd = "arp" +var ArpCmdOpts = []string{"-a", "-n"} diff --git a/net/arp_parser_linux.go b/net/arp_parser_linux.go index 438e178f..fa81c8fa 100644 --- a/net/arp_parser_linux.go +++ b/net/arp_parser_linux.go @@ -2,5 +2,8 @@ package net import "regexp" -var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9:]{17}).+\\s+(.+)$") +var ArpTableParser = regexp.MustCompile("^([\\d\\.]+)\\s+dev\\s+(\\w+)\\s+\\w+\\s+([a-f0-9:]{17})\\s+\\w+$") var ArpTableTokens = 4 +var ArpTableTokenIndex = []uint{1, 3, 2} +var ArpCmd = "ip" +var ArpCmdOpts = []string{"neigh"} diff --git a/net/arp_unix.go b/net/arp_unix.go index 620f5990..3ee8554a 100644 --- a/net/arp_unix.go +++ b/net/arp_unix.go @@ -12,8 +12,8 @@ func ArpUpdate(iface string) (ArpTable, error) { // Signal we parsed the ARP table at least once. arp_parsed = true - // Run "arp -an" and parse the output. - output, err := core.Exec("arp", []string{"-a", "-n"}) + // Run "arp -an" (darwin) or "ip neigh" (linux) and parse the output + output, err := core.Exec(ArpCmd, ArpCmdOpts) if err != nil { return arp_table, err } @@ -22,9 +22,9 @@ func ArpUpdate(iface string) (ArpTable, error) { for _, line := range strings.Split(output, "\n") { m := ArpTableParser.FindStringSubmatch(line) if len(m) == ArpTableTokens { - address := m[1] - mac := m[2] - ifname := m[3] + address := m[ArpTableTokenIndex[0]] + mac := m[ArpTableTokenIndex[1]] + ifname := m[ArpTableTokenIndex[2]] if ifname == iface { new_table[address] = mac