From debdeba956893f4f41b9bd84d84616bfaabc2bc5 Mon Sep 17 00:00:00 2001 From: evilsocket Date: Tue, 9 Jan 2018 20:03:39 +0100 Subject: [PATCH] refact: divided os specific code for arp parsing --- net/arp.go | 39 --------------------------------------- net/arp_unix.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 39 deletions(-) create mode 100644 net/arp_unix.go diff --git a/net/arp.go b/net/arp.go index f07d12e2..29e1be22 100644 --- a/net/arp.go +++ b/net/arp.go @@ -2,11 +2,7 @@ package net import ( "fmt" - "regexp" - "strings" "sync" - - "github.com/evilsocket/bettercap-ng/core" ) type ArpTable map[string]string @@ -17,9 +13,6 @@ var ( arp_table = make(ArpTable) ) -var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9:]{17}).+\\s+(.+)$") -var ArpTableTokens = 4 - func ArpDiff(current, before ArpTable) ArpTable { diff := make(ArpTable) for ip, mac := range current { @@ -53,35 +46,3 @@ func ArpParsed() bool { defer arp_lock.Unlock() return arp_parsed } - -func ArpUpdate(iface string) (ArpTable, error) { - arp_lock.Lock() - defer arp_lock.Unlock() - - // 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"}) - if err != nil { - return arp_table, err - } - - new_table := make(ArpTable) - for _, line := range strings.Split(output, "\n") { - m := ArpTableParser.FindStringSubmatch(line) - if len(m) == ArpTableTokens { - address := m[1] - mac := m[2] - ifname := m[3] - - if ifname == iface { - new_table[address] = mac - } - } - } - - arp_table = new_table - - return arp_table, nil -} diff --git a/net/arp_unix.go b/net/arp_unix.go new file mode 100644 index 00000000..f002aab3 --- /dev/null +++ b/net/arp_unix.go @@ -0,0 +1,43 @@ +package net + +import ( + "regexp" + "strings" + + "github.com/evilsocket/bettercap-ng/core" +) + +var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9:]{17}).+\\s+(.+)$") +var ArpTableTokens = 4 + +func ArpUpdate(iface string) (ArpTable, error) { + arp_lock.Lock() + defer arp_lock.Unlock() + + // 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"}) + if err != nil { + return arp_table, err + } + + new_table := make(ArpTable) + for _, line := range strings.Split(output, "\n") { + m := ArpTableParser.FindStringSubmatch(line) + if len(m) == ArpTableTokens { + address := m[1] + mac := m[2] + ifname := m[3] + + if ifname == iface { + new_table[address] = mac + } + } + } + + arp_table = new_table + + return arp_table, nil +}