mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-25 18:00:25 +08:00
relay functionality working
This commit is contained in:
@@ -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 = setPeerInfo(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
|
|
||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user