Browse Source

fixing rangeupdate for ipv6, setting ipv4 assignment

afeiszli 3 years ago
parent
commit
d63bae351d
4 changed files with 85 additions and 11 deletions
  1. 10 3
      controllers/network.go
  2. 50 8
      logic/networks.go
  3. 6 0
      netclient/functions/daemon.go
  4. 19 0
      netclient/local/local.go

+ 10 - 3
controllers/network.go

@@ -147,19 +147,26 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
 		newNetwork.DefaultPostUp = network.DefaultPostUp
 		newNetwork.DefaultPostUp = network.DefaultPostUp
 	}
 	}
 
 
-	rangeupdate, localrangeupdate, holepunchupdate, err := logic.UpdateNetwork(&network, &newNetwork)
+	rangeupdate4, rangeupdate6, localrangeupdate, holepunchupdate, err := logic.UpdateNetwork(&network, &newNetwork)
 	if err != nil {
 	if err != nil {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 		return
 	}
 	}
 
 
-	if rangeupdate {
+	if rangeupdate4 {
 		err = logic.UpdateNetworkNodeAddresses(network.NetID)
 		err = logic.UpdateNetworkNodeAddresses(network.NetID)
 		if err != nil {
 		if err != nil {
 			returnErrorResponse(w, r, formatError(err, "internal"))
 			returnErrorResponse(w, r, formatError(err, "internal"))
 			return
 			return
 		}
 		}
 	}
 	}
+	if rangeupdate6 {
+		err = logic.UpdateNetworkNodeAddresses6(network.NetID)
+		if err != nil {
+			returnErrorResponse(w, r, formatError(err, "internal"))
+			return
+		}
+	}
 	if localrangeupdate {
 	if localrangeupdate {
 		err = logic.UpdateNetworkLocalAddresses(network.NetID)
 		err = logic.UpdateNetworkLocalAddresses(network.NetID)
 		if err != nil {
 		if err != nil {
@@ -174,7 +181,7 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
 			return
 			return
 		}
 		}
 	}
 	}
