diff --git a/controllers/node.go b/controllers/node.go index 65e60320..5e673920 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -609,6 +609,7 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { func runUpdates(node *models.Node, nodeUpdate bool) error { //don't publish to server node + if nodeUpdate && !isServer(node) { if err := mq.NodeUpdate(node); err != nil { logger.Log(1, "error publishing node update", err.Error()) diff --git a/controllers/server_util.go b/controllers/server_util.go index d9ae9e58..fef90374 100644 --- a/controllers/server_util.go +++ b/controllers/server_util.go @@ -14,10 +14,9 @@ func runServerPeerUpdate(node *models.Node, ifaceDelta bool) error { if err != nil { logger.Log(3, "error occurred on timer,", err.Error()) } - if servercfg.IsMessageQueueBackend() { - if err := mq.PublishPeerUpdate(node); err != nil { - logger.Log(0, "failed to inform peers of new node ", err.Error()) - } + + if err := mq.PublishPeerUpdate(node); err != nil { + logger.Log(0, "failed to inform peers of new node ", err.Error()) } if servercfg.IsClientMode() != "on" { diff --git a/logic/server.go b/logic/server.go index 8880f9a1..e5d02a81 100644 --- a/logic/server.go +++ b/logic/server.go @@ -141,11 +141,11 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) { // ServerUpdate - updates the server // replaces legacy Checkin code func ServerUpdate(serverNode *models.Node, ifaceDelta bool) error { - var err = serverPull(serverNode, ifaceDelta) + var err = ServerPull(serverNode, ifaceDelta) if isDeleteError(err) { return DeleteNodeByID(serverNode, true) } else if err != nil && !ifaceDelta { - err = serverPull(serverNode, true) + err = ServerPull(serverNode, true) if err != nil { return err } @@ -369,7 +369,11 @@ func checkNodeActions(node *models.Node) string { // == Private == -func serverPull(serverNode *models.Node, ifaceDelta bool) error { +// ServerPull - performs a server pull +func ServerPull(serverNode *models.Node, ifaceDelta bool) error { + if serverNode.IsServer != "yes" { + return fmt.Errorf("attempted pull from non-server node: %s - %s", serverNode.Name, serverNode.ID) + } var err error if serverNode.IPForwarding == "yes" { @@ -400,7 +404,7 @@ func serverPull(serverNode *models.Node, ifaceDelta bool) error { } else { if err = setWGConfig(serverNode, true); err != nil { if errors.Is(err, os.ErrNotExist) { - return serverPull(serverNode, true) + return ServerPull(serverNode, true) } else { return err } diff --git a/mq/mq.go b/mq/mq.go index e59466ea..4d1851ae 100644 --- a/mq/mq.go +++ b/mq/mq.go @@ -99,7 +99,9 @@ var UpdateNode mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) // PublishPeerUpdate --- deterines and publishes a peer update to all the peers of a node func PublishPeerUpdate(newNode *models.Node) error { - + if !servercfg.IsMessageQueueBackend() { + return nil + } networkNodes, err := logic.GetNetworkNodes(newNode.Network) if err != nil { logger.Log(1, "err getting Network Nodes", err.Error()) diff --git a/serverctl/serverctl.go b/serverctl/serverctl.go index e1c4f7c4..3d5424ba 100644 --- a/serverctl/serverctl.go +++ b/serverctl/serverctl.go @@ -2,10 +2,12 @@ package serverctl import ( "errors" + "fmt" "net" "os" "strings" + "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/netclient/ncutils" @@ -14,15 +16,32 @@ import ( const NETMAKER_BINARY_NAME = "netmaker" // InitServerNetclient - intializes the server netclient +// 1. Check if config directory exists, if not attempt to make +// 2. Check current networks and run pull to get interface up to date in case of restart func InitServerNetclient() error { netclientDir := ncutils.GetNetclientPath() _, err := os.Stat(netclientDir + "/config") if os.IsNotExist(err) { - os.MkdirAll(netclientDir+"/config", 0744) + os.MkdirAll(netclientDir+"/config", 0700) } else if err != nil { logger.Log(1, "could not find or create", netclientDir) return err } + + var networks, netsErr = logic.GetNetworks() + if netsErr == nil || database.IsEmptyRecord(netsErr) { + for _, network := range networks { + var currentServerNode, nodeErr = logic.GetNetworkServerLocal(network.NetID) + if nodeErr == nil { + if err = logic.ServerPull(¤tServerNode, true); err != nil { + logger.Log(1, fmt.Sprintf("failed pull for network %s, on server node %s", + network.NetID, + currentServerNode.ID)) + } + } + } + } + return nil }