Browse Source

Merge pull request #1148 from gravitl/feature_v0.14.2_brokeraddr

changing broker retrieval/setting logic
Alex Feiszli 3 years ago
parent
commit
298aa8b779

+ 1 - 0
controllers/config/dnsconfig/netmaker.hosts

@@ -1 +1,2 @@
+10.0.0.3         testnode3.skynet
 10.0.0.2         testnode.skynet myhost.skynet

+ 6 - 4
controllers/node.go

@@ -373,8 +373,9 @@ func getNode(w http.ResponseWriter, r *http.Request) {
 	}
 
 	response := models.NodeGet{
-		Node:  node,
-		Peers: peerUpdate.Peers,
+		Node:         node,
+		Peers:        peerUpdate.Peers,
+		ServerConfig: servercfg.GetServerInfo(),
 	}
 
 	logger.Log(2, r.Header.Get("user"), "fetched node", params["nodeid"])
@@ -492,8 +493,9 @@ func createNode(w http.ResponseWriter, r *http.Request) {
 	}
 
 	response := models.NodeGet{
-		Node:  node,
-		Peers: peerUpdate.Peers,
+		Node:         node,
+		Peers:        peerUpdate.Peers,
+		ServerConfig: servercfg.GetServerInfo(),
 	}
 
 	logger.Log(1, r.Header.Get("user"), "created new node", node.Name, "on network", node.Network)

+ 1 - 1
controllers/node_test.go

