|
@@ -11,8 +11,9 @@ import (
|
|
|
)
|
|
|
|
|
|
type MDNSHost struct {
|
|
|
- MDNS *zeroconf.Server
|
|
|
- Host *NetworkHost
|
|
|
+ MDNS *zeroconf.Server
|
|
|
+ Host *NetworkHost
|
|
|
+ IfaceOverride *net.Interface
|
|
|
}
|
|
|
|
|
|
type NetworkHost struct {
|
|
@@ -29,9 +30,14 @@ type NetworkHost struct {
|
|
|
Online bool
|
|
|
}
|
|
|
|
|
|
-func NewMDNS(config NetworkHost) (*MDNSHost, error) {
|
|
|
+// Create a new MDNS discoverer, set MacOverride to empty string for using the first NIC discovered
|
|
|
+func NewMDNS(config NetworkHost, MacOverride string) (*MDNSHost, error) {
|
|
|
//Get host MAC Address
|
|
|
macAddress, err := getMacAddr()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
macAddressBoardcast := ""
|
|
|
if err == nil {
|
|
|
macAddressBoardcast = strings.Join(macAddress, ",")
|
|
@@ -46,9 +52,43 @@ func NewMDNS(config NetworkHost) (*MDNSHost, error) {
|
|
|
return &MDNSHost{}, err
|
|
|
}
|
|
|
|
|
|
+ //Discover the iface to override if exists
|
|
|
+ var overrideIface *net.Interface = nil
|
|
|
+ if MacOverride != "" {
|
|
|
+ ifaceIp := ""
|
|
|
+ ifaces, err := net.Interfaces()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("[mDNS] Unable to override iface MAC: " + err.Error() + ". Resuming with default iface")
|
|
|
+ }
|
|
|
+
|
|
|
+ foundMatching := false
|
|
|
+ for _, iface := range ifaces {
|
|
|
+ thisIfaceMac := iface.HardwareAddr.String()
|
|
|
+ thisIfaceMac = strings.ReplaceAll(thisIfaceMac, ":", "-")
|
|
|
+ MacOverride = strings.ReplaceAll(MacOverride, ":", "-")
|
|
|
+ if strings.EqualFold(thisIfaceMac, strings.TrimSpace(MacOverride)) {
|
|
|
+ //This is the correct iface to use
|
|
|
+ overrideIface = &iface
|
|
|
+ addr, err := iface.Addrs()
|
|
|
+ if err == nil && len(addr) > 0 {
|
|
|
+ ifaceIp = addr[0].String()
|
|
|
+ }
|
|
|
+ foundMatching = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !foundMatching {
|
|
|
+ log.Println("[mDNS] Unable to find the target iface with MAC address: " + MacOverride + ". Resuming with default iface")
|
|
|
+ } else {
|
|
|
+ log.Println("[mDNS] Entering force MAC address mode, listening on: " + MacOverride + "( IP address: " + ifaceIp + ")")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return &MDNSHost{
|
|
|
- MDNS: server,
|
|
|
- Host: &config,
|
|
|
+ MDNS: server,
|
|
|
+ Host: &config,
|
|
|
+ IfaceOverride: overrideIface,
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
@@ -59,10 +99,16 @@ func (m *MDNSHost) Close() {
|
|
|
|
|
|
}
|
|
|
|
|
|
-//Scan with given timeout and domain filter. Use m.Host.Domain for scanning similar typed devices
|
|
|
+// Scan with given timeout and domain filter. Use m.Host.Domain for scanning similar typed devices
|
|
|
func (m *MDNSHost) Scan(timeout int, domainFilter string) []*NetworkHost {
|
|
|
// Discover all services on the network (e.g. _workstation._tcp)
|
|
|
- resolver, err := zeroconf.NewResolver(nil)
|
|
|
+
|
|
|
+ var zcoption zeroconf.ClientOption = nil
|
|
|
+ if m.IfaceOverride != nil {
|
|
|
+ zcoption = zeroconf.SelectIfaces([]net.Interface{*m.IfaceOverride})
|
|
|
+ }
|
|
|
+
|
|
|
+ resolver, err := zeroconf.NewResolver(zcoption)
|
|
|
if err != nil {
|
|
|
log.Fatalln("Failed to initialize resolver:", err.Error())
|
|
|
}
|
|
@@ -163,7 +209,6 @@ func (m *MDNSHost) Scan(timeout int, domainFilter string) []*NetworkHost {
|
|
|
}
|
|
|
|
|
|
//Update the master scan record
|
|
|
-
|
|
|
<-ctx.Done()
|
|
|
return discoveredHost
|
|
|
}
|