Browse Source

fixed duplicate interface issue

afeiszli 4 years ago
parent
commit
9aa7970605
2 changed files with 65 additions and 12 deletions
  1. BIN
      netclient/functions/.common.go.swp
  2. 65 12
      netclient/functions/common.go

BIN
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()