Browse Source

Merge pull request #2090 from gravitl/story/GRA-1225

Story/gra 1225
dcarns 2 years ago
parent
commit
f982f60d12

+ 1 - 1
compose/docker-compose-emqx.yml

@@ -13,7 +13,7 @@ services:
       BROKER_TYPE: "emqx"
       BROKER_TYPE: "emqx"
       EMQX_REST_ENDPOINT: "http://mq:18083"
       EMQX_REST_ENDPOINT: "http://mq:18083"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
-      STUN_DOMAIN: "stun.NETMAKER_BASE_DOMAIN"
+      STUN_LIST: "stun.NETMAKER_BASE_DOMAIN:3478,stun1.netmaker.io:3478,stun2.netmaker.io:3478,stun1.l.google.com:19302,stun2.l.google.com:19302"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"

+ 1 - 1
compose/docker-compose.ee.yml

@@ -13,7 +13,7 @@ services:
       BROKER_TYPE: "emqx"
       BROKER_TYPE: "emqx"
       EMQX_REST_ENDPOINT: "http://mq:18083"
       EMQX_REST_ENDPOINT: "http://mq:18083"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
-      STUN_DOMAIN: "stun.NETMAKER_BASE_DOMAIN"
+      STUN_LIST: "stun.NETMAKER_BASE_DOMAIN:3478,stun1.netmaker.io:3478,stun2.netmaker.io:3478,stun1.l.google.com:19302,stun2.l.google.com:19302"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"

+ 1 - 2
compose/docker-compose.yml

@@ -11,7 +11,7 @@ services:
     environment:
     environment:
       BROKER_ENDPOINT: "wss://broker.NETMAKER_BASE_DOMAIN"
       BROKER_ENDPOINT: "wss://broker.NETMAKER_BASE_DOMAIN"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
       SERVER_NAME: "NETMAKER_BASE_DOMAIN"
-      STUN_DOMAIN: "stun.NETMAKER_BASE_DOMAIN"
+      STUN_LIST: "stun.NETMAKER_BASE_DOMAIN:3478,stun1.netmaker.io:3478,stun2.netmaker.io:3478,stun1.l.google.com:19302,stun2.l.google.com:19302"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_HOST: "SERVER_PUBLIC_IP"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"
@@ -24,7 +24,6 @@ services:
       DATABASE: "sqlite"
       DATABASE: "sqlite"
       NODE_ID: "netmaker-server-1"
       NODE_ID: "netmaker-server-1"
       SERVER_BROKER_ENDPOINT: "ws://mq:1883"
       SERVER_BROKER_ENDPOINT: "ws://mq:1883"
-      STUN_PORT: "3478"      
       VERBOSITY: "1"
       VERBOSITY: "1"
       MQ_PASSWORD: "REPLACE_MQ_PASSWORD"
       MQ_PASSWORD: "REPLACE_MQ_PASSWORD"
       MQ_USERNAME: "REPLACE_MQ_USERNAME"
       MQ_USERNAME: "REPLACE_MQ_USERNAME"

+ 42 - 42
config/config.go

