Browse Source

Merge pull request #1238 from gravitl/bugfix_v0.14.4_PointToSite

Bugfix v0.14.4 point to site
Alex Feiszli 3 years ago
parent
commit
a3593212c5

+ 0 - 1
controllers/config/dnsconfig/netmaker.hosts

@@ -1,2 +1 @@
-10.0.0.3         testnode3.skynet
 10.0.0.2         testnode.skynet myhost.skynet
 10.0.0.2         testnode.skynet myhost.skynet

+ 17 - 0
controllers/node.go

@@ -646,6 +646,23 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	ifaceDelta := logic.IfaceDelta(&node, &newNode)
 	ifaceDelta := logic.IfaceDelta(&node, &newNode)
+	// for a hub change also need to update the existing hub
+	if newNode.IsHub == "yes" && node.IsHub != "yes" {
+		nodeToUpdate, err := logic.UnsetHub(newNode.Network)
+		if err != nil {
+			logger.Log(2, "failed to unset hubs", err.Error())
+		}
+		if err := mq.NodeUpdate(nodeToUpdate); err != nil {
+			logger.Log(2, "failed to update hub node", nodeToUpdate.Name, err.Error())
+		}
+		if nodeToUpdate.IsServer == "yes" {
+			// set ifacdelta true to force server to update peeers
+			if err := logic.ServerUpdate(nodeToUpdate, true); err != nil {
+				logger.Log(2, "failed to update server node on hub change", err.Error())
+			}
+
+		}
+	}
 
 
 	err = logic.UpdateNode(&node, &newNode)
 	err = logic.UpdateNode(&node, &newNode)
 	if err != nil {
 	if err != nil {

+ 7 - 13
logic/nodes.go

@@ -121,13 +121,6 @@ func IsLeader(node *models.Node) bool {
 
 
 // UpdateNode - takes a node and updates another node with it's values
 // UpdateNode - takes a node and updates another node with it's values
 func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
 func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
-	var err error
-	if newNode.IsHub == "yes" && currentNode.IsHub != "yes" {
-		if err = unsetHub(newNode.Network); err != nil {
-			return err
-		}
-	}
-
 	if newNode.Address != currentNode.Address {
 	if newNode.Address != currentNode.Address {
 		if network, err := GetParentNetwork(newNode.Network); err == nil {
 		if network, err := GetParentNetwork(newNode.Network); err == nil {
 			if !IsAddressInCIDR(newNode.Address, network.AddressRange) {
 			if !IsAddressInCIDR(newNode.Address, network.AddressRange) {
@@ -140,7 +133,6 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
 	if currentNode.IsServer == "yes" && !validateServer(currentNode, newNode) {
 	if currentNode.IsServer == "yes" && !validateServer(currentNode, newNode) {
 		return fmt.Errorf("this operation is not supported on server nodes")
 		return fmt.Errorf("this operation is not supported on server nodes")
 	}
 	}
-
 	// check for un-settable server values
 	// check for un-settable server values
 	if err := ValidateNode(newNode, true); err != nil {
 	if err := ValidateNode(newNode, true); err != nil {
 		return err
 		return err
@@ -381,6 +373,7 @@ func SetNodeDefaults(node *models.Node) {
 
 
 	//TODO: Maybe I should make Network a part of the node struct. Then we can just query the Network object for stuff.
 	//TODO: Maybe I should make Network a part of the node struct. Then we can just query the Network object for stuff.
 	parentNetwork, _ := GetNetworkByNode(node)
 	parentNetwork, _ := GetNetworkByNode(node)
+	node.NetworkSettings = parentNetwork
 
 
 	node.ExpirationDateTime = time.Now().Unix() + models.TEN_YEARS_IN_SECONDS
 	node.ExpirationDateTime = time.Now().Unix() + models.TEN_YEARS_IN_SECONDS
 
 
@@ -619,25 +612,26 @@ func validateServer(currentNode, newNode *models.Node) bool {
 }
 }
 
 
 // unsetHub - unset hub on network nodes
 // unsetHub - unset hub on network nodes
-func unsetHub(networkName string) error {
-
+func UnsetHub(networkName string) (*models.Node, error) {
+	var nodesToUpdate models.Node
 	nodes, err := GetNetworkNodes(networkName)
 	nodes, err := GetNetworkNodes(networkName)
 	if err != nil {
 	if err != nil {
-		return err
+		return &nodesToUpdate, err
 	}
 	}
 
 
 	for i := range nodes {
 	for i := range nodes {
 		if nodes[i].IsHub == "yes" {
 		if nodes[i].IsHub == "yes" {
 			nodes[i].IsHub = "no"
 			nodes[i].IsHub = "no"
+			nodesToUpdate = nodes[i]
 			newNodeData, err := json.Marshal(&nodes[i])
 			newNodeData, err := json.Marshal(&nodes[i])
 			if err != nil {
 			if err != nil {
 				logger.Log(1, "error on node during hub update")
 				logger.Log(1, "error on node during hub update")
-				return err
+				return &nodesToUpdate, err
 			}
 			}
 			database.Insert(nodes[i].ID, string(newNodeData), database.NODES_TABLE_NAME)
 			database.Insert(nodes[i].ID, string(newNodeData), database.NODES_TABLE_NAME)
 		}
 		}
 	}
 	}
-	return nil
+	return &nodesToUpdate, nil
 }
 }
 
 
 // FindRelay - returns the node that is the relay for a relayed node
 // FindRelay - returns the node that is the relay for a relayed node

+ 8 - 4
logic/peers.go

@@ -52,14 +52,18 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 	// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
 	// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
 	// #3 Set allowedips: set_allowedips
 	// #3 Set allowedips: set_allowedips
 	for _, peer := range currentPeers {
 	for _, peer := range currentPeers {
-
-		// if the node is not a server, set the endpoint
-		var setEndpoint = !(node.IsServer == "yes")
-
 		if peer.ID == node.ID {
 		if peer.ID == node.ID {
 			//skip yourself
 			//skip yourself
 			continue
 			continue
 		}
 		}
+		// on point to site networks -- get peers regularily if you are the hub --- otherwise the only peer is the hub
+		if node.NetworkSettings.IsPointToSite == "yes" && node.IsHub == "no" && peer.IsHub == "no" {
+			continue
+		}
+
+		// if the node is not a server, set the endpoint
+		var setEndpoint = !(node.IsServer == "yes")
+
 		if peer.IsRelayed == "yes" {
 		if peer.IsRelayed == "yes" {
 			if !(node.IsRelay == "yes" && ncutils.StringSliceContains(node.RelayAddrs, peer.PrimaryAddress())) {
 			if !(node.IsRelay == "yes" && ncutils.StringSliceContains(node.RelayAddrs, peer.PrimaryAddress())) {
 				//skip -- will be added to relay
 				//skip -- will be added to relay

+ 13 - 12
logic/server.go

@@ -56,18 +56,19 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
 		}
 		}
 	}
 	}
 	var node = &models.Node{
 	var node = &models.Node{
-		IsServer:     "yes",
-		DNSOn:        "no",
-		IsStatic:     "yes",
-		Name:         fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount),
-		MacAddress:   servercfg.GetNodeID(),
-		ID:           "", // will be set to new uuid
-		UDPHolePunch: "no",
-		IsLocal:      networkSettings.IsLocal,
-		LocalRange:   networkSettings.LocalRange,
-		OS:           runtime.GOOS,
-		Version:      servercfg.Version,
-		IsHub:        ishub,
+		IsServer:        "yes",
+		DNSOn:           "no",
+		IsStatic:        "yes",
+		Name:            fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount),
+		MacAddress:      servercfg.GetNodeID(),
+		ID:              "", // will be set to new uuid
+		UDPHolePunch:    "no",
+		IsLocal:         networkSettings.IsLocal,
+		LocalRange:      networkSettings.LocalRange,
+		OS:              runtime.GOOS,
+		Version:         servercfg.Version,
+		IsHub:           ishub,
+		NetworkSettings: *networkSettings,
 	}
 	}
 
 
 	SetNodeDefaults(node)
 	SetNodeDefaults(node)

+ 1 - 1
netclient/wireguard/common.go

@@ -71,7 +71,7 @@ func SetPeers(iface string, node *models.Node, peers []wgtypes.PeerConfig) error
 		if keepAliveString == "0" {
 		if keepAliveString == "0" {
 			keepAliveString = "15"
 			keepAliveString = "15"
 		}
 		}
-		if node.IsHub == "yes" || node.IsServer == "yes" || peer.Endpoint == nil {
+		if node.IsServer == "yes" || peer.Endpoint == nil {
 			_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
 			_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
 				" persistent-keepalive "+keepAliveString+
 				" persistent-keepalive "+keepAliveString+
 				" allowed-ips "+allowedips, true)
 				" allowed-ips "+allowedips, true)