refactored logic for Hub change

This commit is contained in:
Matthew R Kasun
2022-06-21 15:19:54 +00:00
parent b8854e8fa5
commit 5aa2c16df1
6 changed files with 46 additions and 31 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -56,18 +56,19 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
} }
} }
var node = &models.Node{ var node = &models.Node{
IsServer: "yes", IsServer: "yes",
DNSOn: "no", DNSOn: "no",
IsStatic: "yes", IsStatic: "yes",
Name: fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount), Name: fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount),
MacAddress: servercfg.GetNodeID(), MacAddress: servercfg.GetNodeID(),
ID: "", // will be set to new uuid ID: "", // will be set to new uuid
UDPHolePunch: "no", UDPHolePunch: "no",
IsLocal: networkSettings.IsLocal, IsLocal: networkSettings.IsLocal,
LocalRange: networkSettings.LocalRange, LocalRange: networkSettings.LocalRange,
OS: runtime.GOOS, OS: runtime.GOOS,
Version: servercfg.Version, Version: servercfg.Version,
IsHub: ishub, IsHub: ishub,
NetworkSettings: *networkSettings,
} }
SetNodeDefaults(node) SetNodeDefaults(node)

View File

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