diff --git a/controllers/common.go b/controllers/common.go index aa6d06c7..0f8ea1cb 100644 --- a/controllers/common.go +++ b/controllers/common.go @@ -14,8 +14,30 @@ import ( "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 collection, err := database.FetchRecords(database.NODES_TABLE_NAME) if err != nil { @@ -44,18 +66,7 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node allow := node.DoNotPropagate != "yes" || !excludeDoNotPropagate 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]) { endpointstring := udppeers[node.PublicKey] endpointarr := strings.Split(endpointstring, ":") @@ -68,7 +79,12 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node } } 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) } @@ -77,6 +93,23 @@ func GetPeersList(networkName string, excludeDoNotPropagate bool) ([]models.Node 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) { var peers []models.ExtPeersResponse diff --git a/controllers/nodeGrpcController.go b/controllers/nodeGrpcController.go index 831ce208..951fa3cc 100644 --- a/controllers/nodeGrpcController.go +++ b/controllers/nodeGrpcController.go @@ -97,11 +97,22 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object) if err != nil { 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) if err != nil { return nil, err } + if relayupdate { + UpdateRelay(node.Network, oldRelayAddrs, node.RelayAddrs) + } nodeData, err := json.Marshal(&newnode) if err != nil { return nil, err @@ -138,7 +149,11 @@ func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (* SetNetworkServerPeers(macAndNetwork[1]) } 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 { return nil, err } diff --git a/controllers/nodeHttpController.go b/controllers/nodeHttpController.go index d935221b..43c41747 100644 --- a/controllers/nodeHttpController.go +++ b/controllers/nodeHttpController.go @@ -754,11 +754,23 @@ func updateNode(w http.ResponseWriter, r *http.Request) { return } 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) if err != nil { returnErrorResponse(w, r, formatError(err, "internal")) return } + if relayupdate { + UpdateRelay(node.Network, oldRelayAddrs, node.RelayAddrs) + } if servercfg.IsDNSMode() { err = SetDNS() diff --git a/controllers/relay.go b/controllers/relay.go index 12438a67..b006e750 100644 --- a/controllers/relay.go +++ b/controllers/relay.go @@ -111,6 +111,16 @@ func ValidateRelay(relay models.RelayRequest) error { 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) { w.Header().Set("Content-Type", "application/json") var params = mux.Vars(r) @@ -156,4 +166,31 @@ func DeleteRelay(network, macaddress string) (models.Node, error) { return models.Node{}, err } 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) } \ No newline at end of file diff --git a/models/node.go b/models/node.go index aa430c0e..b717f7f3 100644 --- a/models/node.go +++ b/models/node.go @@ -421,6 +421,18 @@ func (newNode *Node) Fill(currentNode *Node) { if newNode.MTU == 0 { 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 {