diff --git a/controllers/server.go b/controllers/server.go index 638eed98..b6b06161 100644 --- a/controllers/server.go +++ b/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,6 +82,28 @@ func removeNetwork(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode("Server removed from network " + params["network"]) } +func getServerInfo(w http.ResponseWriter, r *http.Request) { + // Set header + w.Header().Set("Content-Type", "application/json") + + // get params + + 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 getConfig(w http.ResponseWriter, r *http.Request) { // Set header w.Header().Set("Content-Type", "application/json") @@ -92,25 +115,6 @@ func getConfig(w http.ResponseWriter, r *http.Request) { //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"]) - -// if err != nil || !success { -// json.NewEncoder(w).Encode("Could not add server to network " + params["network"]) -// return -// } - -// json.NewEncoder(w).Encode("Server added to network " + params["network"]) -// } - // register - registers a client with the server and return the CA and cert func register(w http.ResponseWriter, r *http.Request) { logger.Log(2, "processing registration request") diff --git a/netclient/config/config.go b/netclient/config/config.go index 3fe360f4..a3d7a555 100644 --- a/netclient/config/config.go +++ b/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 diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 2386eacc..083f03ca 100644 --- a/netclient/functions/common.go +++ b/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 +} diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index a35b10c5..f3480f24 100644 --- a/netclient/functions/daemon.go +++ b/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()) diff --git a/netclient/functions/pull.go b/netclient/functions/pull.go index d5d75e29..ee6b9078 100644 --- a/netclient/functions/pull.go +++ b/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 } diff --git a/netclient/functions/register.go b/netclient/functions/register.go index 2da92cb6..79c3491e 100644 --- a/netclient/functions/register.go +++ b/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()) } diff --git a/servercfg/serverconf.go b/servercfg/serverconf.go index 00754a6d..fce15ee6 100644 --- a/servercfg/serverconf.go +++ b/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 = ""