Ver Fonte

Merge pull request #676 from gravitl/bugfix_v0.10.0_server_pull

added server pulls upon server initialize if networks present
dcarns há 3 anos atrás
pai
commit
14c2e2c3f2
5 ficheiros alterados com 35 adições e 10 exclusões
  1. 1 0
      controllers/node.go
  2. 3 4
      controllers/server_util.go
  3. 8 4
      logic/server.go
  4. 3 1
      mq/mq.go
  5. 20 1
      serverctl/serverctl.go

+ 1 - 0
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())

+ 3 - 4
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" {

+ 8 - 4
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
 			}

+ 3 - 1
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())

+ 20 - 1
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(&currentServerNode, true); err != nil {
+					logger.Log(1, fmt.Sprintf("failed pull for network %s, on server node %s",
+						network.NetID,
+						currentServerNode.ID))
+				}
+			}
+		}
+	}
+
 	return nil
 }