Merge pull request #1203 from gravitl/bugfix_v0.14.3_relay

update relay when relayed address updated
This commit is contained in:
dcarns 2022-06-13 17:36:22 -04:00 committed by GitHub
commit 63a8abf5cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 1 deletions

View file

@ -635,6 +635,10 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
}
}
}
relayedUpdate := false
if node.IsRelayed == "yes" && (node.Address != newNode.Address || node.Address6 != newNode.Address6) {
relayedUpdate = true
}
if !servercfg.GetRce() {
newNode.PostDown = node.PostDown
@ -659,7 +663,9 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
}
}
}
if relayedUpdate {
updateRelay(&node, &newNode)
}
if servercfg.IsDNSMode() {
logic.SetDNS()
}
@ -758,3 +764,27 @@ func runForceServerUpdate(node *models.Node) {
func isServer(node *models.Node) bool {
return node.IsServer == "yes"
}
func updateRelay(oldnode, newnode *models.Node) {
relay := logic.FindRelay(oldnode)
newrelay := relay
//check if node's address has been updated and if so, update the relayAddrs of the relay node with the updated address of the relayed node
if oldnode.Address != newnode.Address {
for i, ip := range newrelay.RelayAddrs {
if ip == oldnode.Address {
newrelay.RelayAddrs = append(newrelay.RelayAddrs[:i], relay.RelayAddrs[i+1:]...)
newrelay.RelayAddrs = append(newrelay.RelayAddrs, newnode.Address)
}
}
}
//check if node's address(v6) has been updated and if so, update the relayAddrs of the relay node with the updated address(v6) of the relayed node
if oldnode.Address6 != newnode.Address6 {
for i, ip := range newrelay.RelayAddrs {
if ip == oldnode.Address {
newrelay.RelayAddrs = append(newrelay.RelayAddrs[:i], newrelay.RelayAddrs[i+1:]...)
newrelay.RelayAddrs = append(newrelay.RelayAddrs, newnode.Address6)
}
}
}
logic.UpdateNode(relay, newrelay)
}

View file

@ -681,3 +681,25 @@ func unsetHub(networkName string) error {
}
return nil
}
// FindRelay - returns the node that is the relay for a relayed node
func FindRelay(node *models.Node) *models.Node {
if node.IsRelayed == "no" {
return nil
}
peers, err := GetNetworkNodes(node.Network)
if err != nil {
return nil
}
for _, peer := range peers {
if peer.IsRelay == "no" {
continue
}
for _, ip := range peer.RelayAddrs {
if ip == node.Address || ip == node.Address6 {
return &peer
}
}
}
return nil
}