Browse Source

relay functionality working

afeiszli 3 years ago
parent
commit
61c2c5f0a0
5 changed files with 125 additions and 16 deletions
  1. 47 14
      controllers/common.go
  2. 17 2
      controllers/nodeGrpcController.go
  3. 12 0
      controllers/nodeHttpController.go
  4. 37 0
      controllers/relay.go
  5. 12 0
      models/node.go

+ 47 - 14
controllers/common.go

@@ -14,8 +14,30 @@ import (
 	"golang.org/x/crypto/bcrypt"
 	"golang.org/x/crypto/bcrypt"
 )
 )
 
 
-func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node, error) {
+func GetPeersList(networkName string, excludeDoNotPropagate bool, relayedNodeAddr string) ([]models.Node, error) {
+	var peers []models.Node
+	var relayNode models.Node
+	var err error
+	if relayedNodeAddr == "" {
+		peers, err = GetNodePeers(networkName, excludeDoNotPropagate)
+
+	} else {
+		relayNode, err = GetNodeRelay(networkName, relayedNodeAddr)
+		if relayNode.Address != "" {
+			relayNode = setPeerInfo(relayNode)
+			network, err := models.GetNetwork(networkName)
+			if err == nil {
+				relayNode.AllowedIPs = append(relayNode.AllowedIPs,network.AddressRange)
+			} else {
+				relayNode.AllowedIPs = append(relayNode.AllowedIPs,relayNode.RelayAddrs...)
+			}	
+			peers = append(peers,relayNode)
+		}
+	}
+	return peers, err
+}
 
 
+func GetNodePeers(networkName string, excludeDoNotPropagate bool) ([]models.Node, error) {
 	var peers []models.Node
 	var peers []models.Node
 	collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
 	collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
 	if err != nil {
 	if err != nil {
@@ -44,18 +66,7 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node
 		allow := node.DoNotPropagate != "yes" || !excludeDoNotPropagate
 		allow := node.DoNotPropagate != "yes" || !excludeDoNotPropagate
 		
 		
 		if node.Network == networkName && node.IsPending != "yes" && allow {
 		if node.Network == networkName && node.IsPending != "yes" && allow {
-			if node.IsRelay == "yes" { // handle relay stuff
-				peer.RelayAddrs = node.RelayAddrs
-				peer.IsRelay = node.IsRelay
-			}
-			peer.DoNotPropagate = node.DoNotPropagate
-			peer.PublicKey = node.PublicKey
-			peer.Endpoint = node.Endpoint
-			peer.LocalAddress = node.LocalAddress
-			peer.ListenPort = node.ListenPort
-			peer.AllowedIPs = node.AllowedIPs
-			peer.Address = node.Address
-			peer.Address6 = node.Address6
+			peer = setPeerInfo(node)
 			if node.UDPHolePunch == "yes" && errN == nil && functions.CheckEndpoint(udppeers[node.PublicKey]) {
 			if node.UDPHolePunch == "yes" && errN == nil && functions.CheckEndpoint(udppeers[node.PublicKey]) {
 				endpointstring := udppeers[node.PublicKey]
 				endpointstring := udppeers[node.PublicKey]
 				endpointarr := strings.Split(endpointstring, ":")
 				endpointarr := strings.Split(endpointstring, ":")
@@ -68,7 +79,12 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node
 				}
 				}
 			}
 			}
 			if node.IsRelay == "yes" {
 			if node.IsRelay == "yes" {
-				peer.AllowedIPs = append(peer.AllowedIPs,node.RelayAddrs...)
+				network, err := models.GetNetwork(networkName)
+				if err == nil {
+					peer.AllowedIPs = append(peer.AllowedIPs,network.AddressRange)
+				} else {
+					peer.AllowedIPs = append(peer.AllowedIPs,node.RelayAddrs...)
+				}
 			}
 			}
 			peers = append(peers, peer)
 			peers = append(peers, peer)
 		}
 		}
@@ -77,6 +93,23 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node
 	return peers, err
 	return peers, err
 }
 }
 
 
+
+
+func setPeerInfo(node models.Node) models.Node {
+	var peer models.Node
+	peer.RelayAddrs = node.RelayAddrs
+	peer.IsRelay = node.IsRelay
+	peer.DoNotPropagate = node.DoNotPropagate
+	peer.PublicKey = node.PublicKey
+	peer.Endpoint = node.Endpoint
+	peer.LocalAddress = node.LocalAddress
+	peer.ListenPort = node.ListenPort
+	peer.AllowedIPs = node.AllowedIPs
+	peer.Address = node.Address
+	peer.Address6 = node.Address6
+	return peer
+}
+
 func GetExtPeersList(macaddress string, networkName string) ([]models.ExtPeersResponse, error) {
 func GetExtPeersList(macaddress string, networkName string) ([]models.ExtPeersResponse, error) {
 
 
 	var peers []models.ExtPeersResponse
 	var peers []models.ExtPeersResponse

+ 17 - 2
controllers/nodeGrpcController.go

@@ -97,11 +97,22 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-
+	relayupdate := false
+	oldRelayAddrs := node.RelayAddrs
+	if node.IsRelay == "yes" && len(newnode.RelayAddrs) > 0 {
+		for i, addr := range newnode.RelayAddrs {
+			if addr != node.RelayAddrs[i] {
+				relayupdate = true
+			}
+		}		
+	}
 	err = node.Update(&newnode)
 	err = node.Update(&newnode)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
+	if relayupdate {
+		UpdateRelay(node.Network, oldRelayAddrs, node.RelayAddrs)
+	}
 	nodeData, err := json.Marshal(&newnode)
 	nodeData, err := json.Marshal(&newnode)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -138,7 +149,11 @@ func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*
 			SetNetworkServerPeers(macAndNetwork[1])
 			SetNetworkServerPeers(macAndNetwork[1])
 		}
 		}
 		excludeDoNotPropagate := node.IsRelay != "yes"
 		excludeDoNotPropagate := node.IsRelay != "yes"
