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/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")

View file

@ -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

View file

@ -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
}

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
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())

View file

@ -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
}

View file

@ -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())
}

View file

@ -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 = ""