Browse Source

began refactor

0xdcarns 3 years ago
parent
commit
916866f73c
9 changed files with 243 additions and 280 deletions
  1. 2 4
      controllers/network.go
  2. 2 2
      controllers/node.go
  3. 2 4
      controllers/server.go
  4. 58 0
      controllers/server_util.go
  5. 71 0
      logic/nodes.go
  6. 56 74
      logic/server.go
  7. 15 73
      logic/util.go
  8. 16 25
      logic/wireguard.go
  9. 21 98
      serverctl/serverctl.go

+ 2 - 4
controllers/network.go

@@ -12,7 +12,6 @@ import (
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/servercfg"
-	"github.com/gravitl/netmaker/serverctl"
 )
 )
 
 
 const ALL_NETWORK_ACCESS = "THIS_USER_HAS_ALL"
 const ALL_NETWORK_ACCESS = "THIS_USER_HAS_ALL"
@@ -226,9 +225,8 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	if servercfg.IsClientMode() != "off" {
 	if servercfg.IsClientMode() != "off" {
-		var success bool
-		success, err = serverctl.AddNetwork(&network)
-		if err != nil || !success {
+		err = logic.ServerJoin(&network)
+		if err != nil {
 			logic.DeleteNetwork(network.NetID)
 			logic.DeleteNetwork(network.NetID)
 			if err == nil {
 			if err == nil {
 				err = errors.New("Failed to add server to network " + network.DisplayName)
 				err = errors.New("Failed to add server to network " + network.DisplayName)

+ 2 - 2
controllers/node.go

@@ -32,7 +32,6 @@ func nodeHandlers(r *mux.Router) {
 	r.HandleFunc("/api/nodes/{network}", createNode).Methods("POST")
 	r.HandleFunc("/api/nodes/{network}", createNode).Methods("POST")
 	r.HandleFunc("/api/nodes/adm/{network}/lastmodified", authorize(true, "network", http.HandlerFunc(getLastModified))).Methods("GET")
 	r.HandleFunc("/api/nodes/adm/{network}/lastmodified", authorize(true, "network", http.HandlerFunc(getLastModified))).Methods("GET")
 	r.HandleFunc("/api/nodes/adm/{network}/authenticate", authenticate).Methods("POST")
 	r.HandleFunc("/api/nodes/adm/{network}/authenticate", authenticate).Methods("POST")
-
 }
 }
 
 
 func authenticate(response http.ResponseWriter, request *http.Request) {
 func authenticate(response http.ResponseWriter, request *http.Request) {
@@ -535,6 +534,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 		return
 	}
 	}
+
 	if relayupdate {
 	if relayupdate {
 		logic.UpdateRelay(node.Network, node.RelayAddrs, newNode.RelayAddrs)
 		logic.UpdateRelay(node.Network, node.RelayAddrs, newNode.RelayAddrs)
 		if err = logic.NetworkNodesUpdatePullChanges(node.Network); err != nil {
 		if err = logic.NetworkNodesUpdatePullChanges(node.Network); err != nil {
@@ -542,7 +542,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		}
 		}
 	}
 	}
 
 
-	if servercfg.IsDNSMode() {
+	if servercfg.IsDNSMode() { // TODO check when this should be updated..
 		err = logic.SetDNS()
 		err = logic.SetDNS()
 	}
 	}
 	if err != nil {
 	if err != nil {

+ 2 - 4
controllers/server.go

@@ -9,7 +9,6 @@ import (
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/servercfg"
-	"github.com/gravitl/netmaker/serverctl"
 )
 )
 
 
 func serverHandlers(r *mux.Router) {
 func serverHandlers(r *mux.Router) {
@@ -70,9 +69,8 @@ func removeNetwork(w http.ResponseWriter, r *http.Request) {
 	// get params
 	// get params
 	var params = mux.Vars(r)
 	var params = mux.Vars(r)
 
 
-	success, err := serverctl.RemoveNetwork(params["network"])
-
-	if err != nil || !success {
+	err := logic.DeleteNetwork(params["network"])
+	if err != nil {
 		json.NewEncoder(w).Encode("Could not remove server from network " + params["network"])
 		json.NewEncoder(w).Encode("Could not remove server from network " + params["network"])
 		return
 		return
 	}
 	}

+ 58 - 0
controllers/server_util.go

@@ -0,0 +1,58 @@
+package controller
+
+import (
+	"github.com/gravitl/netmaker/logger"
+	"github.com/gravitl/netmaker/logic"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/serverctl"
+)
+
+func runServerUpdateIfNeeded(currentNode *models.Node, newNode *models.Node) error {
+	// check if a peer/server update is needed
+	var serverData = serverctl.ServerUpdateData{
+		UpdatePeers: logic.ShouldPeersUpdate(currentNode, newNode),
+	}
+	if currentNode.IsServer == "yes" {
+		serverData.ServerNode = *currentNode
+	}
+	serverctl.Push(serverData)
+
+	return handleServerUpdate()
+}
+
+func handleServerUpdate() error {
+	var settings, settingsErr = serverctl.Pop()
+	if settingsErr != nil {
+		return settingsErr
+	}
+	var currentServerNodeID, err = logic.GetNetworkServerNodeID(settings.ServerNode.Network)
+	if err != nil {
+		return err
+	}
+	// ensure server client is available
+	if settings.UpdatePeers || (settings.ServerNode.ID == currentServerNodeID) {
+		serverctl.SyncServerNetwork(&settings.ServerNode)
+	}
+	// if peers should update, update peers on network
+	if settings.UpdatePeers {
+		if err = handlePeerUpdate(&settings.ServerNode); err != nil {
+			return err
+		}
+		logger.Log(1, "updated peers on network:", settings.ServerNode.Network)
+	}
+	// if the server node had an update, run the update function
+	if settings.ServerNode.ID == currentServerNodeID {
+		if err = logic.ServerUpdate(&settings.ServerNode); err != nil {
+			return err
+		}
+		logger.Log(1, "server node:", settings.ServerNode.ID, "was updated")
+	}
+	return nil
+}
+
+// tells server to update it's peers
+func handlePeerUpdate(serverNode *models.Node) error {
+	logger.Log(1, "updating peers on network:", serverNode.Network)
+	logic.SetNetworkServerPeers(serverNode)
+	return nil
+}

+ 71 - 0
logic/nodes.go

@@ -9,11 +9,13 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/go-playground/validator/v10"
 	"github.com/go-playground/validator/v10"
+	"github.com/google/uuid"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/validation"
 	"github.com/gravitl/netmaker/validation"
+	"golang.org/x/crypto/bcrypt"
 )
 )
 
 
 // GetNetworkNodes - gets the nodes of a network
 // GetNetworkNodes - gets the nodes of a network
@@ -166,8 +168,75 @@ func ValidateNode(node *models.Node, isUpdate bool) error {
 	return err
 	return err
 }
 }
 
 
+// CreateNode - creates a node in database
+func CreateNode(node *models.Node) error {
+
+	//encrypt that password so we never see it
+	hash, err := bcrypt.GenerateFromPassword([]byte(node.Password), 5)
+	if err != nil {
+		return err
+	}
+	//set password to encrypted password
+	node.Password = string(hash)
+	if node.Name == models.NODE_SERVER_NAME {
+		node.IsServer = "yes"
+	}
+	if node.DNSOn == "" {
+		if servercfg.IsDNSMode() {
+			node.DNSOn = "yes"
+		} else {
+			node.DNSOn = "no"
+		}
+	}
+	SetNodeDefaults(node)
+	node.Address, err = UniqueAddress(node.Network)
+	if err != nil {
+		return err
+	}
+	node.Address6, err = UniqueAddress6(node.Network)
+	if err != nil {
+		return err
+	}
+
+	// TODO: This covers legacy nodes, eventually want to remove legacy check
+	if node.IsServer == "yes" {
+		node.ID = uuid.NewString()
+	} else if node.IsServer != "yes" || (node.ID == "" || strings.Contains(node.ID, "###")) {
+		node.ID = uuid.NewString()
+	}
+
+	//Create a JWT for the node
+	tokenString, _ := CreateJWT(node.ID, node.MacAddress, node.Network)
+	if tokenString == "" {
+		//returnErrorResponse(w, r, errorResponse)
+		return err
+	}
+	err = ValidateNode(node, false)
+	if err != nil {
+		return err
+	}
+
+	nodebytes, err := json.Marshal(&node)
+	if err != nil {
+		return err
+	}
+	err = database.Insert(node.ID, string(nodebytes), database.NODES_TABLE_NAME)
+	if err != nil {
+		return err
+	}
+	if node.IsPending != "yes" {
+		DecrimentKey(node.Network, node.AccessKey)
+	}
+	SetNetworkNodesLastModified(node.Network)
+	if servercfg.IsDNSMode() {
+		err = SetDNS()
+	}
+	return err
+}
+
 // ShouldPeersUpdate - takes old node and sees if certain fields changing would trigger a peer update
 // ShouldPeersUpdate - takes old node and sees if certain fields changing would trigger a peer update
 func ShouldPeersUpdate(currentNode *models.Node, newNode *models.Node) bool {
 func ShouldPeersUpdate(currentNode *models.Node, newNode *models.Node) bool {
+	SetNodeDefaults(newNode)
 	// single comparison statements
 	// single comparison statements
 	if newNode.Endpoint != currentNode.Endpoint ||
 	if newNode.Endpoint != currentNode.Endpoint ||
 		newNode.LocalAddress != currentNode.LocalAddress ||
 		newNode.LocalAddress != currentNode.LocalAddress ||
@@ -177,6 +246,8 @@ func ShouldPeersUpdate(currentNode *models.Node, newNode *models.Node) bool {
 		newNode.IsIngressGateway != currentNode.IsIngressGateway ||
 		newNode.IsIngressGateway != currentNode.IsIngressGateway ||
 		newNode.IsRelay != currentNode.IsRelay ||
 		newNode.IsRelay != currentNode.IsRelay ||
 		newNode.UDPHolePunch != currentNode.UDPHolePunch ||
 		newNode.UDPHolePunch != currentNode.UDPHolePunch ||
+		newNode.IsPending != currentNode.IsPending ||
+		len(newNode.ExcludedAddrs) != len(currentNode.ExcludedAddrs) ||
 		len(newNode.AllowedIPs) != len(currentNode.AllowedIPs) {
 		len(newNode.AllowedIPs) != len(currentNode.AllowedIPs) {
 		return true
 		return true
 	}
 	}

+ 56 - 74
logic/server.go

@@ -26,7 +26,7 @@ const KUBERNETES_LISTEN_PORT = 31821
 const KUBERNETES_SERVER_MTU = 1024
 const KUBERNETES_SERVER_MTU = 1024
 
 
 // ServerJoin - responsible for joining a server to a network
 // ServerJoin - responsible for joining a server to a network
-func ServerJoin(networkSettings *models.Network, serverID string) error {
+func ServerJoin(networkSettings *models.Network) error {
 
 
 	if networkSettings == nil || networkSettings.NetID == "" {
 	if networkSettings == nil || networkSettings.NetID == "" {
 		return errors.New("no network provided")
 		return errors.New("no network provided")
@@ -119,7 +119,7 @@ func ServerJoin(networkSettings *models.Network, serverID string) error {
 	if err = StorePrivKey(node.ID, privateKey); err != nil {
 	if err = StorePrivKey(node.ID, privateKey); err != nil {
 		return err
 		return err
 	}
 	}
-	if err = ServerPush(node); err != nil {
+	if err = serverPush(node); err != nil {
 		return err
 		return err
 	}
 	}
 
 
@@ -137,18 +137,12 @@ func ServerJoin(networkSettings *models.Network, serverID string) error {
 	return nil
 	return nil
 }
 }
 
 
-// ServerCheckin - runs pulls and pushes for server
-func ServerCheckin(serverID string, mac string, network string) error {
-	var serverNode = &models.Node{}
-	var currentNode, err = GetNodeByIDorMacAddress(serverID, mac, network)
-	if err != nil {
-		return err
-	}
-	serverNode = &currentNode
-
-	err = ServerPull(serverNode, false)
+// ServerUpdate - updates the server
+// replaces legacy Checkin code
+func ServerUpdate(serverNode *models.Node) error {
+	var err = serverPull(serverNode, false)
 	if isDeleteError(err) {
 	if isDeleteError(err) {
-		return ServerLeave(currentNode.ID)
+		return DeleteNodeByID(serverNode, true)
 	} else if err != nil {
 	} else if err != nil {
 		return err
 		return err
 	}
 	}
@@ -158,66 +152,7 @@ func ServerCheckin(serverID string, mac string, network string) error {
 		return errors.New("node has been removed")
 		return errors.New("node has been removed")
 	}
 	}
 
 
-	return ServerPush(serverNode)
-}
-
-// ServerPull - pulls current config/peers for server
-func ServerPull(serverNode *models.Node, onErr bool) error {
-
-	var err error
-	if serverNode.IPForwarding == "yes" {
-		if err = setIPForwardingLinux(); err != nil {
-			return err
-		}
-	}
-	serverNode.OS = runtime.GOOS
-
-	if serverNode.PullChanges == "yes" || onErr {
-		// check for interface change
-		// checks if address is in use by another interface
-		var oldIfaceName, isIfacePresent = isInterfacePresent(serverNode.Interface, serverNode.Address)
-		if !isIfacePresent {
-			if err = deleteInterface(oldIfaceName, serverNode.PostDown); err != nil {
-				logger.Log(1, "could not delete old interface", oldIfaceName)
-			}
-			logger.Log(1, "removed old interface", oldIfaceName)
-		}
-		serverNode.PullChanges = "no"
-		if err = setWGConfig(serverNode, false); err != nil {
-			return err
-		}
-		// handle server side update
-		if err = UpdateNode(serverNode, serverNode); err != nil {
-			return err
-		}
-	} else {
-		if err = setWGConfig(serverNode, true); err != nil {
-			if errors.Is(err, os.ErrNotExist) {
-				return ServerPull(serverNode, true)
-			} else {
-				return err
-			}
-		}
-	}
-
-	return nil
-}
-
-// ServerPush - pushes config changes for server checkins/join
-func ServerPush(serverNode *models.Node) error {
-	serverNode.OS = runtime.GOOS
-	serverNode.SetLastCheckIn()
-	return UpdateNode(serverNode, serverNode)
-}
-
-// ServerLeave - removes a server node
-func ServerLeave(serverID string) error {
-
-	var serverNode, err = GetNodeByID(serverID)
-	if err != nil {
-		return err
-	}
-	return DeleteNodeByID(&serverNode, true)
+	return serverPush(serverNode)
 }
 }
 
 
 /**
 /**
@@ -422,7 +357,7 @@ func checkNodeActions(node *models.Node) string {
 		}
 		}
 	}
 	}
 	if node.Action == models.NODE_DELETE {
 	if node.Action == models.NODE_DELETE {
-		err := ServerLeave(node.ID)
+		err := DeleteNodeByID(node, true)
 		if err != nil {
 		if err != nil {
 			logger.Log(1, "error deleting locally:", err.Error())
 			logger.Log(1, "error deleting locally:", err.Error())
 		}
 		}
@@ -431,6 +366,47 @@ func checkNodeActions(node *models.Node) string {
 	return ""
 	return ""
 }
 }
 
 
+func serverPull(serverNode *models.Node, onErr bool) error {
+
+	var err error
+	if serverNode.IPForwarding == "yes" {
+		if err = setIPForwardingLinux(); err != nil {
+			return err
+		}
+	}
+	serverNode.OS = runtime.GOOS
+
+	if serverNode.PullChanges == "yes" || onErr {
+		// check for interface change
+		// checks if address is in use by another interface
+		var oldIfaceName, isIfacePresent = isInterfacePresent(serverNode.Interface, serverNode.Address)
+		if !isIfacePresent {
+			if err = deleteInterface(oldIfaceName, serverNode.PostDown); err != nil {
+				logger.Log(1, "could not delete old interface", oldIfaceName)
+			}
+			logger.Log(1, "removed old interface", oldIfaceName)
+		}
+		serverNode.PullChanges = "no"
+		if err = setWGConfig(serverNode, false); err != nil {
+			return err
+		}
+		// handle server side update
+		if err = UpdateNode(serverNode, serverNode); err != nil {
+			return err
+		}
+	} else {
+		if err = setWGConfig(serverNode, true); err != nil {
+			if errors.Is(err, os.ErrNotExist) {
+				return serverPull(serverNode, true)
+			} else {
+				return err
+			}
+		}
+	}
+
+	return nil
+}
+
 func getServerLocalIP(networkSettings *models.Network) (string, error) {
 func getServerLocalIP(networkSettings *models.Network) (string, error) {
 
 
 	var networkCIDR = networkSettings.LocalRange
 	var networkCIDR = networkSettings.LocalRange
@@ -452,3 +428,9 @@ func getServerLocalIP(networkSettings *models.Network) (string, error) {
 	}
 	}
 	return "", errors.New("could not find a local ip for server")
 	return "", errors.New("could not find a local ip for server")
 }
 }
+
+func serverPush(serverNode *models.Node) error {
+	serverNode.OS = runtime.GOOS
+	serverNode.SetLastCheckIn()
+	return UpdateNode(serverNode, serverNode)
+}

+ 15 - 73
logic/util.go

@@ -5,17 +5,16 @@ import (
 	"encoding/base64"
 	"encoding/base64"
 	"encoding/json"
 	"encoding/json"
 	"math/rand"
 	"math/rand"
+	"os"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
-	"github.com/google/uuid"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/servercfg"
-	"golang.org/x/crypto/bcrypt"
 )
 )
 
 
 // IsBase64 - checks if a string is in base64 format
 // IsBase64 - checks if a string is in base64 format
@@ -31,14 +30,23 @@ func CheckEndpoint(endpoint string) bool {
 	return len(endpointarr) == 2
 	return len(endpointarr) == 2
 }
 }
 
 
+// FileExists - checks if local file exists
+func FileExists(f string) bool {
+	info, err := os.Stat(f)
+	if os.IsNotExist(err) {
+		return false
+	}
+	return !info.IsDir()
+}
+
 // SetNetworkServerPeers - sets the network server peers of a given node
 // SetNetworkServerPeers - sets the network server peers of a given node
-func SetNetworkServerPeers(node *models.Node) {
-	if currentPeersList, err := GetSystemPeers(node); err == nil {
-		if database.SetPeers(currentPeersList, node.Network) {
-			logger.Log(1, "set new peers on network", node.Network)
+func SetNetworkServerPeers(serverNode *models.Node) {
+	if currentPeersList, err := getSystemPeers(serverNode); err == nil {
+		if database.SetPeers(currentPeersList, serverNode.Network) {
+			logger.Log(1, "set new peers on network", serverNode.Network)
 		}
 		}
 	} else {
 	} else {
-		logger.Log(1, "could not set peers on network", node.Network, ":", err.Error())
+		logger.Log(1, "could not set peers on network", serverNode.Network, ":", err.Error())
 	}
 	}
 }
 }
 
 
@@ -75,72 +83,6 @@ func DeleteNodeByMacAddress(node *models.Node, exterminate bool) error {
 	return removeLocalServer(node)
 	return removeLocalServer(node)
 }
 }
 
 
-// CreateNode - creates a node in database
-func CreateNode(node *models.Node) error {
-
-	//encrypt that password so we never see it
-	hash, err := bcrypt.GenerateFromPassword([]byte(node.Password), 5)
-	if err != nil {
-		return err
-	}
-	//set password to encrypted password
-	node.Password = string(hash)
-	if node.Name == models.NODE_SERVER_NAME {
-		node.IsServer = "yes"
-	}
-	if node.DNSOn == "" {
-		if servercfg.IsDNSMode() {
-			node.DNSOn = "yes"
-		} else {
-			node.DNSOn = "no"
-		}
-	}
-	SetNodeDefaults(node)
-	node.Address, err = UniqueAddress(node.Network)
-	if err != nil {
-		return err
-	}
-	node.Address6, err = UniqueAddress6(node.Network)
-	if err != nil {
-		return err
-	}
-
-	// TODO: This covers legacy nodes, eventually want to remove legacy check
-	if node.IsServer == "yes" {
-		node.ID = uuid.NewString()
-	} else if node.IsServer != "yes" || (node.ID == "" || strings.Contains(node.ID, "###")) {
-		node.ID = uuid.NewString()
-	}
-
-	//Create a JWT for the node
-	tokenString, _ := CreateJWT(node.ID, node.MacAddress, node.Network)
-	if tokenString == "" {
-		//returnErrorResponse(w, r, errorResponse)
-		return err
-	}
-	err = ValidateNode(node, false)
-	if err != nil {
-		return err
-	}
-
-	nodebytes, err := json.Marshal(&node)
-	if err != nil {
-		return err
-	}
-	err = database.Insert(node.ID, string(nodebytes), database.NODES_TABLE_NAME)
-	if err != nil {
-		return err
-	}
-	if node.IsPending != "yes" {
-		DecrimentKey(node.Network, node.AccessKey)
-	}
-	SetNetworkNodesLastModified(node.Network)
-	if servercfg.IsDNSMode() {
-		err = SetDNS()
-	}
-	return err
-}
-
 // SetNetworkNodesLastModified - sets the network nodes last modified
 // SetNetworkNodesLastModified - sets the network nodes last modified
 func SetNetworkNodesLastModified(networkName string) error {
 func SetNetworkNodesLastModified(networkName string) error {
 
 

+ 16 - 25
logic/wireguard.go

@@ -16,8 +16,18 @@ import (
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
 )
 
 
-// GetSystemPeers - gets the server peers
-func GetSystemPeers(node *models.Node) (map[string]string, error) {
+// RemoveConf - removes a configuration for a given WireGuard interface
+func RemoveConf(iface string, printlog bool) error {
+	var err error
+	confPath := ncutils.GetNetclientPathSpecific() + iface + ".conf"
+	err = removeWGQuickConf(confPath, printlog)
+	return err
+}
+
+// == Private Functions ==
+
+// gets the server peers locally
+func getSystemPeers(node *models.Node) (map[string]string, error) {
 	peers := make(map[string]string)
 	peers := make(map[string]string)
 
 
 	client, err := wgctrl.New()
 	client, err := wgctrl.New()
@@ -37,16 +47,6 @@ func GetSystemPeers(node *models.Node) (map[string]string, error) {
 	return peers, nil
 	return peers, nil
 }
 }
 
 
-// RemoveConf - removes a configuration for a given WireGuard interface
-func RemoveConf(iface string, printlog bool) error {
-	var err error
-	confPath := ncutils.GetNetclientPathSpecific() + iface + ".conf"
-	err = removeWGQuickConf(confPath, printlog)
-	return err
-}
-
-// == Private Functions ==
-
 func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig, hasGateway bool, gateways []string) error {
 func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig, hasGateway bool, gateways []string) error {
 
 
 	key, err := wgtypes.ParseKey(privkey)
 	key, err := wgtypes.ParseKey(privkey)
@@ -93,16 +93,6 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 			logger.Log(1, "error writing wg conf file to", confPath, ":", err.Error())
 			logger.Log(1, "error writing wg conf file to", confPath, ":", err.Error())
 			return err
 			return err
 		}
 		}
-		if ncutils.IsWindows() {
-			wgConfPath := ncutils.GetWGPathSpecific() + ifacename + ".conf"
-			logger.Log(1, "writing wg conf file to:", confPath)
-			err = os.WriteFile(wgConfPath, []byte(newConf), 0644)
-			if err != nil {
-				logger.Log(1, "error writing wg conf file to", wgConfPath, ":", err.Error())
-				return err
-			}
-			confPath = wgConfPath
-		}
 		// spin up userspace + apply the conf file
 		// spin up userspace + apply the conf file
 		var deviceiface = ifacename
 		var deviceiface = ifacename
 		d, _ := wgclient.Device(deviceiface)
 		d, _ := wgclient.Device(deviceiface)
@@ -182,9 +172,10 @@ func setKernelDevice(ifacename string, address string) error {
 		return err
 		return err
 	}
 	}
 
 
-	_, _ = ncutils.RunCmd("ip link delete dev "+ifacename, false)
-	_, _ = ncutils.RunCmd(ipExec+" link add dev "+ifacename+" type wireguard", true)
-	_, _ = ncutils.RunCmd(ipExec+" address add dev "+ifacename+" "+address+"/24", true) // this is a bug waiting to happen
+	// == best effort ==
+	ncutils.RunCmd("ip link delete dev "+ifacename, false)
+	ncutils.RunCmd(ipExec+" link add dev "+ifacename+" type wireguard", true)
+	ncutils.RunCmd(ipExec+" address add dev "+ifacename+" "+address+"/24", true) // this is a bug waiting to happen
 
 
 	return nil
 	return nil
 }
 }

+ 21 - 98
serverctl/serverctl.go

@@ -1,51 +1,17 @@
 package serverctl
 package serverctl
 
 
 import (
 import (
-	"encoding/json"
 	"errors"
 	"errors"
 	"net"
 	"net"
 	"os"
 	"os"
 	"strings"
 	"strings"
 
 
-	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/ncutils"
-	"github.com/gravitl/netmaker/servercfg"
 )
 )
 
 
-// GetServerWGConf - gets the server WG configuration
-func GetServerWGConf() (models.IntClient, error) {
-	var server models.IntClient
-	collection, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
-	if err != nil {
-		return models.IntClient{}, errors.New("could not find comms server")
-	}
-	for _, value := range collection {
-		json.Unmarshal([]byte(value), &server)
-		if server.Network == "comms" && server.IsServer == "yes" {
-			return server, nil
-		}
-	}
-	return models.IntClient{}, errors.New("could not find comms server")
-}
-
-// FileExists - checks if local file exists
-func FileExists(f string) bool {
-	info, err := os.Stat(f)
-	if os.IsNotExist(err) {
-		return false
-	}
-	return !info.IsDir()
-}
-
-// RemoveNetwork - removes a network locally on server
-func RemoveNetwork(network string) (bool, error) {
-	err := logic.ServerLeave(network)
-	return true, err
-}
-
 // InitServerNetclient - intializes the server netclient
 // InitServerNetclient - intializes the server netclient
 func InitServerNetclient() error {
 func InitServerNetclient() error {
 	netclientDir := ncutils.GetNetclientPath()
 	netclientDir := ncutils.GetNetclientPath()
@@ -59,78 +25,42 @@ func InitServerNetclient() error {
 	return nil
 	return nil
 }
 }
 
 
-// HandleContainedClient - function for checkins on server
-func HandleContainedClient() error {
-	servernets, err := logic.GetNetworks()
-	if err != nil && !database.IsEmptyRecord(err) {
+// SyncServerNetwork - ensures a wg interface and node exists for server
+func SyncServerNetwork(serverNode *models.Node) error {
+	serverNetworkSettings, err := logic.GetNetwork(serverNode.Network)
+	if err != nil {
 		return err
 		return err
 	}
 	}
-	if len(servernets) > 0 {
-		if err != nil {
-			return err
-		}
-		for _, serverNet := range servernets {
-			var serverID, err = logic.GetNetworkServerNodeID(serverNet.NetID)
-			if err != nil {
-				logger.Log(1, "error occurred during server checkin:", err.Error())
-				continue
-			}
-			err = logic.ServerCheckin(serverID, servercfg.GetNodeID(), serverNet.NetID)
-			if err != nil {
-				logger.Log(1, "error occurred during server checkin:", err.Error())
-			} else {
-				logger.Log(3, "completed peers check of network", serverNet.NetID)
-			}
-		}
-		syncErr := SyncNetworks(servernets[:])
-		if syncErr != nil {
-			logger.Log(1, "error syncing networks:", syncErr.Error())
-			syncErr = nil
-		}
-		// logger.Log("completed a checkin call", 3)
-	}
-	return nil
-}
-
-// SyncNetworks - syncs the networks for servers
-func SyncNetworks(servernets []models.Network) error {
-
 	localnets, err := net.Interfaces()
 	localnets, err := net.Interfaces()
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-	// check networks to join
-	for _, servernet := range servernets {
-		exists := false
-		for _, localnet := range localnets {
-			if servernet.DefaultInterface == localnet.Name {
-				exists = true
-			}
+	exists := false
+	for _, localnet := range localnets {
+		if serverNetworkSettings.DefaultInterface == localnet.Name {
+			exists = true
 		}
 		}
-		if !exists {
-			success, err := AddNetwork(&servernet)
-			if err != nil || !success {
-				if err == nil {
-					err = errors.New("network add failed for " + servernet.NetID)
-				}
-				if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
-					logger.Log(1, "error adding network", servernet.NetID, "during sync:", err.Error())
-				}
+	}
+	if !exists {
+		err := logic.ServerJoin(&serverNetworkSettings)
+		if err != nil {
+			if err == nil {
+				err = errors.New("network add failed for " + serverNetworkSettings.NetID)
+			}
+			if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
+				logger.Log(1, "error adding network", serverNetworkSettings.NetID, "during sync:", err.Error())
 			}
 			}
 		}
 		}
 	}
 	}
-	// check networks to leave
 	for _, localnet := range localnets {
 	for _, localnet := range localnets {
 		if strings.Contains(localnet.Name, "nm-") {
 		if strings.Contains(localnet.Name, "nm-") {
 			var exists = ""
 			var exists = ""
-			for _, servernet := range servernets {
-				if servernet.DefaultInterface == localnet.Name {
-					exists = servernet.NetID
-				}
+			if serverNetworkSettings.DefaultInterface == localnet.Name {
+				exists = serverNetworkSettings.NetID
 			}
 			}
 			if exists == "" {
 			if exists == "" {
-				success, err := RemoveNetwork(exists)
-				if err != nil || !success {
+				err := logic.DeleteNodeByID(serverNode, true)
+				if err != nil {
 					if err == nil {
 					if err == nil {
 						err = errors.New("network delete failed for " + exists)
 						err = errors.New("network delete failed for " + exists)
 					}
 					}
@@ -139,12 +69,5 @@ func SyncNetworks(servernets []models.Network) error {
 			}
 			}
 		}
 		}
 	}
 	}
-
 	return nil
 	return nil
 }
 }
-
-// AddNetwork - add a network to server in client mode
-func AddNetwork(networkSettings *models.Network) (bool, error) {
-	var err = logic.ServerJoin(networkSettings, servercfg.GetNodeID())
-	return true, err
-}