diff --git a/go.mod b/go.mod index 4675d36e..ccfa1f50 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/d2g/dhcp4client v1.0.0 github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 github.com/godbus/dbus/v5 v5.0.3 - github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 + github.com/j-keck/arping v1.0.1 github.com/mattn/go-shellwords v1.0.11 github.com/onsi/ginkgo v1.13.0 github.com/onsi/gomega v1.10.3 diff --git a/go.sum b/go.sum index 2d6f25f9..db42188a 100644 --- a/go.sum +++ b/go.sum @@ -332,8 +332,9 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.1 h1:XrO9juQieAQHE7DlwT7zFLUK2u3Oi/4Uz2B3ZTxvhxg= +github.com/j-keck/arping v1.0.1/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= diff --git a/vendor/github.com/j-keck/arping/README.md b/vendor/github.com/j-keck/arping/README.md index bdb91d46..086ade5b 100644 --- a/vendor/github.com/j-keck/arping/README.md +++ b/vendor/github.com/j-keck/arping/README.md @@ -1,3 +1,5 @@ +[![pkg.go.dev](https://godoc.org/github.com/j-keck/arping?status.svg)](https://pkg.go.dev/github.com/j-keck/arping) + # arping arping is a native go library to ping a host per arp datagram, or query a host mac address diff --git a/vendor/github.com/j-keck/arping/arping.go b/vendor/github.com/j-keck/arping/arping.go index 4192e694..7a3b0e80 100644 --- a/vendor/github.com/j-keck/arping/arping.go +++ b/vendor/github.com/j-keck/arping/arping.go @@ -65,6 +65,7 @@ import ( "net" "os" "time" + "fmt" ) var ( @@ -77,6 +78,10 @@ var ( // Ping sends an arp ping to 'dstIP' func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) { + if err := validateIP(dstIP); err != nil { + return nil, 0, err + } + iface, err := findUsableInterfaceForNetwork(dstIP) if err != nil { return nil, 0, err @@ -86,6 +91,10 @@ func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) { // PingOverIfaceByName sends an arp ping over interface name 'ifaceName' to 'dstIP' func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time.Duration, error) { + if err := validateIP(dstIP); err != nil { + return nil, 0, err + } + iface, err := net.InterfaceByName(ifaceName) if err != nil { return nil, 0, err @@ -95,6 +104,10 @@ func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time // PingOverIface sends an arp ping over interface 'iface' to 'dstIP' func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Duration, error) { + if err := validateIP(dstIP); err != nil { + return nil, 0, err + } + srcMac := iface.HardwareAddr srcIP, err := findIPInNetworkFromIface(dstIP, iface) if err != nil { @@ -114,7 +127,7 @@ func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Du duration time.Duration err error } - pingResultChan := make(chan PingResult) + pingResultChan := make(chan PingResult, 1) go func() { // send arp request @@ -149,12 +162,17 @@ func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Du case pingResult := <-pingResultChan: return pingResult.mac, pingResult.duration, pingResult.err case <-time.After(timeout): + deinitialize() return nil, 0, ErrTimeout } } // GratuitousArp sends an gratuitous arp from 'srcIP' func GratuitousArp(srcIP net.IP) error { + if err := validateIP(srcIP); err != nil { + return err + } + iface, err := findUsableInterfaceForNetwork(srcIP) if err != nil { return err @@ -164,6 +182,10 @@ func GratuitousArp(srcIP net.IP) error { // GratuitousArpOverIfaceByName sends an gratuitous arp over interface name 'ifaceName' from 'srcIP' func GratuitousArpOverIfaceByName(srcIP net.IP, ifaceName string) error { + if err := validateIP(srcIP); err != nil { + return err + } + iface, err := net.InterfaceByName(ifaceName) if err != nil { return err @@ -173,6 +195,10 @@ func GratuitousArpOverIfaceByName(srcIP net.IP, ifaceName string) error { // GratuitousArpOverIface sends an gratuitous arp over interface 'iface' from 'srcIP' func GratuitousArpOverIface(srcIP net.IP, iface net.Interface) error { + if err := validateIP(srcIP); err != nil { + return err + } + srcMac := iface.HardwareAddr broadcastMac := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} request := newArpRequest(srcMac, srcIP, broadcastMac, srcIP) @@ -195,3 +221,11 @@ func EnableVerboseLog() { func SetTimeout(t time.Duration) { timeout = t } + +func validateIP(ip net.IP) error { + // ip must be a valid V4 address + if len(ip.To4()) != net.IPv4len { + return fmt.Errorf("not a valid v4 Address: %s", ip) + } + return nil +} diff --git a/vendor/github.com/j-keck/arping/go.mod b/vendor/github.com/j-keck/arping/go.mod new file mode 100644 index 00000000..04c772be --- /dev/null +++ b/vendor/github.com/j-keck/arping/go.mod @@ -0,0 +1,3 @@ +module github.com/j-keck/arping + +go 1.12 diff --git a/vendor/modules.txt b/vendor/modules.txt index 68bf39c9..1e52c1fb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -78,7 +78,7 @@ github.com/gogo/protobuf/proto github.com/gogo/protobuf/protoc-gen-gogo/descriptor # github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e github.com/golang/groupcache/lru -# github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 +# github.com/j-keck/arping v1.0.1 ## explicit github.com/j-keck/arping # github.com/mattn/go-shellwords v1.0.11