package arp import ( "net" "sync" "time" "github.com/sirupsen/logrus" ) func init() { go func() { t := time.NewTicker(time.Second * 5) for { refresh() <-t.C } }() } var table sync.Map func refresh() { t, err := lookup() if err != nil { logrus.StandardLogger().WithError(err).Warn("arp cache refresh failed") } else { for k, v := range t { logrus.StandardLogger().WithFields(logrus.Fields{ "mac": v, "ip": k, }).Debug("Updating ARP cache") table.Store(k, v) } } } func Get(addr net.Addr) net.HardwareAddr { if addr == nil { logrus.StandardLogger().Trace("No address found, can't lookup IP for MAC") return nil } var ip net.IP switch addr := addr.(type) { case *net.TCPAddr: ip = addr.IP case *net.UDPAddr: ip = addr.IP } if ip == nil { logrus.StandardLogger().WithField("addr", addr.String()).Trace("No IP address found, can't lookup MAC") return nil } if v, ok := table.Load(ip.String()); ok { logrus.StandardLogger().WithField("ip", ip.String()).Tracef("%s is at %s", ip, v.(net.HardwareAddr).String()) return v.(net.HardwareAddr) } logrus.StandardLogger().WithField("ip", ip.String()).Trace("No MAC address found") return nil }