relay functionality working

This commit is contained in:
afeiszli 2021-09-16 20:00:40 -04:00
parent 0457769308
commit 61c2c5f0a0
5 changed files with 125 additions and 16 deletions

View file

@ -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

View file

@ -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
}

View file

@ -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()

View file

@ -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)
}

View file

@ -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 {