refactoring servercfg

This commit is contained in:
afeiszli 2022-05-31 12:07:56 -04:00
parent c0070a1bd2
commit 8d422526b3
17 changed files with 100 additions and 94 deletions

View file

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

View file

@ -88,19 +88,7 @@ func getServerInfo(w http.ResponseWriter, r *http.Request) {
// 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)
json.NewEncoder(w).Encode(servercfg.GetServerInfo())
//w.WriteHeader(http.StatusOK)
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -25,25 +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"`
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"`
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
@ -134,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")
@ -154,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 {
@ -202,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.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")
@ -223,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")

View file

@ -394,7 +394,7 @@ func SetServerInfo(cfg *config.ClientConfig) error {
if response.StatusCode != http.StatusOK {
return errors.New(response.Status)
}
var resp config.ServerConfig
var resp models.ServerConfig
if err := json.NewDecoder(response.Body).Decode(&resp); err != nil {
return errors.New("unmarshal cert error " + err.Error())
}
@ -403,7 +403,7 @@ func SetServerInfo(cfg *config.ClientConfig) error {
cfg.Server.Server = resp.Server
cfg.Server.MQPort = resp.MQPort
if err = config.Write(cfg, cfg.Node.Network); err != nil {
if err = config.ModServerConfig(&cfg.Server, cfg.Node.Network); err != nil {
logger.Log(0, "error overwriting config with broker information: "+err.Error())
}

View file

@ -208,12 +208,6 @@ 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.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.MQPort
opts.AddBroker("ssl://" + server + ":" + port)

View file

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

View file

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

View file

@ -15,6 +15,7 @@ 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/tls"
)
@ -107,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")

View file

@ -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,9 +82,6 @@ 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

@ -40,9 +40,6 @@ 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
}
@ -72,10 +69,19 @@ func RegisterWithServer(private *ed25519.PrivateKey, cfg *config.ClientConfig) e
}
// set broker information on register
cfg.Server.Server = resp.Broker
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())
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

View file

@ -10,6 +10,7 @@ import (
"time"
"github.com/gravitl/netmaker/config"
"github.com/gravitl/netmaker/models"
)
var (
@ -88,11 +89,10 @@ func GetServerConfig() config.ServerConfig {
}
// GetServerConfig - gets the server config into memory from file or env
func GetServerInfo() config.ServerConfig {
var cfg config.ServerConfig
cfg.APIConnString = GetAPIConnString()
func GetServerInfo() models.ServerConfig {
var cfg models.ServerConfig
cfg.API = GetAPIConnString()
cfg.CoreDNSAddr = GetCoreDNSAddr()
cfg.APIHost = GetAPIHost()
cfg.APIPort = GetAPIPort()
cfg.MQPort = GetMQPort()
cfg.DNSMode = "off"

View file

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