瀏覽代碼

added foce_mac

TC pushbot 5 2 年之前
父節點
當前提交
ae33a40690
共有 2 個文件被更改,包括 59 次插入14 次删除
  1. 53 8
      mod/network/mdns/mdns.go
  2. 6 6
      network.go

+ 53 - 8
mod/network/mdns/mdns.go

@@ -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
 }

+ 6 - 6
network.go

@@ -127,7 +127,7 @@ func StartNetworkServices() {
 			Vendor:       deviceVendor,
 			BuildVersion: build_version,
 			MinorVersion: internal_version,
-		})
+		}, *force_mac)
 
 		if err != nil {
 			systemWideLogger.PrintAndLog("Network", "MDNS Startup Failed. Running in Offline Mode.", err)
@@ -244,7 +244,7 @@ func StopNetworkServices() {
 
 var networkFileServerDaemon []*fileservers.Server = []*fileservers.Server{}
 
-//Initiate all File Server services
+// Initiate all File Server services
 func FileServerInit() {
 	//Register System Setting
 	registerSetting(settingModule{
@@ -407,7 +407,7 @@ func FileServerInit() {
 	adminRouter.HandleFunc("/system/network/server/toggle", NetworkHandleFileServerToggle)
 }
 
-//Toggle the target File Server Services
+// Toggle the target File Server Services
 func NetworkHandleFileServerToggle(w http.ResponseWriter, r *http.Request) {
 	servid, err := utils.PostPara(r, "id")
 	if err != nil {
@@ -447,13 +447,13 @@ func NetworkHandleFileServerToggle(w http.ResponseWriter, r *http.Request) {
 
 }
 
-//Return a list of supported File Server Services
+// Return a list of supported File Server Services
 func NetworkHandleGetFileServerServiceList(w http.ResponseWriter, r *http.Request) {
 	js, _ := json.Marshal(networkFileServerDaemon)
 	utils.SendJSONResponse(w, string(js))
 }
 
-//Get the status of a file server type.
+// Get the status of a file server type.
 func NetworkHandleGetFileServerStatus(w http.ResponseWriter, r *http.Request) {
 	servid, _ := utils.GetPara(r, "id")
 	if servid == "" {
@@ -478,7 +478,7 @@ func NetworkHandleGetFileServerStatus(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
-//Get a list of endpoint usable by this service
+// Get a list of endpoint usable by this service
 func NetworkHandleGetFileServerEndpoints(w http.ResponseWriter, r *http.Request) {
 	userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
 	if err != nil {