-	if rangeupdate || localrangeupdate || holepunchupdate {
+	if rangeupdate4 || rangeupdate6 || localrangeupdate || holepunchupdate {
 		nodes, err := logic.GetNetworkNodes(network.NetID)
 		nodes, err := logic.GetNetworkNodes(network.NetID)
 		if err != nil {
 		if err != nil {
 			returnErrorResponse(w, r, formatError(err, "internal"))
 			returnErrorResponse(w, r, formatError(err, "internal"))

+ 50 - 8
logic/networks.go

@@ -447,7 +447,7 @@ func UpdateNetworkNodeAddresses(networkName string) error {
 		var node models.Node
 		var node models.Node
 		err := json.Unmarshal([]byte(value), &node)
 		err := json.Unmarshal([]byte(value), &node)
 		if err != nil {
 		if err != nil {
-			fmt.Println("error in node address assignment!")
+			logger.Log(1, "error in node ipv4 address assignment!")
 			return err
 			return err
 		}
 		}
 		if node.Network == networkName {
 		if node.Network == networkName {
@@ -459,7 +459,7 @@ func UpdateNetworkNodeAddresses(networkName string) error {
 				ipaddr, iperr = UniqueAddress(networkName, false)
 				ipaddr, iperr = UniqueAddress(networkName, false)
 			}
 			}
 			if iperr != nil {
 			if iperr != nil {
-				fmt.Println("error in node  address assignment!")
+				logger.Log(1, "error in node ipv4 address assignment!")
 				return iperr
 				return iperr
 			}
 			}
 
 
@@ -475,6 +475,47 @@ func UpdateNetworkNodeAddresses(networkName string) error {
 	return nil
 	return nil
 }
 }
 
 
+// UpdateNetworkNodeAddresses6 - updates network node addresses
+func UpdateNetworkNodeAddresses6(networkName string) error {
+
+	collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
+	if err != nil {
+		return err
+	}
+
+	for _, value := range collections {
+
+		var node models.Node
+		err := json.Unmarshal([]byte(value), &node)
+		if err != nil {
+			logger.Log(1, "error in node ipv6 address assignment!")
+			return err
+		}
+		if node.Network == networkName {
+			var ipaddr string
+			var iperr error
+			if node.IsServer == "yes" {
+				ipaddr, iperr = UniqueAddress6(networkName, true)
+			} else {
+				ipaddr, iperr = UniqueAddress6(networkName, false)
+			}
+			if iperr != nil {
+				logger.Log(1, "error in node ipv6 address assignment!")
+				return iperr
+			}
+
+			node.Address6 = ipaddr
+			data, err := json.Marshal(&node)
+			if err != nil {
+				return err
+			}
+			database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
+		}
+	}
+
+	return nil
+}
+
 // IsNetworkNameUnique - checks to see if any other networks have the same name (id)
 // IsNetworkNameUnique - checks to see if any other networks have the same name (id)
 func IsNetworkNameUnique(network *models.Network) (bool, error) {
 func IsNetworkNameUnique(network *models.Network) (bool, error) {
 
 
@@ -497,24 +538,25 @@ func IsNetworkNameUnique(network *models.Network) (bool, error) {
 }
 }
 
 
 // UpdateNetwork - updates a network with another network's fields
 // UpdateNetwork - updates a network with another network's fields
-func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (bool, bool, bool, error) {
+func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (bool, bool, bool, bool, error) {
 	if err := ValidateNetwork(newNetwork, true); err != nil {
 	if err := ValidateNetwork(newNetwork, true); err != nil {
-		return false, false, false, err
+		return false, false, false, false, err
 	}
 	}
 	if newNetwork.NetID == currentNetwork.NetID {
 	if newNetwork.NetID == currentNetwork.NetID {
-		hasrangeupdate := newNetwork.AddressRange != currentNetwork.AddressRange
+		hasrangeupdate4 := newNetwork.AddressRange != currentNetwork.AddressRange
+		hasrangeupdate6 := newNetwork.AddressRange6 != currentNetwork.AddressRange6
 		localrangeupdate := newNetwork.LocalRange != currentNetwork.LocalRange
 		localrangeupdate := newNetwork.LocalRange != currentNetwork.LocalRange
 		hasholepunchupdate := newNetwork.DefaultUDPHolePunch != currentNetwork.DefaultUDPHolePunch
 		hasholepunchupdate := newNetwork.DefaultUDPHolePunch != currentNetwork.DefaultUDPHolePunch
 		data, err := json.Marshal(newNetwork)
 		data, err := json.Marshal(newNetwork)
 		if err != nil {
 		if err != nil {
-			return false, false, false, err
+			return false, false, false, false, err
 		}
 		}
 		newNetwork.SetNetworkLastModified()
 		newNetwork.SetNetworkLastModified()
 		err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME)
 		err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME)
-		return hasrangeupdate, localrangeupdate, hasholepunchupdate, err
+		return hasrangeupdate4, hasrangeupdate6, localrangeupdate, hasholepunchupdate, err
 	}
 	}
 	// copy values
 	// copy values
-	return false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.")
+	return false, false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.")
 }
 }
 
 
 // GetNetwork - gets a network from database
 // GetNetwork - gets a network from database

+ 6 - 0
netclient/functions/daemon.go

@@ -21,6 +21,7 @@ import (
 	"github.com/gravitl/netmaker/netclient/auth"
 	"github.com/gravitl/netmaker/netclient/auth"
 	"github.com/gravitl/netmaker/netclient/config"
 	"github.com/gravitl/netmaker/netclient/config"
 	"github.com/gravitl/netmaker/netclient/daemon"
 	"github.com/gravitl/netmaker/netclient/daemon"
+	"github.com/gravitl/netmaker/netclient/local"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/wireguard"
 	"github.com/gravitl/netmaker/netclient/wireguard"
 	ssl "github.com/gravitl/netmaker/tls"
 	ssl "github.com/gravitl/netmaker/tls"
@@ -57,6 +58,11 @@ func Daemon() error {
 		}
 		}
 		//initialPull(cfg.Network)
 		//initialPull(cfg.Network)
 	}
 	}
+	// set ipforwarding on startup
+	err := local.SetIPForwarding()
+	if err != nil {
+		logger.Log(0, err.Error())
+	}
 
 
 	// == subscribe to all nodes for each on machine ==
 	// == subscribe to all nodes for each on machine ==
 	for server, config := range serverSet {
 	for server, config := range serverSet {

+ 19 - 0
netclient/local/local.go

@@ -32,6 +32,8 @@ func SetIPForwarding() error {
 
 
 // SetIPForwardingLinux - sets the ipforwarding for linux
 // SetIPForwardingLinux - sets the ipforwarding for linux
 func SetIPForwardingUnix() error {
 func SetIPForwardingUnix() error {
+
+	// ipv4
 	out, err := ncutils.RunCmd("sysctl net.ipv4.ip_forward", true)
 	out, err := ncutils.RunCmd("sysctl net.ipv4.ip_forward", true)
 	if err != nil {
 	if err != nil {
 		log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
 		log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
@@ -46,6 +48,23 @@ func SetIPForwardingUnix() error {
 			}
 			}
 		}
 		}
 	}
 	}
+
+	// ipv6
+	out, err = ncutils.RunCmd("sysctl net.ipv6.conf.all.forwarding", true)
+	if err != nil {
+		log.Println("WARNING: Error encountered setting ipv6 forwarding. This can break functionality.")
+		return err
+	} else {
+		s := strings.Fields(string(out))
+		if s[2] != "1" {
+			_, err = ncutils.RunCmd("sysctl -w  net.ipv6.conf.all.forwarding=1", true)
+			if err != nil {
+				log.Println("WARNING: Error encountered setting ipv6 forwarding. You may want to investigate this.")
+				return err
+			}
+		}
+	}
+
 	return nil
 	return nil
 }
 }