@@ -188,7 +188,7 @@ func TestNodeACLs(t *testing.T) {
 		currentACL.Save(acls.ContainerID(node1.Network))
 	})
 	t.Run("node acls correct after add new node not allowed", func(t *testing.T) {
-		node3 := models.Node{PublicKey: "DM5qhLAE20FG7BbfBCger+Ac9D2NDOwCtY1rbYDXv24=", Name: "testnode3", Endpoint: "10.0.0.100", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet", OS: "linux"}
+		node3 := models.Node{PublicKey: "this-is-not-valid", Name: "testnode3", Endpoint: "10.0.0.100", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet", OS: "linux"}
 		logic.CreateNode(&node3)
 		var currentACL, err = nodeacls.FetchAllACLs(nodeacls.NetworkID(node3.Network))
 		assert.Nil(t, err)

+ 13 - 19
controllers/server.go

@@ -23,6 +23,7 @@ func serverHandlers(r *mux.Router) {
 	r.HandleFunc("/api/server/getconfig", securityCheckServer(false, http.HandlerFunc(getConfig))).Methods("GET")
 	r.HandleFunc("/api/server/removenetwork/{network}", securityCheckServer(true, http.HandlerFunc(removeNetwork))).Methods("DELETE")
 	r.HandleFunc("/api/server/register", authorize(true, false, "node", http.HandlerFunc(register))).Methods("POST")
+	r.HandleFunc("/api/server/getserverinfo", authorize(true, false, "node", http.HandlerFunc(getServerInfo))).Methods("GET")
 }
 
 //Security check is middleware for every function and just checks to make sure that its the master calling
@@ -81,35 +82,26 @@ func removeNetwork(w http.ResponseWriter, r *http.Request) {
 	json.NewEncoder(w).Encode("Server removed from network " + params["network"])
 }
 
-func getConfig(w http.ResponseWriter, r *http.Request) {
+func getServerInfo(w http.ResponseWriter, r *http.Request) {
 	// Set header
 	w.Header().Set("Content-Type", "application/json")
 
 	// get params
 
-	scfg := servercfg.GetServerConfig()
-	json.NewEncoder(w).Encode(scfg)
+	json.NewEncoder(w).Encode(servercfg.GetServerInfo())
 	//w.WriteHeader(http.StatusOK)
 }
 
-// func addNetwork(w http.ResponseWriter, r *http.Request) {
-// 	// Set header
-// 	w.Header().Set("Content-Type", "application/json")
-
-// 	// get params
-// 	var params = mux.Vars(r)
-// 	var networkName = params["network"]
-// 	var networkSettings, err := logic.GetNetwork(netwnetworkName)
-
-// 	success, err := serverctl.AddNetwork(params["network"])
+func getConfig(w http.ResponseWriter, r *http.Request) {
+	// Set header
+	w.Header().Set("Content-Type", "application/json")
 
-// 	if err != nil || !success {
-// 		json.NewEncoder(w).Encode("Could not add server to network " + params["network"])
-// 		return
-// 	}
+	// get params
 
-// 	json.NewEncoder(w).Encode("Server added to network " + params["network"])
-// }
+	scfg := servercfg.GetServerConfig()
+	json.NewEncoder(w).Encode(scfg)
+	//w.WriteHeader(http.StatusOK)
+}
 
 // register - registers a client with the server and return the CA and cert
 func register(w http.ResponseWriter, r *http.Request) {
@@ -141,6 +133,8 @@ func register(w http.ResponseWriter, r *http.Request) {
 		CAPubKey:   (ca.PublicKey).(ed25519.PublicKey),
 		Cert:       *cert,
 		CertPubKey: (cert.PublicKey).(ed25519.PublicKey),
+		Broker:     servercfg.GetServer(),
+		Port:       servercfg.GetMQPort(),
 	}
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(response)

+ 2 - 6
logic/accesskeys.go

@@ -52,12 +52,8 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models
 	netID := network.NetID
 
 	var accessToken models.AccessToken
-	s := servercfg.GetServerConfig()
-	servervals := models.ServerConfig{
-		Server:        s.Server,
-		APIConnString: s.APIConnString,
-	}
-	accessToken.ServerConfig = servervals
+
+	accessToken.APIConnString = servercfg.GetAPIConnString()
 	accessToken.ClientConfig.Network = netID
 	accessToken.ClientConfig.Key = accesskey.Value
 	accessToken.ClientConfig.LocalRange = privAddr

+ 2 - 6
logic/nodes.go

@@ -220,16 +220,12 @@ func IsNodeIDUnique(node *models.Node) (bool, error) {
 // ValidateNode - validates node values
 func ValidateNode(node *models.Node, isUpdate bool) error {
 	v := validator.New()
-	_ = v.RegisterValidation("macaddress_unique", func(fl validator.FieldLevel) bool {
+	_ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
 		if isUpdate {
 			return true
 		}
-		var unique = true
-		if !(node.MacAddress == "") {
-			unique, _ = isMacAddressUnique(node.MacAddress, node.Network)
-		}
 		isFieldUnique, _ := IsNodeIDUnique(node)
-		return isFieldUnique && unique
+		return isFieldUnique
 	})
 	_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
 		_, err := GetNetworkByNode(node)

+ 1 - 6
models/accessToken.go

@@ -1,7 +1,7 @@
 package models
 
 type AccessToken struct {
-	ServerConfig
+	APIConnString string `json:"apiconnstring"`
 	ClientConfig
 }
 
@@ -10,8 +10,3 @@ type ClientConfig struct {
 	Key        string `json:"key"`
 	LocalRange string `json:"localrange"`
 }
-
-type ServerConfig struct {
-	Server        string `json:"server"`
-	APIConnString string `json:"apiconnstring"`
-}

+ 2 - 2
models/node.go

@@ -35,7 +35,7 @@ var seededRand *rand.Rand = rand.New(
 
 // Node - struct for node model
 type Node struct {
-	ID                  string   `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" validate:"required,min=5"`
+	ID                  string   `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" validate:"required,min=5" validate:"id_unique`
 	Address             string   `json:"address" bson:"address" yaml:"address" validate:"omitempty,ipv4"`
 	Address6            string   `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"`
 	LocalAddress        string   `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty,ip"`
@@ -56,7 +56,7 @@ type Node struct {
 	ExpirationDateTime  int64    `json:"expdatetime" bson:"expdatetime" yaml:"expdatetime"`
 	LastPeerUpdate      int64    `json:"lastpeerupdate" bson:"lastpeerupdate" yaml:"lastpeerupdate"`
 	LastCheckIn         int64    `json:"lastcheckin" bson:"lastcheckin" yaml:"lastcheckin"`
-	MacAddress          string   `json:"macaddress" bson:"macaddress" yaml:"macaddress" validate:"macaddress_unique"`
+	MacAddress          string   `json:"macaddress" bson:"macaddress" yaml:"macaddress"`
 	Password            string   `json:"password" bson:"password" yaml:"password" validate:"required,min=6"`
 	Network             string   `json:"network" bson:"network" yaml:"network" validate:"network_exists"`
 	IsRelayed           string   `json:"isrelayed" bson:"isrelayed" yaml:"isrelayed"`

+ 15 - 2
models/structs.go

@@ -190,6 +190,19 @@ type TrafficKeys struct {
 
 // NodeGet - struct for a single node get response
 type NodeGet struct {
-	Node  Node                 `json:"node" bson:"node" yaml:"node"`
-	Peers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"`
+	Node         Node                 `json:"node" bson:"node" yaml:"node"`
+	Peers        []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"`
+	ServerConfig ServerConfig         `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"`
+}
+
+// ServerConfig - struct for dealing with the server information for a netclient
+type ServerConfig struct {
+	CoreDNSAddr string `yaml:"corednsaddr"`
+	API         string `yaml:"apihost"`
+	APIPort     string `yaml:"apiport"`
+	ClientMode  string `yaml:"clientmode"`
+	DNSMode     string `yaml:"dnsmode"`
+	Version     string `yaml:"version"`
+	MQPort      string `yaml:"mqport"`
+	Server      string `yaml:"server"`
 }

+ 31 - 22
netclient/config/config.go

@@ -25,21 +25,13 @@ var (
 
 // ClientConfig - struct for dealing with client configuration
 type ClientConfig struct {
-	Server          ServerConfig   `yaml:"server"`
-	Node            models.Node    `yaml:"node"`
-	NetworkSettings models.Network `yaml:"networksettings"`
-	Network         string         `yaml:"network"`
-	Daemon          string         `yaml:"daemon"`
-	OperatingSystem string         `yaml:"operatingsystem"`
-}
-
-// ServerConfig - struct for dealing with the server information for a netclient
-type ServerConfig struct {
-	CoreDNSAddr string `yaml:"corednsaddr"`
-	AccessKey   string `yaml:"accesskey"`
-	Server      string `yaml:"server"`
-	API         string `yaml:"api"`
-	Version     string `yaml:"version"`
+	Server          models.ServerConfig `yaml:"server"`
+	Node            models.Node         `yaml:"node"`
+	NetworkSettings models.Network      `yaml:"networksettings"`
+	Network         string              `yaml:"network"`
+	Daemon          string              `yaml:"daemon"`
+	OperatingSystem string              `yaml:"operatingsystem"`
+	AccessKey       string              `yaml:"accesskey"`
 }
 
 // RegisterRequest - struct for registation with netmaker server
@@ -54,6 +46,8 @@ type RegisterResponse struct {
 	CAPubKey   ed25519.PublicKey
 	Cert       x509.Certificate
 	CertPubKey ed25519.PublicKey
+	Broker     string
+	Port       string
 }
 
 // Write - writes the config of a client to disk
@@ -128,8 +122,8 @@ func (config *ClientConfig) ReadConfig() {
 	}
 }
 
-// ModConfig - overwrites the node inside client config on disk
-func ModConfig(node *models.Node) error {
+// ModNodeConfig - overwrites the node inside client config on disk
+func ModNodeConfig(node *models.Node) error {
 	network := node.Network
 	if network == "" {
 		return errors.New("no network provided")
@@ -148,6 +142,21 @@ func ModConfig(node *models.Node) error {
 	return Write(&modconfig, network)
 }
 
+// ModNodeConfig - overwrites the server settings inside client config on disk
+func ModServerConfig(scfg *models.ServerConfig, network string) error {
+	var modconfig ClientConfig
+	if FileExists(ncutils.GetNetclientPathSpecific() + "netconfig-" + network) {
+		useconfig, err := ReadConfig(network)
+		if err != nil {
+			return err
+		}
+		modconfig = *useconfig
+	}
+
+	modconfig.Server = (*scfg)
+	return Write(&modconfig, network)
+}
+
 // SaveBackup - saves a backup file of a given network
 func SaveBackup(network string) error {
 
@@ -196,12 +205,12 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) {
 		}
 		cfg.Network = accesstoken.ClientConfig.Network
 		cfg.Node.Network = accesstoken.ClientConfig.Network
-		cfg.Server.AccessKey = accesstoken.ClientConfig.Key
+		cfg.AccessKey = accesstoken.ClientConfig.Key
 		cfg.Node.LocalRange = accesstoken.ClientConfig.LocalRange
-		cfg.Server.Server = accesstoken.ServerConfig.Server
-		cfg.Server.API = accesstoken.ServerConfig.APIConnString
+		//cfg.Server.Server = accesstoken.ServerConfig.Server
+		cfg.Server.API = accesstoken.APIConnString
 		if c.String("key") != "" {
-			cfg.Server.AccessKey = c.String("key")
+			cfg.AccessKey = c.String("key")
 		}
 		if c.String("network") != "all" {
 			cfg.Network = c.String("network")
@@ -217,7 +226,7 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) {
 			cfg.Server.API = c.String("apiserver")
 		}
 	} else {
-		cfg.Server.AccessKey = c.String("key")
+		cfg.AccessKey = c.String("key")
 		cfg.Network = c.String("network")
 		cfg.Node.Network = c.String("network")
 		cfg.Node.LocalRange = c.String("localrange")

+ 36 - 0
netclient/functions/common.go

@@ -373,3 +373,39 @@ func Authenticate(cfg *config.ClientConfig) (string, error) {
 	token := tokenData["AuthToken"]
 	return token.(string), nil
 }
+
+// RegisterWithServer calls the register endpoint with privatekey and commonname - api returns ca and client certificate
+func SetServerInfo(cfg *config.ClientConfig) error {
+	cfg, err := config.ReadConfig(cfg.Network)
+	if err != nil {
+		return err
+	}
+	url := "https://" + cfg.Server.API + "/api/server/getserverinfo"
+	logger.Log(1, "server at "+url)
+
+	token, err := Authenticate(cfg)
+	if err != nil {
+		return err
+	}
+	response, err := API("", http.MethodGet, url, token)
+	if err != nil {
+		return err
+	}
+	if response.StatusCode != http.StatusOK {
+		return errors.New(response.Status)
+	}
+	var resp models.ServerConfig
+	if err := json.NewDecoder(response.Body).Decode(&resp); err != nil {
+		return errors.New("unmarshal cert error " + err.Error())
+	}
+
+	// set broker information on register
+	cfg.Server.Server = resp.Server
+	cfg.Server.MQPort = resp.MQPort
+
+	if err = config.ModServerConfig(&cfg.Server, cfg.Node.Network); err != nil {
+		logger.Log(0, "error overwriting config with broker information: "+err.Error())
+	}
+
+	return nil
+}

+ 17 - 13
netclient/functions/daemon.go

@@ -25,7 +25,6 @@ import (
 	"github.com/gravitl/netmaker/netclient/local"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/wireguard"
-	"github.com/gravitl/netmaker/servercfg"
 	ssl "github.com/gravitl/netmaker/tls"
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
@@ -210,7 +209,8 @@ func NewTLSConfig(server string) *tls.Config {
 func setupMQTT(cfg *config.ClientConfig, publish bool) (mqtt.Client, error) {
 	opts := mqtt.NewClientOptions()
 	server := cfg.Server.Server
-	opts.AddBroker("ssl://" + server + ":" + servercfg.GetMQPort())
+	port := cfg.Server.MQPort
+	opts.AddBroker("ssl://" + server + ":" + port)
 	opts.SetTLSConfig(NewTLSConfig(server))
 	opts.SetClientID(ncutils.MakeRandomString(23))
 	opts.SetDefaultPublishHandler(All)
@@ -248,26 +248,30 @@ func setupMQTT(cfg *config.ClientConfig, publish bool) (mqtt.Client, error) {
 		} else {
 			err = token.Error()
 		}
-		if err := checkBroker(cfg.Server.Server); err != nil {
+		if err := checkBroker(cfg.Server.Server, cfg.Server.MQPort); err != nil {
 			return nil, err
 		}
 		logger.Log(0, "could not connect to broker", cfg.Server.Server, err.Error())
 		if strings.Contains(err.Error(), "connectex") || strings.Contains(err.Error(), "connect timeout") {
-			logger.Log(0, "connection issue detected.. attempt connection with new certs")
-			key, err := ssl.ReadKey(ncutils.GetNetclientPath() + ncutils.GetSeparator() + "client.key")
-			if err != nil {
-				_, *key, err = ed25519.GenerateKey(rand.Reader)
-				if err != nil {
-					log.Fatal("could not generate new key")
-				}
-			}
-			RegisterWithServer(key, cfg)
-			daemon.Restart()
+			reRegisterWithServer(cfg)
 		}
 	}
 	return client, nil
 }
 
+func reRegisterWithServer(cfg *config.ClientConfig) {
+	logger.Log(0, "connection issue detected.. attempt connection with new certs and broker information")
+	key, err := ssl.ReadKey(ncutils.GetNetclientPath() + ncutils.GetSeparator() + "client.key")
+	if err != nil {
+		_, *key, err = ed25519.GenerateKey(rand.Reader)
+		if err != nil {
+			log.Fatal("could not generate new key")
+		}
+	}
+	RegisterWithServer(key, cfg)
+	daemon.Restart()
+}
+
 // publishes a message to server to update peers on this peer's behalf
 func publishSignal(nodeCfg *config.ClientConfig, signal byte) error {
 	if err := publish(nodeCfg, fmt.Sprintf("signal/%s", nodeCfg.Node.ID), []byte{signal}, 1); err != nil {

+ 12 - 3
netclient/functions/join.go

@@ -120,12 +120,12 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 	cfg.Node.Name = formatName(cfg.Node)
 	cfg.Node.OS = runtime.GOOS
 	cfg.Node.Version = ncutils.Version
-	cfg.Node.AccessKey = cfg.Server.AccessKey
+	cfg.Node.AccessKey = cfg.AccessKey
 	//not sure why this is needed ... setnode defaults should take care of this on server
 	cfg.Node.IPForwarding = "yes"
 	logger.Log(0, "joining "+cfg.Network+" at "+cfg.Server.API)
 	url := "https://" + cfg.Server.API + "/api/nodes/" + cfg.Network
-	response, err := API(cfg.Node, http.MethodPost, url, cfg.Server.AccessKey)
+	response, err := API(cfg.Node, http.MethodPost, url, cfg.AccessKey)
 	if err != nil {
 		return fmt.Errorf("error creating node %w", err)
 	}
@@ -144,6 +144,7 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 	if nodeGET.Peers == nil {
 		nodeGET.Peers = []wgtypes.PeerConfig{}
 	}
+
 	// safety check. If returned node from server is local, but not currently configured as local, set to local addr
 	if cfg.Node.IsLocal != "yes" && node.IsLocal == "yes" && node.LocalRange != "" {
 		node.LocalAddress, err = ncutils.GetLocalIP(node.LocalRange)
@@ -156,6 +157,7 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 		node.UDPHolePunch = "no"
 		cfg.Node.IsStatic = "yes"
 	}
+	cfg.Server = nodeGET.ServerConfig
 
 	err = wireguard.StorePrivKey(privateKey, cfg.Network)
 	if err != nil {
@@ -174,7 +176,11 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 	if !manualPort && (cfg.Node.UDPHolePunch == "no") {
 		setListenPort(cfg)
 	}
-	err = config.ModConfig(&cfg.Node)
+	err = config.ModNodeConfig(&cfg.Node)
+	if err != nil {
+		return err
+	}
+	err = config.ModServerConfig(&cfg.Server, node.Network)
 	if err != nil {
 		return err
 	}
@@ -190,6 +196,9 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 	if err := Register(cfg, privateKey); err != nil {
 		return err
 	}
+	if cfg.Server.Server == "" {
+		return errors.New("did not recieve broker address from registration")
+	}
 
 	_ = UpdateLocalListenPort(cfg)
 

+ 1 - 1
netclient/functions/localport.go

@@ -39,7 +39,7 @@ func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error {
 	} else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
 		logger.Log(1, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
 		nodeCfg.Node.LocalListenPort = localPort
-		err = config.ModConfig(&nodeCfg.Node)
+		err = config.ModNodeConfig(&nodeCfg.Node)
 		if err != nil {
 			return err
 		}

+ 1 - 1
netclient/functions/localport_freebsd.go

@@ -38,7 +38,7 @@ func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error {
 	} else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
 		logger.Log(1, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
 		nodeCfg.Node.LocalListenPort = localPort
-		err = config.ModConfig(&nodeCfg.Node)
+		err = config.ModNodeConfig(&nodeCfg.Node)
 		if err != nil {
 			return err
 		}

+ 13 - 5
netclient/functions/mqpublish.go

@@ -15,8 +15,8 @@ import (
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/netclient/auth"
 	"github.com/gravitl/netmaker/netclient/config"
+	"github.com/gravitl/netmaker/netclient/daemon"
 	"github.com/gravitl/netmaker/netclient/ncutils"
-	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/tls"
 )
 
@@ -108,6 +108,8 @@ func Hello(nodeCfg *config.ClientConfig) {
 		_, err := Pull(nodeCfg.Node.Network, true)
 		if err != nil {
 			logger.Log(0, "could not run pull on "+nodeCfg.Node.Network+", error: "+err.Error())
+		} else {
+			daemon.Restart()
 		}
 	}
 	logger.Log(3, "checkin for", nodeCfg.Network, "complete")
@@ -166,20 +168,26 @@ func checkCertExpiry(cfg *config.ClientConfig) error {
 	return nil
 }
 
-func checkBroker(broker string) error {
+func checkBroker(broker string, port string) error {
+	if broker == "" {
+		return errors.New("error: broker address is blank")
+	}
+	if port == "" {
+		return errors.New("error: broker port is blank")
+	}
 	_, err := net.LookupIP(broker)
 	if err != nil {
 		return errors.New("nslookup failed for broker ... check dns records")
 	}
 	pinger := ping.NewTCPing()
-	port, err := strconv.Atoi(servercfg.GetMQPort())
+	intPort, err := strconv.Atoi(port)
 	if err != nil {
-		port = 8883
+		logger.Log(1, "error converting port to int: "+err.Error())
 	}
 	pinger.SetTarget(&ping.Target{
 		Protocol: ping.TCP,
 		Host:     broker,
-		Port:     port,
+		Port:     intPort,
 		Counter:  3,
 		Interval: 1 * time.Second,
 		Timeout:  2 * time.Second,

+ 7 - 2
netclient/functions/pull.go

@@ -57,9 +57,13 @@ func Pull(network string, iface bool) (*models.Node, error) {
 	if nodeGET.Peers == nil {
 		nodeGET.Peers = []wgtypes.PeerConfig{}
 	}
-
+	if nodeGET.ServerConfig.API != "" && nodeGET.ServerConfig.MQPort != "" {
+		if err = config.ModServerConfig(&nodeGET.ServerConfig, resNode.Network); err != nil {
+			logger.Log(0, "unable to update server config: "+err.Error())
+		}
+	}
 	if iface {
-		if err = config.ModConfig(&resNode); err != nil {
+		if err = config.ModNodeConfig(&resNode); err != nil {
 			return nil, err
 		}
 		if err = wireguard.SetWGConfig(network, false, nodeGET.Peers[:]); err != nil {
@@ -78,5 +82,6 @@ func Pull(network string, iface bool) (*models.Node, error) {
 	if bkupErr != nil {
 		logger.Log(0, "unable to update backup file")
 	}
+
 	return &resNode, err
 }

+ 18 - 10
netclient/functions/register.go

@@ -16,12 +16,7 @@ import (
 
 // Register - the function responsible for registering with the server and acquiring certs
 func Register(cfg *config.ClientConfig, key string) error {
-	if cfg.Server.Server == "" {
-		return errors.New("no server provided")
-	}
-	if cfg.Server.AccessKey == "" {
-		return errors.New("no access key provided")
-	}
+
 	//generate new key if one doesn' exist
 	var private *ed25519.PrivateKey
 	var err error
@@ -50,10 +45,6 @@ func Register(cfg *config.ClientConfig, key string) error {
 
 // RegisterWithServer calls the register endpoint with privatekey and commonname - api returns ca and client certificate
 func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) error {
-	cfg, err := config.ReadConfig(cfg.Network)
-	if err != nil {
-		return err
-	}
 	data := config.RegisterRequest{
 		Key:        *private,
 		CommonName: tls.NewCName(cfg.Node.Name),
@@ -76,6 +67,23 @@ func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) e
 	if err := json.NewDecoder(response.Body).Decode(&resp); err != nil {
 		return errors.New("unmarshal cert error " + err.Error())
 	}
+
+	// set broker information on register
+	var modServer bool
+	if resp.Broker != "" && resp.Broker != cfg.Server.Server {
+		cfg.Server.Server = resp.Broker
+		modServer = true
+	}
+	if resp.Port != "" && resp.Port != cfg.Server.MQPort {
+		cfg.Server.MQPort = resp.Port
+		modServer = true
+	}
+	if modServer {
+		if err = config.ModServerConfig(&cfg.Server, cfg.Node.Network); err != nil {
+			logger.Log(0, "error overwriting config with broker information: "+err.Error())
+		}
+	}
+
 	//x509.Certificate.PublicKey is an interface so json encoding/decoding results in a string rather that []byte
 	//the pubkeys are included in the response so the values in the certificate can be updated appropriately
 	resp.CA.PublicKey = resp.CAPubKey

+ 2 - 3
netclient/gui/components/views/join.go

@@ -29,10 +29,9 @@ func GetJoinView() fyne.CanvasObject {
 		cfg.Network = accesstoken.ClientConfig.Network
 		cfg.Node.Network = accesstoken.ClientConfig.Network
 		cfg.Node.Name = ncutils.GetHostname()
-		cfg.Server.AccessKey = accesstoken.ClientConfig.Key
+		cfg.AccessKey = accesstoken.ClientConfig.Key
 		cfg.Node.LocalRange = accesstoken.ClientConfig.LocalRange
-		cfg.Server.Server = accesstoken.ServerConfig.Server
-		cfg.Server.API = accesstoken.ServerConfig.APIConnString
+		cfg.Server.API = accesstoken.APIConnString
 		err = functions.JoinNetwork(&cfg, "")
 		if err != nil {
 			ErrorNotify("Failed to join " + cfg.Network + "!")

+ 18 - 2
servercfg/serverconf.go

@@ -10,6 +10,7 @@ import (
 	"time"
 
 	"github.com/gravitl/netmaker/config"
+	"github.com/gravitl/netmaker/models"
 )
 
 var (
@@ -33,14 +34,12 @@ func GetServerConfig() config.ServerConfig {
 	cfg.CoreDNSAddr = GetCoreDNSAddr()
 	cfg.APIHost = GetAPIHost()
 	cfg.APIPort = GetAPIPort()
-	cfg.APIPort = GetAPIPort()
 	cfg.MQPort = GetMQPort()
 	cfg.MasterKey = "(hidden)"
 	cfg.DNSKey = "(hidden)"
 	cfg.AllowedOrigin = GetAllowedOrigin()
 	cfg.RestBackend = "off"
 	cfg.NodeID = GetNodeID()
-	cfg.MQPort = GetMQPort()
 	if IsRestBackend() {
 		cfg.RestBackend = "on"
 	}
@@ -89,6 +88,23 @@ func GetServerConfig() config.ServerConfig {
 	return cfg
 }
 
+// GetServerConfig - gets the server config into memory from file or env
+func GetServerInfo() models.ServerConfig {
+	var cfg models.ServerConfig
+	cfg.API = GetAPIConnString()
+	cfg.CoreDNSAddr = GetCoreDNSAddr()
+	cfg.APIPort = GetAPIPort()
+	cfg.MQPort = GetMQPort()
+	cfg.DNSMode = "off"
+	if IsDNSMode() {
+		cfg.DNSMode = "on"
+	}
+	cfg.Version = GetVersion()
+	cfg.Server = GetServer()
+
+	return cfg
+}
+
 // GetFrontendURL - gets the frontend url
 func GetFrontendURL() string {
 	var frontend = ""

+ 5 - 3
serverctl/serverctl.go

@@ -79,9 +79,11 @@ func SyncServerNetwork(network string) error {
 			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())
-			}
+			/*
+				if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
+					logger.Log(1, "error adding network", serverNetworkSettings.NetID, "during sync:", err.Error())
+				}
+			*/
 		}
 	}
 	return nil