@@ -32,48 +32,48 @@ type EnvironmentConfig struct {
 
 
 // ServerConfig - server conf struct
 // ServerConfig - server conf struct
 type ServerConfig struct {
 type ServerConfig struct {
-	CoreDNSAddr           string `yaml:"corednsaddr"`
-	APIConnString         string `yaml:"apiconn"`
-	APIHost               string `yaml:"apihost"`
-	APIPort               string `yaml:"apiport"`
-	Broker                string `yam:"broker"`
-	ServerBrokerEndpoint  string `yaml:"serverbrokerendpoint"`
-	BrokerType            string `yaml:"brokertype"`
-	EmqxRestEndpoint      string `yaml:"emqxrestendpoint"`
-	MasterKey             string `yaml:"masterkey"`
-	DNSKey                string `yaml:"dnskey"`
-	AllowedOrigin         string `yaml:"allowedorigin"`
-	NodeID                string `yaml:"nodeid"`
-	RestBackend           string `yaml:"restbackend"`
-	MessageQueueBackend   string `yaml:"messagequeuebackend"`
-	DNSMode               string `yaml:"dnsmode"`
-	DisableRemoteIPCheck  string `yaml:"disableremoteipcheck"`
-	Version               string `yaml:"version"`
-	SQLConn               string `yaml:"sqlconn"`
-	Platform              string `yaml:"platform"`
-	Database              string `yaml:"database"`
-	Verbosity             int32  `yaml:"verbosity"`
-	AuthProvider          string `yaml:"authprovider"`
-	OIDCIssuer            string `yaml:"oidcissuer"`
-	ClientID              string `yaml:"clientid"`
-	ClientSecret          string `yaml:"clientsecret"`
-	FrontendURL           string `yaml:"frontendurl"`
-	DisplayKeys           string `yaml:"displaykeys"`
-	AzureTenant           string `yaml:"azuretenant"`
-	Telemetry             string `yaml:"telemetry"`
-	HostNetwork           string `yaml:"hostnetwork"`
-	Server                string `yaml:"server"`
-	PublicIPService       string `yaml:"publicipservice"`
-	MQPassword            string `yaml:"mqpassword"`
-	MQUserName            string `yaml:"mqusername"`
-	MetricsExporter       string `yaml:"metrics_exporter"`
-	BasicAuth             string `yaml:"basic_auth"`
-	LicenseValue          string `yaml:"license_value"`
-	NetmakerAccountID     string `yaml:"netmaker_account_id"`
-	IsEE                  string `yaml:"is_ee"`
-	StunPort              int    `yaml:"stun_port"`
-	StunHost              string `yaml:"stun_host"`
-	Proxy                 string `yaml:"proxy"`
+	CoreDNSAddr          string `yaml:"corednsaddr"`
+	APIConnString        string `yaml:"apiconn"`
+	APIHost              string `yaml:"apihost"`
+	APIPort              string `yaml:"apiport"`
+	Broker               string `yam:"broker"`
+	ServerBrokerEndpoint string `yaml:"serverbrokerendpoint"`
+	BrokerType           string `yaml:"brokertype"`
+	EmqxRestEndpoint     string `yaml:"emqxrestendpoint"`
+	MasterKey            string `yaml:"masterkey"`
+	DNSKey               string `yaml:"dnskey"`
+	AllowedOrigin        string `yaml:"allowedorigin"`
+	NodeID               string `yaml:"nodeid"`
+	RestBackend          string `yaml:"restbackend"`
+	MessageQueueBackend  string `yaml:"messagequeuebackend"`
+	DNSMode              string `yaml:"dnsmode"`
+	DisableRemoteIPCheck string `yaml:"disableremoteipcheck"`
+	Version              string `yaml:"version"`
+	SQLConn              string `yaml:"sqlconn"`
+	Platform             string `yaml:"platform"`
+	Database             string `yaml:"database"`
+	Verbosity            int32  `yaml:"verbosity"`
+	AuthProvider         string `yaml:"authprovider"`
+	OIDCIssuer           string `yaml:"oidcissuer"`
+	ClientID             string `yaml:"clientid"`
+	ClientSecret         string `yaml:"clientsecret"`
+	FrontendURL          string `yaml:"frontendurl"`
+	DisplayKeys          string `yaml:"displaykeys"`
+	AzureTenant          string `yaml:"azuretenant"`
+	Telemetry            string `yaml:"telemetry"`
+	HostNetwork          string `yaml:"hostnetwork"`
+	Server               string `yaml:"server"`
+	PublicIPService      string `yaml:"publicipservice"`
+	MQPassword           string `yaml:"mqpassword"`
+	MQUserName           string `yaml:"mqusername"`
+	MetricsExporter      string `yaml:"metrics_exporter"`
+	BasicAuth            string `yaml:"basic_auth"`
+	LicenseValue         string `yaml:"license_value"`
+	NetmakerAccountID    string `yaml:"netmaker_account_id"`
+	IsEE                 string `yaml:"is_ee"`
+	StunPort             int    `yaml:"stun_port"`
+	StunList             string `yaml:"stun_list"`
+	Proxy                string `yaml:"proxy"`
 }
 }
 
 
 // SQLConfig - Generic SQL Config
 // SQLConfig - Generic SQL Config

+ 20 - 14
models/structs.go

@@ -223,20 +223,20 @@ type NodeJoinResponse 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"`
-	API         string `yaml:"api"`
-	APIPort     string `yaml:"apiport"`
-	DNSMode     string `yaml:"dnsmode"`
-	Version     string `yaml:"version"`
-	MQPort      string `yaml:"mqport"`
-	MQUserName  string `yaml:"mq_username"`
-	MQPassword  string `yaml:"mq_password"`
-	Server      string `yaml:"server"`
-	Broker      string `yaml:"broker"`
-	Is_EE       bool   `yaml:"isee"`
-	StunPort    int    `yaml:"stun_port"`
-	StunHost    string `yaml:"stun_host"`
-	TrafficKey  []byte `yaml:"traffickey"`
+	CoreDNSAddr string       `yaml:"corednsaddr"`
+	API         string       `yaml:"api"`
+	APIPort     string       `yaml:"apiport"`
+	DNSMode     string       `yaml:"dnsmode"`
+	Version     string       `yaml:"version"`
+	MQPort      string       `yaml:"mqport"`
+	MQUserName  string       `yaml:"mq_username"`
+	MQPassword  string       `yaml:"mq_password"`
+	Server      string       `yaml:"server"`
+	Broker      string       `yaml:"broker"`
+	Is_EE       bool         `yaml:"isee"`
+	StunPort    int          `yaml:"stun_port"`
+	StunList    []StunServer `yaml:"stun_list"`
+	TrafficKey  []byte       `yaml:"traffickey"`
 }
 }
 
 
 // User.NameInCharset - returns if name is in charset below or not
 // User.NameInCharset - returns if name is in charset below or not
