mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-06 13:14:24 +08:00
refactoring servercfg
This commit is contained in:
parent
c0070a1bd2
commit
8d422526b3
17 changed files with 100 additions and 94 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"`
|
||||
}
|
||||
|
|
|
@ -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"`
|
||||
|
|
|
@ -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"`
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue