refactoring serverinfo logic

This commit is contained in:
afeiszli
2022-05-31 08:42:12 -04:00
parent 46b2cfef1c
commit e4189ad8bd
7 changed files with 100 additions and 40 deletions

View File

@@ -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/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/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/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 //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"]) 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) { func getConfig(w http.ResponseWriter, r *http.Request) {
// Set header // Set header
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
@@ -92,25 +115,6 @@ func getConfig(w http.ResponseWriter, r *http.Request) {
//w.WriteHeader(http.StatusOK) //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 // register - registers a client with the server and return the CA and cert
func register(w http.ResponseWriter, r *http.Request) { func register(w http.ResponseWriter, r *http.Request) {
logger.Log(2, "processing registration request") logger.Log(2, "processing registration request")

View File

@@ -36,11 +36,14 @@ type ClientConfig struct {
// ServerConfig - struct for dealing with the server information for a netclient // ServerConfig - struct for dealing with the server information for a netclient
type ServerConfig struct { type ServerConfig struct {
CoreDNSAddr string `yaml:"corednsaddr"` CoreDNSAddr string `yaml:"corednsaddr"`
AccessKey string `yaml:"accesskey"` API string `yaml:"apihost"`
Server string `yaml:"server"` APIPort string `yaml:"apiport"`
BrokerPort string `yaml:"brokerport"` ClientMode string `yaml:"clientmode"`
API string `yaml:"api"` DNSMode string `yaml:"dnsmode"`
Version string `yaml:"version"` Version string `yaml:"version"`
MQPort string `yaml:"mqport"`
Server string `yaml:"server"`
AccessKey string `yaml:"accesskey"`
} }
// RegisterRequest - struct for registation with netmaker server // RegisterRequest - struct for registation with netmaker server

View File

@@ -373,3 +373,39 @@ func Authenticate(cfg *config.ClientConfig) (string, error) {
token := tokenData["AuthToken"] token := tokenData["AuthToken"]
return token.(string), nil 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
}

View File

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

View File

@@ -78,5 +78,9 @@ func Pull(network string, iface bool) (*models.Node, error) {
if bkupErr != nil { if bkupErr != nil {
logger.Log(0, "unable to update backup file") 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 return &resNode, err
} }

View File

@@ -16,12 +16,7 @@ import (
// Register - the function responsible for registering with the server and acquiring certs // Register - the function responsible for registering with the server and acquiring certs
func Register(cfg *config.ClientConfig, key string) error { 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 //generate new key if one doesn' exist
var private *ed25519.PrivateKey var private *ed25519.PrivateKey
var err error var err error
@@ -45,15 +40,14 @@ func Register(cfg *config.ClientConfig, key string) error {
} else if err != nil { } else if err != nil {
return err return err
} }
if cfg.Server.Server == "" || cfg.Server.MQPort == "" {
return SetServerInfo(cfg)
}
return nil return nil
} }
// RegisterWithServer calls the register endpoint with privatekey and commonname - api returns ca and client certificate // RegisterWithServer calls the register endpoint with privatekey and commonname - api returns ca and client certificate
func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) error { func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) error {
cfg, err := config.ReadConfig(cfg.Network)
if err != nil {
return err
}
data := config.RegisterRequest{ data := config.RegisterRequest{
Key: *private, Key: *private,
CommonName: tls.NewCName(cfg.Node.Name), CommonName: tls.NewCName(cfg.Node.Name),
@@ -79,7 +73,7 @@ func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) e
// set broker information on register // set broker information on register
cfg.Server.Server = resp.Broker 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 { if err = config.Write(cfg, cfg.Node.Network); err != nil {
logger.Log(0, "error overwriting config with broker information: "+err.Error()) logger.Log(0, "error overwriting config with broker information: "+err.Error())
} }

View File

@@ -33,14 +33,12 @@ func GetServerConfig() config.ServerConfig {
cfg.CoreDNSAddr = GetCoreDNSAddr() cfg.CoreDNSAddr = GetCoreDNSAddr()
cfg.APIHost = GetAPIHost() cfg.APIHost = GetAPIHost()
cfg.APIPort = GetAPIPort() cfg.APIPort = GetAPIPort()
cfg.APIPort = GetAPIPort()
cfg.MQPort = GetMQPort() cfg.MQPort = GetMQPort()
cfg.MasterKey = "(hidden)" cfg.MasterKey = "(hidden)"
cfg.DNSKey = "(hidden)" cfg.DNSKey = "(hidden)"
cfg.AllowedOrigin = GetAllowedOrigin() cfg.AllowedOrigin = GetAllowedOrigin()
cfg.RestBackend = "off" cfg.RestBackend = "off"
cfg.NodeID = GetNodeID() cfg.NodeID = GetNodeID()
cfg.MQPort = GetMQPort()
if IsRestBackend() { if IsRestBackend() {
cfg.RestBackend = "on" cfg.RestBackend = "on"
} }
@@ -89,6 +87,24 @@ func GetServerConfig() config.ServerConfig {
return cfg 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 // GetFrontendURL - gets the frontend url
func GetFrontendURL() string { func GetFrontendURL() string {
var frontend = "" var frontend = ""