@@ -261,3 +261,9 @@ type JoinData struct {
 	Node Node   `json:"node" yaml:"node"`
 	Node Node   `json:"node" yaml:"node"`
 	Key  string `json:"key" yaml:"key"`
 	Key  string `json:"key" yaml:"key"`
 }
 }
+
+// StunServer - struct to hold data required for using stun server
+type StunServer struct {
+	Domain string `json:"domain" yaml:"domain"`
+	Port   int    `json:"port" yaml:"port"`
+}

+ 71 - 10
servercfg/serverconf.go

@@ -43,7 +43,6 @@ func GetServerConfig() config.ServerConfig {
 	cfg.AllowedOrigin = GetAllowedOrigin()
 	cfg.AllowedOrigin = GetAllowedOrigin()
 	cfg.RestBackend = "off"
 	cfg.RestBackend = "off"
 	cfg.NodeID = GetNodeID()
 	cfg.NodeID = GetNodeID()
-	cfg.StunHost = GetStunAddr()
 	cfg.StunPort = GetStunPort()
 	cfg.StunPort = GetStunPort()
 	cfg.BrokerType = GetBrokerType()
 	cfg.BrokerType = GetBrokerType()
 	cfg.EmqxRestEndpoint = GetEmqxRestEndpoint()
 	cfg.EmqxRestEndpoint = GetEmqxRestEndpoint()
@@ -74,6 +73,7 @@ func GetServerConfig() config.ServerConfig {
 	cfg.FrontendURL = GetFrontendURL()
 	cfg.FrontendURL = GetFrontendURL()
 	cfg.Telemetry = Telemetry()
 	cfg.Telemetry = Telemetry()
 	cfg.Server = GetServer()
 	cfg.Server = GetServer()
+	cfg.StunList = GetStunListString()
 	cfg.Verbosity = GetVerbosity()
 	cfg.Verbosity = GetVerbosity()
 	cfg.IsEE = "no"
 	cfg.IsEE = "no"
 	if Is_EE {
 	if Is_EE {
@@ -99,8 +99,8 @@ func GetServerInfo() models.ServerConfig {
 	}
 	}
 	cfg.Version = GetVersion()
 	cfg.Version = GetVersion()
 	cfg.Is_EE = Is_EE
 	cfg.Is_EE = Is_EE
-	cfg.StunHost = GetStunAddr()
 	cfg.StunPort = GetStunPort()
 	cfg.StunPort = GetStunPort()
+	cfg.StunList = GetStunList()
 
 
 	return cfg
 	return cfg
 }
 }
@@ -177,15 +177,44 @@ func GetAPIPort() string {
 	return apiport
 	return apiport
 }
 }
 
 