-		peers, err := GetPeersList(macAndNetwork[1], excludeDoNotPropagate)
+		var relayedNode string 
+		if node.DoNotPropagate == "yes" {
+			relayedNode = node.Address
+		}
+		peers, err := GetPeersList(macAndNetwork[1], excludeDoNotPropagate, relayedNode)
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}

+ 12 - 0
controllers/nodeHttpController.go

@@ -754,11 +754,23 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		return
 		return
 	}
 	}
 	newNode.PullChanges = "yes"
 	newNode.PullChanges = "yes"
+	relayupdate := false
+	oldRelayAddrs := node.RelayAddrs
+	if node.IsRelay == "yes" && len(newNode.RelayAddrs) > 0 {
+		for i, addr := range newNode.RelayAddrs {
+			if addr != node.RelayAddrs[i] {
+				relayupdate = true
+			}
+		}		
+	}
 	err = node.Update(&newNode)
 	err = node.Update(&newNode)
 	if err != nil {
 	if err != nil {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 		return
 	}
 	}
+	if relayupdate {
+		UpdateRelay(node.Network, oldRelayAddrs, node.RelayAddrs)
+	}
 
 
 	if servercfg.IsDNSMode() {
 	if servercfg.IsDNSMode() {
 		err = SetDNS()
 		err = SetDNS()

+ 37 - 0
controllers/relay.go

@@ -111,6 +111,16 @@ func ValidateRelay(relay models.RelayRequest) error {
 	return err
 	return err
 }
 }
 
 
+func UpdateRelay(network string, oldAddrs []string, newAddrs []string) {
+	err := SetNodesDoNotPropagate("no", network, oldAddrs)
+	if err != nil {
+		functions.PrintUserLog("netmaker",err.Error(),1)
+	}	
+	err = SetNodesDoNotPropagate("yes", network, newAddrs)
+	if err != nil {
+		functions.PrintUserLog("netmaker",err.Error(),1)
+	}}
+
 func deleteRelay(w http.ResponseWriter, r *http.Request) {
 func deleteRelay(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Content-Type", "application/json")
 	var params = mux.Vars(r)
 	var params = mux.Vars(r)
@@ -156,4 +166,31 @@ func DeleteRelay(network, macaddress string) (models.Node, error) {
 		return models.Node{}, err
 		return models.Node{}, err
 	}
 	}
 	return node, nil
 	return node, nil
+}
+
+func GetNodeRelay(network string, relayedNodeAddr string) (models.Node, error){
+	collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
+	var relay models.Node
+	if err != nil {
+		if database.IsEmptyRecord(err) {
+			return relay, nil
+		}
+		functions.PrintUserLog("", err.Error(), 2)
+		return relay, err
+	}
+	for _, value := range collection {
+		err := json.Unmarshal([]byte(value), &relay)
+		if err != nil {
+			functions.PrintUserLog("", err.Error(), 2)
+			continue
+		}
+		if relay.IsRelay == "yes" {
+			for _, addr := range relay.RelayAddrs {
+				if addr == relayedNodeAddr {
+					return relay, nil
+				}
+			}
+		}
+	}
+	return relay, errors.New("could not find relay for node " + relayedNodeAddr)
 }
 }

+ 12 - 0
models/node.go

@@ -421,6 +421,18 @@ func (newNode *Node) Fill(currentNode *Node) {
 	if newNode.MTU == 0 {
 	if newNode.MTU == 0 {
 		newNode.MTU = currentNode.MTU
 		newNode.MTU = currentNode.MTU
 	}
 	}
+	if newNode.OS == "" {
+		newNode.OS = currentNode.OS
+	}
+	if newNode.RelayAddrs == nil {
+		newNode.RelayAddrs = currentNode.RelayAddrs
+	}
+	if newNode.IsRelay == "" {
+		newNode.IsRelay = currentNode.IsRelay
+	}
+	if newNode.DoNotPropagate == "" {
+		newNode.DoNotPropagate = currentNode.DoNotPropagate
+	}
 }
 }
 
 
 func (currentNode *Node) Update(newNode *Node) error {
 func (currentNode *Node) Update(newNode *Node) error {