Browse Source

backup logic for relay failing, dont allow server to be relayed

afeiszli 3 years ago
parent
commit
7c56420b9f
3 changed files with 52 additions and 4 deletions
  1. 9 1
      controllers/node_grpc.go
  2. 12 2
      logic/nodes.go
  3. 31 1
      logic/relay.go

+ 9 - 1
controllers/node_grpc.go

@@ -5,6 +5,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"strings"
 	"time"
 
 	nodepb "github.com/gravitl/netmaker/grpc"
@@ -238,7 +239,14 @@ func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*
 	}
 	peers, err := logic.GetPeersList(node.Network, excludeIsRelayed, relayedNode)
 	if err != nil {
-		return nil, err
+		if strings.Contains(err.Error(), logic.RELAY_NODE_ERR) {
+			peers, err = logic.PeerListUnRelay(node.ID, node.Network)
+			if err != nil {
+				return nil, err
+			}
+		} else {
+			return nil, err
+		}
 	}
 
 	peersData, err := json.Marshal(&peers)

+ 12 - 2
logic/nodes.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"sort"
+	"strings"
 	"time"
 
 	"github.com/go-playground/validator/v10"
@@ -18,6 +19,8 @@ import (
 	"golang.org/x/crypto/bcrypt"
 )
 
+const RELAY_NODE_ERR = "could not find relay for node "
+
 // GetNetworkNodes - gets the nodes of a network
 func GetNetworkNodes(network string) ([]models.Node, error) {
 	var nodes []models.Node
@@ -103,7 +106,14 @@ func GetPeers(node *models.Node) ([]models.Node, error) {
 	}
 	peers, err := GetPeersList(node.Network, excludeIsRelayed, relayedNode)
 	if err != nil {
-		return nil, err
+		if strings.Contains(err.Error(), RELAY_NODE_ERR) {
+			peers, err = PeerListUnRelay(node.ID, node.Network)
+			if err != nil {
+				return nil, err
+			}
+		} else {
+			return nil, err
+		}
 	}
 	return peers, nil
 }
@@ -498,7 +508,7 @@ func GetNodeRelay(network string, relayedNodeAddr string) (models.Node, error) {
 			}
 		}
 	}
-	return relay, errors.New("could not find relay for node " + relayedNodeAddr)
+	return relay, errors.New(RELAY_NODE_ERR + relayedNodeAddr)
 }
 
 // GetNodeByIDorMacAddress - gets the node, if a mac address exists, but not id, then it should delete it and recreate in DB with new ID

+ 31 - 1
logic/relay.go

@@ -63,7 +63,7 @@ func SetRelayedNodes(yesOrno string, networkName string, addrs []string) error {
 		if err != nil {
 			return err
 		}
-		if node.Network == networkName {
+		if node.Network == networkName && !(node.IsServer == "yes") {
 			for _, addr := range addrs {
 				if addr == node.Address || addr == node.Address6 {
 					node.IsRelayed = yesOrno
@@ -84,6 +84,36 @@ func SetRelayedNodes(yesOrno string, networkName string, addrs []string) error {
 	return nil
 }
 
+func SetNodeIsRelayed(yesOrno string, id string) error {
+	node, err := GetNodeByID(id)
+	if err != nil {
+		return err
+	}
+	network, err := GetNetworkByNode(&node)
+	if err != nil {
+		return err
+	}
+	node.IsRelayed = yesOrno
+	if yesOrno == "yes" {
+		node.UDPHolePunch = "no"
+	} else {
+		node.UDPHolePunch = network.DefaultUDPHolePunch
+	}
+	data, err := json.Marshal(&node)
+	if err != nil {
+		return err
+	}
+	return database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
+}
+
+func PeerListUnRelay(id string, network string) ([]models.Node, error) {
+	err := SetNodeIsRelayed("no", id)
+	if err != nil {
+		return nil, err
+	}
+	return GetPeersList(network, true, "")
+}
+
 // ValidateRelay - checks if relay is valid
 func ValidateRelay(relay models.RelayRequest) error {
 	var err error