mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-07 09:41:37 +08:00
refactored logic for Hub change
This commit is contained in:
@@ -1,2 +1 @@
|
|||||||
10.0.0.3 testnode3.skynet
|
|
||||||
10.0.0.2 testnode.skynet myhost.skynet
|
10.0.0.2 testnode.skynet myhost.skynet
|
||||||
|
@@ -646,6 +646,23 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ifaceDelta := logic.IfaceDelta(&node, &newNode)
|
ifaceDelta := logic.IfaceDelta(&node, &newNode)
|
||||||
|
// for a hub change also need to update the existing hub
|
||||||
|
if newNode.IsHub == "yes" && node.IsHub != "yes" {
|
||||||
|
nodeToUpdate, err := logic.UnsetHub(newNode.Network)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(2, "failed to unset hubs", err.Error())
|
||||||
|
}
|
||||||
|
if err := mq.NodeUpdate(nodeToUpdate); err != nil {
|
||||||
|
logger.Log(2, "failed to update hub node", nodeToUpdate.Name, err.Error())
|
||||||
|
}
|
||||||
|
if nodeToUpdate.IsServer == "yes" {
|
||||||
|
// set ifacdelta true to force server to update peeers
|
||||||
|
if err := logic.ServerUpdate(nodeToUpdate, true); err != nil {
|
||||||
|
logger.Log(2, "failed to update server node on hub change", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = logic.UpdateNode(&node, &newNode)
|
err = logic.UpdateNode(&node, &newNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -121,13 +121,6 @@ func IsLeader(node *models.Node) bool {
|
|||||||
|
|
||||||
// UpdateNode - takes a node and updates another node with it's values
|
// UpdateNode - takes a node and updates another node with it's values
|
||||||
func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
|
func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
|
||||||
var err error
|
|
||||||
if newNode.IsHub == "yes" && currentNode.IsHub != "yes" {
|
|
||||||
if err = unsetHub(newNode.Network); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if newNode.Address != currentNode.Address {
|
if newNode.Address != currentNode.Address {
|
||||||
if network, err := GetParentNetwork(newNode.Network); err == nil {
|
if network, err := GetParentNetwork(newNode.Network); err == nil {
|
||||||
if !IsAddressInCIDR(newNode.Address, network.AddressRange) {
|
if !IsAddressInCIDR(newNode.Address, network.AddressRange) {
|
||||||
@@ -140,7 +133,6 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
|
|||||||
if currentNode.IsServer == "yes" && !validateServer(currentNode, newNode) {
|
if currentNode.IsServer == "yes" && !validateServer(currentNode, newNode) {
|
||||||
return fmt.Errorf("this operation is not supported on server nodes")
|
return fmt.Errorf("this operation is not supported on server nodes")
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for un-settable server values
|
// check for un-settable server values
|
||||||
if err := ValidateNode(newNode, true); err != nil {
|
if err := ValidateNode(newNode, true); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -381,6 +373,7 @@ func SetNodeDefaults(node *models.Node) {
|
|||||||
|
|
||||||
//TODO: Maybe I should make Network a part of the node struct. Then we can just query the Network object for stuff.
|
//TODO: Maybe I should make Network a part of the node struct. Then we can just query the Network object for stuff.
|
||||||
parentNetwork, _ := GetNetworkByNode(node)
|
parentNetwork, _ := GetNetworkByNode(node)
|
||||||
|
node.NetworkSettings = parentNetwork
|
||||||
|
|
||||||
node.ExpirationDateTime = time.Now().Unix() + models.TEN_YEARS_IN_SECONDS
|
node.ExpirationDateTime = time.Now().Unix() + models.TEN_YEARS_IN_SECONDS
|
||||||
|
|
||||||
@@ -619,25 +612,26 @@ func validateServer(currentNode, newNode *models.Node) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// unsetHub - unset hub on network nodes
|
// unsetHub - unset hub on network nodes
|
||||||
func unsetHub(networkName string) error {
|
func UnsetHub(networkName string) (*models.Node, error) {
|
||||||
|
var nodesToUpdate models.Node
|
||||||
nodes, err := GetNetworkNodes(networkName)
|
nodes, err := GetNetworkNodes(networkName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return &nodesToUpdate, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
if nodes[i].IsHub == "yes" {
|
if nodes[i].IsHub == "yes" {
|
||||||
nodes[i].IsHub = "no"
|
nodes[i].IsHub = "no"
|
||||||
|
nodesToUpdate = nodes[i]
|
||||||
newNodeData, err := json.Marshal(&nodes[i])
|
newNodeData, err := json.Marshal(&nodes[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log(1, "error on node during hub update")
|
logger.Log(1, "error on node during hub update")
|
||||||
return err
|
return &nodesToUpdate, err
|
||||||
}
|
}
|
||||||
database.Insert(nodes[i].ID, string(newNodeData), database.NODES_TABLE_NAME)
|
database.Insert(nodes[i].ID, string(newNodeData), database.NODES_TABLE_NAME)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return &nodesToUpdate, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindRelay - returns the node that is the relay for a relayed node
|
// FindRelay - returns the node that is the relay for a relayed node
|
||||||
|
@@ -52,14 +52,18 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
|
|||||||
// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
|
// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
|
||||||
// #3 Set allowedips: set_allowedips
|
// #3 Set allowedips: set_allowedips
|
||||||
for _, peer := range currentPeers {
|
for _, peer := range currentPeers {
|
||||||
|
|
||||||
// if the node is not a server, set the endpoint
|
|
||||||
var setEndpoint = !(node.IsServer == "yes")
|
|
||||||
|
|
||||||
if peer.ID == node.ID {
|
if peer.ID == node.ID {
|
||||||
//skip yourself
|
//skip yourself
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// on point to site networks -- get peers regularily if you are the hub --- otherwise the only peer is the hub
|
||||||
|
if node.NetworkSettings.IsPointToSite == "yes" && node.IsHub == "no" && peer.IsHub == "no" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the node is not a server, set the endpoint
|
||||||
|
var setEndpoint = !(node.IsServer == "yes")
|
||||||
|
|
||||||
if peer.IsRelayed == "yes" {
|
if peer.IsRelayed == "yes" {
|
||||||
if !(node.IsRelay == "yes" && ncutils.StringSliceContains(node.RelayAddrs, peer.PrimaryAddress())) {
|
if !(node.IsRelay == "yes" && ncutils.StringSliceContains(node.RelayAddrs, peer.PrimaryAddress())) {
|
||||||
//skip -- will be added to relay
|
//skip -- will be added to relay
|
||||||
|
@@ -68,6 +68,7 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
|
|||||||
OS: runtime.GOOS,
|
OS: runtime.GOOS,
|
||||||
Version: servercfg.Version,
|
Version: servercfg.Version,
|
||||||
IsHub: ishub,
|
IsHub: ishub,
|
||||||
|
NetworkSettings: *networkSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetNodeDefaults(node)
|
SetNodeDefaults(node)
|
||||||
|
@@ -71,7 +71,7 @@ func SetPeers(iface string, node *models.Node, peers []wgtypes.PeerConfig) error
|
|||||||
if keepAliveString == "0" {
|
if keepAliveString == "0" {
|
||||||
keepAliveString = "15"
|
keepAliveString = "15"
|
||||||
}
|
}
|
||||||
if node.IsHub == "yes" || node.IsServer == "yes" || peer.Endpoint == nil {
|
if node.IsServer == "yes" || peer.Endpoint == nil {
|
||||||
_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
|
_, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
|
||||||
" persistent-keepalive "+keepAliveString+
|
" persistent-keepalive "+keepAliveString+
|
||||||
" allowed-ips "+allowedips, true)
|
" allowed-ips "+allowedips, true)
|
||||||
|
Reference in New Issue
Block a user