mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-11 23:54:22 +08:00
relay functionality working
This commit is contained in:
parent
0457769308
commit
61c2c5f0a0
5 changed files with 125 additions and 16 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue