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,
                 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") {
 		fmt.Println("Error creating interface")
 		//fmt.Println(err.Error())
 		//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()
         if  err  !=  nil {
 		fmt.Println("Error adding address")
                 //return err
         }
-
+	}
 	var nodeport int
 	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(err)
 		} else {
-			log.Fatalf("Unknown config error: %v", err)
+			fmt.Printf("This is inconvenient: %v", err)
 		}
 	}
         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.")
 		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 {
 		fmt.Println("Server has requested that node update config.")
 		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("Posting local config to remote server.")
 		postnode := getNode()
-		currentinterface := postnode.Interface
+
 		req := &nodepb.UpdateNodeReq{
                                Node: &postnode,
                         }
-                res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
+		res, err := wcclient.UpdateNode(ctx, req, grpc.Header(&header))
                 if err != nil {
 			return err
 			log.Fatalf("Error: %v", err)
                 }
 		res.Node.Postchanges = "false"
-		newinterface := res.Node.Interface
 		err = modConfig(res.Node)
                 if err != nil {
 			return err
                         log.Fatalf("Error: %v", err)
                 }
-		if currentinterface != newinterface {
-			err := DeleteInterface(currentinterface)
-			if err != nil {
-				fmt.Println("ERROR DELETING INTERFACE: " + currentinterface)
-			}
-		}
 		err = setWGConfig()
                 if err != nil {
 			return err
@@ -681,6 +717,23 @@ func CheckIn() error {
 	}
 	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 {
 	modcfg := config.Config
 	modcfg.ReadConfig()