浏览代码

fixed duplicate interface issue

afeiszli 4 年之前
父节点
当前提交
9aa7970605
共有 2 个文件被更改,包括 65 次插入12 次删除
  1. 二进制
      netclient/functions/.common.go.swp
  2. 65 12
      netclient/functions/common.go

二进制
netclient/functions/.common.go.swp


+ 65 - 12
netclient/functions/common.go

@@ -433,18 +433,35 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
                 Stdout: os.Stdout,
                 Stdout: os.Stdout,
                 Stderr: os.Stdout,
                 Stderr: os.Stdout,
         }
         }
-	err = cmdIPDevLinkAdd.Run()
+
+
+         currentiface, err := net.InterfaceByName(ifacename)
+
+
+        if err != nil {
+		err = cmdIPDevLinkAdd.Run()
 	if  err  !=  nil && !strings.Contains(err.Error(), "exists") {
 	if  err  !=  nil && !strings.Contains(err.Error(), "exists") {
 		fmt.Println("Error creating interface")
 		fmt.Println("Error creating interface")
 		//fmt.Println(err.Error())
 		//fmt.Println(err.Error())
 		//return err
 		//return err
 	}
 	}
+	}
+	match := false
+	addrs, _ := currentiface.Addrs()
+	for _, a := range addrs {
+		fmt.Println("Current address: " + a.String())
+		fmt.Println("node.Address: " + node.Address)
+		if strings.Contains(a.String(), node.Address){
+			match = true
+		}
+	}
+	if !match {
         err = cmdIPAddrAdd.Run()
         err = cmdIPAddrAdd.Run()
         if  err  !=  nil {
         if  err  !=  nil {
 		fmt.Println("Error adding address")
 		fmt.Println("Error adding address")
                 //return err
                 //return err
         }
         }
-
+	}
 	var nodeport int
 	var nodeport int
 	nodeport = int(node.Listenport)
 	nodeport = int(node.Listenport)
 
 
@@ -476,7 +493,7 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
 			fmt.Println("Device does not exist: ")
 			fmt.Println("Device does not exist: ")
 			fmt.Println(err)
 			fmt.Println(err)
 		} else {
 		} else {
-			log.Fatalf("Unknown config error: %v", err)
+			fmt.Printf("This is inconvenient: %v", err)
 		}
 		}
 	}
 	}
         cmdIPLinkUp := &exec.Cmd {
         cmdIPLinkUp := &exec.Cmd {
@@ -601,6 +618,32 @@ func CheckIn() error {
 		fmt.Println("Node is in pending status. Waiting for Admin approval of  node before making furtherupdates.")
 		fmt.Println("Node is in pending status. Waiting for Admin approval of  node before making furtherupdates.")
 		return err
 		return err
 	}
 	}
+
+                newinterface := getNode().Interface
+                readreq := &nodepb.ReadNodeReq{
+                        Macaddress: node.Macaddress,
+                        Group: node.Nodegroup,
+                }
+                readres, err := wcclient.ReadNode(ctx, readreq, grpc.Header(&header))
+                if err != nil {
+                        fmt.Printf("Error: %v", err)
+                } else {
+                currentiface := readres.Node.Interface
+                ifaceupdate := newinterface != currentiface
+                fmt.Println("Is it time to update the interface? ")
+                fmt.Println(ifaceupdate)
+                if err != nil {
+                        log.Printf("Error retrieving interface: %v", err)
+                }
+                if ifaceupdate {
+                        err := DeleteInterface(currentiface)
+                        if err != nil {
+                                fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
+                        }
+                }
+                err = setWGConfig()
+		}
+
 	if checkinres.Checkinresponse.Needconfigupdate {
 	if checkinres.Checkinresponse.Needconfigupdate {
 		fmt.Println("Server has requested that node update config.")
 		fmt.Println("Server has requested that node update config.")
 		fmt.Println("Updating config from remote server.")
 		fmt.Println("Updating config from remote server.")
@@ -628,28 +671,21 @@ func CheckIn() error {
                 fmt.Println("Node has requested to update remote config.")
                 fmt.Println("Node has requested to update remote config.")
                 fmt.Println("Posting local config to remote server.")
                 fmt.Println("Posting local config to remote server.")
 		postnode := getNode()
 		postnode := getNode()
-		currentinterface := postnode.Interface
+
 		req := &nodepb.UpdateNodeReq{
 		req := &nodepb.UpdateNodeReq{
                                Node: &postnode,
                                Node: &postnode,
                         }
                         }
-                res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
+		res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
                 if err != nil {
                 if err != nil {
 			return err
 			return err
 			log.Fatalf("Error: %v", err)
 			log.Fatalf("Error: %v", err)
                 }
                 }
 		res.Node.Postchanges = "false"
 		res.Node.Postchanges = "false"
-		newinterface := res.Node.Interface
 		err = modConfig(res.Node)
 		err = modConfig(res.Node)
                 if err != nil {
                 if err != nil {
 			return err
 			return err
                         log.Fatalf("Error: %v", err)
                         log.Fatalf("Error: %v", err)
                 }
                 }
-		if currentinterface != newinterface {
-			err := DeleteInterface(currentinterface)
-			if err != nil {
-				fmt.Println("ERROR DELETING INTERFACE: " + currentinterface)
-			}
-		}
 		err = setWGConfig()
 		err = setWGConfig()
                 if err != nil {
                 if err != nil {
 			return err
 			return err
@@ -681,6 +717,23 @@ func CheckIn() error {
 	}
 	}
 	return nil
 	return nil
 }
 }
+
+func needInterfaceUpdate(ctx context.Context, mac string, group string, iface string) (bool, string, error) {
+                var header metadata.MD
+		req := &nodepb.ReadNodeReq{
+                        Macaddress: mac,
+                        Group: group,
+                }
+                readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header))
+                if err != nil {
+                        return false, "", err
+                        log.Fatalf("Error: %v", err)
+                }
+		oldiface := readres.Node.Interface
+
+		return iface != oldiface, oldiface, err
+}
+
 func getNode() nodepb.Node {
 func getNode() nodepb.Node {
 	modcfg := config.Config
 	modcfg := config.Config
 	modcfg.ReadConfig()
 	modcfg.ReadConfig()