diff --git a/controllers/config/dnsconfig/netmaker.hosts b/controllers/config/dnsconfig/netmaker.hosts index a4bce696..45eab425 100644 --- a/controllers/config/dnsconfig/netmaker.hosts +++ b/controllers/config/dnsconfig/netmaker.hosts @@ -1,2 +1 @@ -10.0.0.3 testnode3.skynet 10.0.0.2 testnode.skynet myhost.skynet diff --git a/controllers/node.go b/controllers/node.go index bdf137a1..9a7f0029 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -646,6 +646,23 @@ func updateNode(w http.ResponseWriter, r *http.Request) { } 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) if err != nil { diff --git a/logic/nodes.go b/logic/nodes.go index b87e3b8a..f87b86ce 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -121,13 +121,6 @@ func IsLeader(node *models.Node) bool { // UpdateNode - takes a node and updates another node with it's values 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 network, err := GetParentNetwork(newNode.Network); err == nil { 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) { return fmt.Errorf("this operation is not supported on server nodes") } - // check for un-settable server values if err := ValidateNode(newNode, true); err != nil { 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. parentNetwork, _ := GetNetworkByNode(node) + node.NetworkSettings = parentNetwork 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 -func unsetHub(networkName string) error { - +func UnsetHub(networkName string) (*models.Node, error) { + var nodesToUpdate models.Node nodes, err := GetNetworkNodes(networkName) if err != nil { - return err + return &nodesToUpdate, err } for i := range nodes { if nodes[i].IsHub == "yes" { nodes[i].IsHub = "no" + nodesToUpdate = nodes[i] newNodeData, err := json.Marshal(&nodes[i]) if err != nil { 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) } } - return nil + return &nodesToUpdate, nil } // FindRelay - returns the node that is the relay for a relayed node diff --git a/logic/peers.go b/logic/peers.go index c5e5f874..2a1e065b 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -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 // #3 Set allowedips: set_allowedips for _, peer := range currentPeers { - - // if the node is not a server, set the endpoint - var setEndpoint = !(node.IsServer == "yes") - if peer.ID == node.ID { //skip yourself 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 !(node.IsRelay == "yes" && ncutils.StringSliceContains(node.RelayAddrs, peer.PrimaryAddress())) { //skip -- will be added to relay diff --git a/logic/server.go b/logic/server.go index d1b3554e..97dcbfed 100644 --- a/logic/server.go +++ b/logic/server.go @@ -56,18 +56,19 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) { } } var node = &models.Node{ - IsServer: "yes", - DNSOn: "no", - IsStatic: "yes", - Name: fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount), - MacAddress: servercfg.GetNodeID(), - ID: "", // will be set to new uuid - UDPHolePunch: "no", - IsLocal: networkSettings.IsLocal, - LocalRange: networkSettings.LocalRange, - OS: runtime.GOOS, - Version: servercfg.Version, - IsHub: ishub, + IsServer: "yes", + DNSOn: "no", + IsStatic: "yes", + Name: fmt.Sprintf("%s-%d", models.NODE_SERVER_NAME, serverCount), + MacAddress: servercfg.GetNodeID(), + ID: "", // will be set to new uuid + UDPHolePunch: "no", + IsLocal: networkSettings.IsLocal, + LocalRange: networkSettings.LocalRange, + OS: runtime.GOOS, + Version: servercfg.Version, + IsHub: ishub, + NetworkSettings: *networkSettings, } SetNodeDefaults(node) diff --git a/netclient/wireguard/common.go b/netclient/wireguard/common.go index 01633f0e..f8df1742 100644 --- a/netclient/wireguard/common.go +++ b/netclient/wireguard/common.go @@ -71,7 +71,7 @@ func SetPeers(iface string, node *models.Node, peers []wgtypes.PeerConfig) error if keepAliveString == "0" { 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()+ " persistent-keepalive "+keepAliveString+ " allowed-ips "+allowedips, true)