-// GetStunAddr - gets the stun host address
-func GetStunAddr() string {
-	stunAddr := ""
-	if os.Getenv("STUN_DOMAIN") != "" {
-		stunAddr = os.Getenv("STUN_DOMAIN")
-	} else if config.Config.Server.StunHost != "" {
-		stunAddr = config.Config.Server.StunHost
+// GetStunList - gets the stun servers
+func GetStunList() []models.StunServer {
+	stunList := []models.StunServer{
+		models.StunServer{
+			Domain: "stun1.netmaker.io",
+			Port:   3478,
+		},
+		models.StunServer{
+			Domain: "stun2.netmaker.io",
+			Port:   3478,
+		},
+	}
+	parsed := false
+	if os.Getenv("STUN_LIST") != "" {
+		stuns, err := parseStunList(os.Getenv("STUN_LIST"))
+		if err == nil {
+			parsed = true
+			stunList = stuns
+		}
+	}
+	if !parsed && config.Config.Server.StunList != "" {
+		stuns, err := parseStunList(config.Config.Server.StunList)
+		if err == nil {
+			stunList = stuns
+		}
 	}
 	}
-	return stunAddr
+	return stunList
+}
+
+// GetStunList - gets the stun servers w/o parsing to struct
+func GetStunListString() string {
+	stunList := "stun1.netmaker.io:3478,stun2.netmaker.io:3478"
+	if os.Getenv("STUN_LIST") != "" {
+		stunList = os.Getenv("STUN_LIST")
+	} else if config.Config.Server.StunList != "" {
+		stunList = config.Config.Server.StunList
+	}
+	return stunList
 }
 }
 
 
 // GetCoreDNSAddr - gets the core dns address
 // GetCoreDNSAddr - gets the core dns address
@@ -582,6 +611,7 @@ func GetNetmakerAccountID() string {
 	return netmakerAccountID
 	return netmakerAccountID
 }
 }
 
 
+// GetStunPort - Get the port to run the stun server on
 func GetStunPort() int {
 func GetStunPort() int {
 	port := 3478 //default
 	port := 3478 //default
 	if os.Getenv("STUN_PORT") != "" {
 	if os.Getenv("STUN_PORT") != "" {
@@ -595,6 +625,7 @@ func GetStunPort() int {
 	return port
 	return port
 }
 }
 
 
+// IsProxyEnabled - is proxy on or off
 func IsProxyEnabled() bool {
 func IsProxyEnabled() bool {
 	var enabled = false //default
 	var enabled = false //default
 	if os.Getenv("PROXY") != "" {
 	if os.Getenv("PROXY") != "" {
@@ -604,3 +635,33 @@ func IsProxyEnabled() bool {
 	}
 	}
 	return enabled
 	return enabled
 }
 }
+
+// parseStunList - turn string into slice of StunServers
+func parseStunList(stunString string) ([]models.StunServer, error) {
+	var err error
+	stunServers := []models.StunServer{}
+	stuns := strings.Split(stunString, ",")
+	if len(stuns) == 0 {
+		return stunServers, errors.New("no stun servers provided")
+	}
+	for _, stun := range stuns {
+		stun = strings.Trim(stun, " ")
+		stunInfo := strings.Split(stun, ":")
+		if len(stunInfo) != 2 {
+			continue
+		}
+		port, err := strconv.Atoi(stunInfo[1])
+		if err != nil || port == 0 {
+			continue
+		}
+		stunServers = append(stunServers, models.StunServer{
+			Domain: stunInfo[0],
+			Port:   port,
+		})
+
+	}
+	if len(stunServers) == 0 {
+		err = errors.New("no stun entries parsable")
+	}
+	return stunServers, err
+}