| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540 | package servercfgimport (	"errors"	"io"	"net"	"net/http"	"os"	"strconv"	"strings"	"github.com/gravitl/netmaker/config")// SetHost - sets the host ipfunc SetHost() error {	remoteip, err := GetPublicIP()	if err != nil {		return err	}	os.Setenv("SERVER_HOST", remoteip)	return nil}// GetServerConfig - gets the server config into memory from file or envfunc GetServerConfig() config.ServerConfig {	var cfg config.ServerConfig	cfg.APIConnString = GetAPIConnString()	cfg.CoreDNSAddr = GetCoreDNSAddr()	cfg.APIHost = GetAPIHost()	cfg.APIPort = GetAPIPort()	cfg.GRPCConnString = GetGRPCConnString()	cfg.GRPCHost = GetGRPCHost()	cfg.GRPCPort = GetGRPCPort()	cfg.MasterKey = "(hidden)"	cfg.DNSKey = "(hidden)"	cfg.AllowedOrigin = GetAllowedOrigin()	cfg.RestBackend = "off"	cfg.NodeID = GetNodeID()	cfg.CheckinInterval = GetCheckinInterval()	cfg.ServerCheckinInterval = GetServerCheckinInterval()	if IsRestBackend() {		cfg.RestBackend = "on"	}	cfg.AgentBackend = "off"	if IsAgentBackend() {		cfg.AgentBackend = "on"	}	cfg.ClientMode = "off"	if IsClientMode() != "off" {		cfg.ClientMode = IsClientMode()	}	cfg.DNSMode = "off"	if IsDNSMode() {		cfg.DNSMode = "on"	}	cfg.DisplayKeys = "off"	if IsDisplayKeys() {		cfg.DisplayKeys = "on"	}	cfg.GRPCSSL = "off"	if IsGRPCSSL() {		cfg.GRPCSSL = "on"	}	cfg.DisableRemoteIPCheck = "off"	if DisableRemoteIPCheck() {		cfg.DisableRemoteIPCheck = "on"	}	cfg.DisableDefaultNet = "off"	if DisableDefaultNet() {		cfg.DisableRemoteIPCheck = "on"	}	cfg.Database = GetDB()	cfg.Platform = GetPlatform()	cfg.Version = GetVersion()	// == auth config ==	var authInfo = GetAuthProviderInfo()	cfg.AuthProvider = authInfo[0]	cfg.ClientID = authInfo[1]	cfg.ClientSecret = authInfo[2]	cfg.FrontendURL = GetFrontendURL()	if GetRce() {		cfg.RCE = "on"	} else {		cfg.RCE = "off"	}	return cfg}// GetFrontendURL - gets the frontend urlfunc GetFrontendURL() string {	var frontend = ""	if os.Getenv("FRONTEND_URL") != "" {		frontend = os.Getenv("FRONTEND_URL")	} else if config.Config.Server.FrontendURL != "" {		frontend = config.Config.Server.FrontendURL	}	return frontend}// GetAPIConnString - gets the api connections stringfunc GetAPIConnString() string {	conn := ""	if os.Getenv("SERVER_API_CONN_STRING") != "" {		conn = os.Getenv("SERVER_API_CONN_STRING")	} else if config.Config.Server.APIConnString != "" {		conn = config.Config.Server.APIConnString	}	return conn}// GetVersion - version of netmakerfunc GetVersion() string {	version := "0.9.3"	if config.Config.Server.Version != "" {		version = config.Config.Server.Version	}	return version}// GetDB - gets the database typefunc GetDB() string {	database := "sqlite"	if os.Getenv("DATABASE") != "" {		database = os.Getenv("DATABASE")	} else if config.Config.Server.Database != "" {		database = config.Config.Server.Database	}	return database}// GetAPIHost - gets the api hostfunc GetAPIHost() string {	serverhost := "127.0.0.1"	remoteip, _ := GetPublicIP()	if os.Getenv("SERVER_HTTP_HOST") != "" {		serverhost = os.Getenv("SERVER_HTTP_HOST")	} else if config.Config.Server.APIHost != "" {		serverhost = config.Config.Server.APIHost	} else if os.Getenv("SERVER_HOST") != "" {		serverhost = os.Getenv("SERVER_HOST")	} else {		if remoteip != "" {			serverhost = remoteip		}	}	return serverhost}// GetPodIP - get the pod's ipfunc GetPodIP() string {	podip := "127.0.0.1"	if os.Getenv("POD_IP") != "" {		podip = os.Getenv("POD_IP")	}	return podip}// GetAPIPort - gets the api portfunc GetAPIPort() string {	apiport := "8081"	if os.Getenv("API_PORT") != "" {		apiport = os.Getenv("API_PORT")	} else if config.Config.Server.APIPort != "" {		apiport = config.Config.Server.APIPort	}	return apiport}// GetCheckinInterval - get check in interval for nodesfunc GetCheckinInterval() string {	seconds := "15"	if os.Getenv("CHECKIN_INTERVAL") != "" {		seconds = os.Getenv("CHECKIN_INTERVAL")	} else if config.Config.Server.CheckinInterval != "" {		seconds = config.Config.Server.CheckinInterval	}	return seconds}// GetDefaultNodeLimit - get node limit if one is setfunc GetDefaultNodeLimit() int32 {	var limit int32	limit = 999999999	envlimit, err := strconv.Atoi(os.Getenv("DEFAULT_NODE_LIMIT"))	if err == nil && envlimit != 0 {		limit = int32(envlimit)	} else if config.Config.Server.DefaultNodeLimit != 0 {		limit = config.Config.Server.DefaultNodeLimit	}	return limit}// GetGRPCConnString - get grpc conn stringfunc GetGRPCConnString() string {	conn := ""	if os.Getenv("SERVER_GRPC_CONN_STRING") != "" {		conn = os.Getenv("SERVER_GRPC_CONN_STRING")	} else if config.Config.Server.GRPCConnString != "" {		conn = config.Config.Server.GRPCConnString	}	return conn}// GetCoreDNSAddr - gets the core dns addressfunc GetCoreDNSAddr() string {	addr, _ := GetPublicIP()	if os.Getenv("COREDNS_ADDR") != "" {		addr = os.Getenv("COREDNS_ADDR")	} else if config.Config.Server.CoreDNSAddr != "" {		addr = config.Config.Server.GRPCConnString	}	return addr}// GetGRPCHost - get the grpc host urlfunc GetGRPCHost() string {	serverhost := "127.0.0.1"	remoteip, _ := GetPublicIP()	if os.Getenv("SERVER_GRPC_HOST") != "" {		serverhost = os.Getenv("SERVER_GRPC_HOST")	} else if config.Config.Server.GRPCHost != "" {		serverhost = config.Config.Server.GRPCHost	} else if os.Getenv("SERVER_HOST") != "" {		serverhost = os.Getenv("SERVER_HOST")	} else {		if remoteip != "" {			serverhost = remoteip		}	}	return serverhost}// GetGRPCPort - gets the grpc portfunc GetGRPCPort() string {	grpcport := "50051"	if os.Getenv("GRPC_PORT") != "" {		grpcport = os.Getenv("GRPC_PORT")	} else if config.Config.Server.GRPCPort != "" {		grpcport = config.Config.Server.GRPCPort	}	return grpcport}// GetMasterKey - gets the configured master key of serverfunc GetMasterKey() string {	key := "secretkey"	if os.Getenv("MASTER_KEY") != "" {		key = os.Getenv("MASTER_KEY")	} else if config.Config.Server.MasterKey != "" {		key = config.Config.Server.MasterKey	}	return key}// GetDNSKey - gets the configured dns key of serverfunc GetDNSKey() string {	key := "secretkey"	if os.Getenv("DNS_KEY") != "" {		key = os.Getenv("DNS_KEY")	} else if config.Config.Server.DNSKey != "" {		key = config.Config.Server.DNSKey	}	return key}// GetAllowedOrigin - get the allowed originfunc GetAllowedOrigin() string {	allowedorigin := "*"	if os.Getenv("CORS_ALLOWED_ORIGIN") != "" {		allowedorigin = os.Getenv("CORS_ALLOWED_ORIGIN")	} else if config.Config.Server.AllowedOrigin != "" {		allowedorigin = config.Config.Server.AllowedOrigin	}	return allowedorigin}// IsRestBackend - checks if rest is on or offfunc IsRestBackend() bool {	isrest := true	if os.Getenv("REST_BACKEND") != "" {		if os.Getenv("REST_BACKEND") == "off" {			isrest = false		}	} else if config.Config.Server.RestBackend != "" {		if config.Config.Server.RestBackend == "off" {			isrest = false		}	}	return isrest}// IsAgentBackend - checks if agent backed is on or offfunc IsAgentBackend() bool {	isagent := true	if os.Getenv("AGENT_BACKEND") != "" {		if os.Getenv("AGENT_BACKEND") == "off" {			isagent = false		}	} else if config.Config.Server.AgentBackend != "" {		if config.Config.Server.AgentBackend == "off" {			isagent = false		}	}	return isagent}// IsClientMode - checks if it should run in client modefunc IsClientMode() string {	isclient := "on"	if os.Getenv("CLIENT_MODE") != "" {		if os.Getenv("CLIENT_MODE") == "off" {			isclient = "off"		}		if os.Getenv("CLIENT_MODE") == "contained" {			isclient = "contained"		}	} else if config.Config.Server.ClientMode != "" {		if config.Config.Server.ClientMode == "off" {			isclient = "off"		}		if config.Config.Server.ClientMode == "contained" {			isclient = "contained"		}	}	return isclient}// IsDNSMode - should it run with DNSfunc IsDNSMode() bool {	isdns := true	if os.Getenv("DNS_MODE") != "" {		if os.Getenv("DNS_MODE") == "off" {			isdns = false		}	} else if config.Config.Server.DNSMode != "" {		if config.Config.Server.DNSMode == "off" {			isdns = false		}	}	return isdns}// IsDisplayKeys - should server be able to display keys?func IsDisplayKeys() bool {	isdisplay := true	if os.Getenv("DISPLAY_KEYS") != "" {		if os.Getenv("DISPLAY_KEYS") == "off" {			isdisplay = false		}	} else if config.Config.Server.DisplayKeys != "" {		if config.Config.Server.DisplayKeys == "off" {			isdisplay = false		}	}	return isdisplay}// IsGRPCSSL - ssl grpc on or offfunc IsGRPCSSL() bool {	isssl := false	if os.Getenv("GRPC_SSL") != "" {		if os.Getenv("GRPC_SSL") == "on" {			isssl = true		}	} else if config.Config.Server.DNSMode != "" {		if config.Config.Server.DNSMode == "on" {			isssl = true		}	}	return isssl}// DisableRemoteIPCheck - disable the remote ip checkfunc DisableRemoteIPCheck() bool {	disabled := false	if os.Getenv("DISABLE_REMOTE_IP_CHECK") != "" {		if os.Getenv("DISABLE_REMOTE_IP_CHECK") == "on" {			disabled = true		}	} else if config.Config.Server.DisableRemoteIPCheck != "" {		if config.Config.Server.DisableRemoteIPCheck == "on" {			disabled = true		}	}	return disabled}// DisableDefaultNet - disable default netfunc DisableDefaultNet() bool {	disabled := false	if os.Getenv("DISABLE_DEFAULT_NET") != "" {		if os.Getenv("DISABLE_DEFAULT_NET") == "on" {			disabled = true		}	} else if config.Config.Server.DisableDefaultNet != "" {		if config.Config.Server.DisableDefaultNet == "on" {			disabled = true		}	}	return disabled}// GetPublicIP - gets public ipfunc GetPublicIP() (string, error) {	endpoint := ""	var err error	iplist := []string{"https://ip.server.gravitl.com", "https://ifconfig.me", "https://api.ipify.org", "https://ipinfo.io/ip"}	for _, ipserver := range iplist {		resp, err := http.Get(ipserver)		if err != nil {			continue		}		defer resp.Body.Close()		if resp.StatusCode == http.StatusOK {			bodyBytes, err := io.ReadAll(resp.Body)			if err != nil {				continue			}			endpoint = string(bodyBytes)			break		}	}	if err == nil && endpoint == "" {		err = errors.New("public address not found")	}	return endpoint, err}// GetPlatform - get the system type of serverfunc GetPlatform() string {	platform := "linux"	if os.Getenv("PLATFORM") != "" {		platform = os.Getenv("PLATFORM")	} else if config.Config.Server.Platform != "" {		platform = config.Config.Server.SQLConn	}	return platform}// GetSQLConn - get the sql connection stringfunc GetSQLConn() string {	sqlconn := "http://"	if os.Getenv("SQL_CONN") != "" {		sqlconn = os.Getenv("SQL_CONN")	} else if config.Config.Server.SQLConn != "" {		sqlconn = config.Config.Server.SQLConn	}	return sqlconn}// IsSplitDNS - checks if split dns is onfunc IsSplitDNS() bool {	issplit := false	if os.Getenv("IS_SPLIT_DNS") == "yes" {		issplit = true	} else if config.Config.Server.SplitDNS == "yes" {		issplit = true	}	return issplit}// GetNodeID - gets the node idfunc GetNodeID() string {	var id string	id = getMacAddr()	if os.Getenv("NODE_ID") != "" {		id = os.Getenv("NODE_ID")	} else if config.Config.Server.NodeID != "" {		id = config.Config.Server.NodeID	}	return id}// GetServerCheckinInterval - gets the server check-in timefunc GetServerCheckinInterval() int64 {	var t = int64(5)	var envt, _ = strconv.Atoi(os.Getenv("SERVER_CHECKIN_INTERVAL"))	if envt > 0 {		t = int64(envt)	} else if config.Config.Server.ServerCheckinInterval > 0 {		t = config.Config.Server.ServerCheckinInterval	}	return t}// GetAuthProviderInfo = gets the oauth provider infofunc GetAuthProviderInfo() []string {	var authProvider = ""	if os.Getenv("AUTH_PROVIDER") != "" && os.Getenv("CLIENT_ID") != "" && os.Getenv("CLIENT_SECRET") != "" {		authProvider = strings.ToLower(os.Getenv("AUTH_PROVIDER"))		if authProvider == "google" || authProvider == "azure-ad" || authProvider == "github" {			return []string{authProvider, os.Getenv("CLIENT_ID"), os.Getenv("CLIENT_SECRET")}		} else {			authProvider = ""		}	} else if config.Config.Server.AuthProvider != "" && config.Config.Server.ClientID != "" && config.Config.Server.ClientSecret != "" {		authProvider = strings.ToLower(config.Config.Server.AuthProvider)		if authProvider == "google" || authProvider == "azure-ad" || authProvider == "github" {			return []string{authProvider, config.Config.Server.ClientID, config.Config.Server.ClientSecret}		}	}	return []string{"", "", ""}}// GetAzureTenant - retrieve the azure tenant ID from env variable or config filefunc GetAzureTenant() string {	var azureTenant = ""	if os.Getenv("AZURE_TENANT") != "" {		azureTenant = os.Getenv("AZURE_TENANT")	} else if config.Config.Server.AzureTenant != "" {		azureTenant = config.Config.Server.AzureTenant	}	return azureTenant}// GetMacAddr - get's mac addressfunc getMacAddr() string {	ifas, err := net.Interfaces()	if err != nil {		return ""	}	var as []string	for _, ifa := range ifas {		a := ifa.HardwareAddr.String()		if a != "" {			as = append(as, a)		}	}	return as[0]}// GetRce - sees if Rce is enabled, off by defaultfunc GetRce() bool {	return os.Getenv("RCE") == "on" || config.Config.Server.RCE == "on"}
 |