Browse Source

refactoring serverinfo logic

afeiszli 3 years ago
parent
commit
e4189ad8bd

+ 23 - 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,38 @@ 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)
+	scfg := servercfg.GetServerInfo()
+	returnConf := config.ServerConfig{
+		CoreDNSAddr: scfg.CoreDNSAddr,
+		API:         scfg.APIConnString,
+		APIPort:     scfg.APIPort,
+		ClientMode:  scfg.ClientMode,
+		DNSMode:     scfg.DNSMode,
+		Version:     scfg.Version,
+		MQPort:      scfg.MQPort,
+		Server:      scfg.Server,
+	}
+
+	json.NewEncoder(w).Encode(returnConf)
 	//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) {

+ 7 - 4
netclient/config/config.go

@@ -36,11 +36,14 @@ type ClientConfig struct {
 // 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"`
-	BrokerPort  string `yaml:"brokerport"`
-	API         string `yaml:"api"`
+	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"`
+	AccessKey   string `yaml:"accesskey"`
 }
 
 // RegisterRequest - struct for registation with netmaker server

+ 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 config.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.Write(cfg, cfg.Node.Network); err != nil {
+		logger.Log(0, "error overwriting config with broker information: "+err.Error())
+	}
+
+	return nil
+}

+ 7 - 4
netclient/functions/daemon.go

@@ -208,11 +208,14 @@ func NewTLSConfig(server string) *tls.Config {
 // this function is primarily used to create a connection to publish to the broker
 func setupMQTT(cfg *config.ClientConfig, publish bool) (mqtt.Client, error) {
 	opts := mqtt.NewClientOptions()
-	if cfg.Server.Server == "" || cfg.Server.BrokerPort == "" {
-		reRegisterWithServer(cfg)
+	if cfg.Server.Server == "" || cfg.Server.MQPort == "" {
+		logger.Log(0, "server info looks incomplete - broker="+cfg.Server.Server+", port="+cfg.Server.MQPort+" - pulling latest server details")
+		if err := SetServerInfo(cfg); err != nil {
+			logger.Log(0, "error pulling server info: "+err.Error())
+		}
 	}
 	server := cfg.Server.Server
-	port := cfg.Server.BrokerPort
+	port := cfg.Server.MQPort
 	opts.AddBroker("ssl://" + server + ":" + port)
 	opts.SetTLSConfig(NewTLSConfig(server))
 	opts.SetClientID(ncutils.MakeRandomString(23))
@@ -251,7 +254,7 @@ func setupMQTT(cfg *config.ClientConfig, publish bool) (mqtt.Client, error) {
 		} else {
 			err = token.Error()
 		}
-		if err := checkBroker(cfg.Server.Server, cfg.Server.BrokerPort); 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())

+ 4 - 0
netclient/functions/pull.go

@@ -78,5 +78,9 @@ func Pull(network string, iface bool) (*models.Node, error) {
 	if bkupErr != nil {
 		logger.Log(0, "unable to update backup file")
 	}
+	if err = SetServerInfo(cfg); err != nil {
+		logger.Log(0, "error pulling server info: "+err.Error())
+	}
+
 	return &resNode, err
 }

+ 5 - 11
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
@@ -45,15 +40,14 @@ func Register(cfg *config.ClientConfig, key string) error {
 	} else if err != nil {
 		return err
 	}
+	if cfg.Server.Server == "" || cfg.Server.MQPort == "" {
+		return SetServerInfo(cfg)
+	}
 	return nil
 }
 
 // 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),
@@ -79,7 +73,7 @@ func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) e
 
 	// set broker information on register
 	cfg.Server.Server = resp.Broker
-	cfg.Server.BrokerPort = resp.Port
+	cfg.Server.MQPort = resp.Port
 	if err = config.Write(cfg, cfg.Node.Network); err != nil {
 		logger.Log(0, "error overwriting config with broker information: "+err.Error())
 	}

+ 18 - 2
servercfg/serverconf.go

@@ -33,14 +33,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 +87,24 @@ func GetServerConfig() config.ServerConfig {
 	return cfg
 }
 
+// GetServerConfig - gets the server config into memory from file or env
+func GetServerInfo() config.ServerConfig {
+	var cfg config.ServerConfig
+	cfg.APIConnString = GetAPIConnString()
+	cfg.CoreDNSAddr = GetCoreDNSAddr()
+	cfg.APIHost = GetAPIHost()
+	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 = ""