Browse Source

added beginning of node range update

0xdcarns 3 năm trước cách đây
mục cha
commit
a43a60a924
4 tập tin đã thay đổi với 91 bổ sung5 xóa
  1. 45 0
      controllers/network.go
  2. 13 0
      controllers/node.go
  3. 16 5
      models/node.go
  4. 17 0
      netclient/functions/daemon.go

+ 45 - 0
controllers/network.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"net/http"
+	"strconv"
 	"strings"
 
 	"github.com/gorilla/mux"
@@ -13,6 +14,7 @@ import (
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/mq"
 	"github.com/gravitl/netmaker/servercfg"
+	"github.com/gravitl/netmaker/serverctl"
 )
 
 // ALL_NETWORK_ACCESS - represents all networks
@@ -174,8 +176,17 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
 			returnErrorResponse(w, r, formatError(err, "internal"))
 			return
 		}
+		var serverAddrs = make([]models.ServerAddr, 0)
+		if rangeupdate {
+			serverAddrs = preCalculateServerAddrs(network.NetID)
+		}
+
 		for _, node := range nodes {
 			if node.IsServer != "yes" {
+				if rangeupdate {
+					node.Action = models.NODE_RANGE_UPDATE
+					applyServerAddr(&node, serverAddrs, network)
+				}
 				if err := mq.NodeUpdate(&node); err != nil {
 					logger.Log(1, "could not update range when network", netname, "changed cidr for node", node.Name, node.ID, err.Error())
 				}
@@ -342,3 +353,37 @@ func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
 	logger.Log(1, r.Header.Get("user"), "deleted access key", keyname, "on network,", netname)
 	w.WriteHeader(http.StatusOK)
 }
+
+// used for network address changes
+func applyServerAddr(node *models.Node, serverAddrs []models.ServerAddr, network models.Network) {
+	node.NetworkSettings = network
+	node.NetworkSettings.DefaultServerAddrs = serverAddrs
+}
+
+func preCalculateServerAddrs(netname string) []models.ServerAddr {
+	var serverAddrs = make([]models.ServerAddr, 0)
+	serverNodes := logic.GetServerNodes(netname)
+	if len(serverNodes) == 0 {
+		if err := serverctl.SyncServerNetwork(netname); err != nil {
+			return serverAddrs
+		}
+	}
+
+	address, err := logic.UniqueAddressServer(netname)
+	if err != nil {
+		return serverAddrs
+	}
+	for i := range serverNodes {
+		addrParts := strings.Split(address, ".")                      // get the numbers
+		lastNum, lastErr := strconv.Atoi(addrParts[len(addrParts)-1]) // get the last number as an int
+		if lastErr == nil {
+			lastNum = lastNum - i
+			addrParts[len(addrParts)-1] = strconv.Itoa(lastNum)
+			serverAddrs = append(serverAddrs, models.ServerAddr{
+				IsLeader: logic.IsLeader(&serverNodes[i]),
+				Address:  strings.Join(addrParts, "."),
+			})
+		}
+	}
+	return serverAddrs
+}

+ 13 - 0
controllers/node.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"net/http"
 	"strings"
+	"time"
 
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
@@ -660,3 +661,15 @@ func runServerUpdate(node *models.Node, ifaceDelta bool) error {
 	}
 	return nil
 }
+
+func getServerAddrsWithoutNodes(node *models.Node, serverAddrs []models.ServerAddr) {
+
+	networkSettings, _ := logic.GetParentNetwork(node.Network)
+	// TODO consolidate functionality around files
+	networkSettings.NodesLastModified = time.Now().Unix()
+	networkSettings.DefaultServerAddrs = serverAddrs
+	if err := logic.SaveNetwork(&networkSettings); err != nil {
+		logger.Log(1, "unable to save network on serverAddr update", err.Error())
+	}
+	node.NetworkSettings.DefaultServerAddrs = networkSettings.DefaultServerAddrs
+}

+ 16 - 5
models/node.go

@@ -14,11 +14,22 @@ const TEN_YEARS_IN_SECONDS = 300000000
 const MAX_NAME_LENGTH = 62
 
 // == ACTIONS == (can only be set by GRPC)
-const NODE_UPDATE_KEY = "updatekey"
-const NODE_SERVER_NAME = "netmaker"
-const NODE_DELETE = "delete"
-const NODE_IS_PENDING = "pending"
-const NODE_NOOP = "noop"
+const (
+	// NODE_UPDATE_KEY - updates key action
+	NODE_UPDATE_KEY = "updatekey"
+	// NODE_SERVER_NAME - initial server name
+	NODE_SERVER_NAME = "netmaker"
+	// NODE_DELETE - node delete action
+	NODE_DELETE = "delete"
+	// NODE_IS_PENDING - node pending action
+	NODE_IS_PENDING = "pending"
+	// NODE_NOOP - node is in no op state
+	NODE_NOOP = "noop"
+	// NODE_RANGE_UPDATE - network range update action
+	NODE_RANGE_UPDATE = "range"
+	// NODE_UDP_UPDATE - updates udp port action
+	NODE_UDP_UPDATE = "udp"
+)
 
 var seededRand *rand.Rand = rand.New(
 	rand.NewSource(time.Now().UnixNano()))

+ 17 - 0
netclient/functions/daemon.go

@@ -180,6 +180,10 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 		if err := UpdateKeys(&cfg, client); err != nil {
 			ncutils.PrintLog("err updating wireguard keys: "+err.Error(), 1)
 		}
+	case models.NODE_RANGE_UPDATE:
+		if err := UpdateRange(&cfg, client); err != nil {
+			ncutils.PrintLog("err updating wireguard keys: "+err.Error(), 1)
+		}
 	case models.NODE_NOOP:
 	default:
 	}
@@ -311,6 +315,19 @@ func UpdateKeys(cfg *config.ClientConfig, client mqtt.Client) error {
 	return nil
 }
 
+// UpdateRange -- updates node address, mods config
+func UpdateRange(cfg *config.ClientConfig, client mqtt.Client) error {
+	ncutils.Log("received message to update range")
+	if err := config.ModConfig(&cfg.Node); err != nil {
+		ncutils.Log("error updating local config " + err.Error())
+	}
+	if err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, file); err != nil {
+		ncutils.Log("error applying new config " + err.Error())
+		return err
+	}
+	return nil
+}
+
 // Checkin  -- go routine that checks for public or local ip changes, publishes changes
 //   if there are no updates, simply "pings" the server as a checkin
 func Checkin(ctx context.Context, wg *sync.WaitGroup, cfg *config.ClientConfig, network string) {