| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 | package servercfgimport (	"errors"	"io"	"net/http"	"os"	"strconv"	"strings"	"github.com/gravitl/netmaker/config")var (	Version = "dev")// 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.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"	}	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.DisableRemoteIPCheck = "off"	if DisableRemoteIPCheck() {		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"	}	cfg.Debug = GetDebug()	cfg.Telemetry = Telemetry()	cfg.ManageIPTables = ManageIPTables()	services := strings.Join(GetPortForwardServiceList(), ",")	cfg.PortForwardServices = services	cfg.Server = GetServer()	cfg.Verbosity = GetVerbosity()	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}// SetVersion - set version of netmakerfunc SetVersion(v string) {	Version = v}// GetVersion - version of netmakerfunc GetVersion() string {	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}// 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}// 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.CoreDNSAddr	}	return addr}// GetMQPort - gets the mq portfunc GetMQPort() string {	mqport := "1883"	if os.Getenv("MQ_PORT") != "" {		mqport = os.Getenv("MQ_PORT")	} else if config.Config.Server.MQPort != "" {		mqport = config.Config.Server.MQPort	}	return mqport}// GetMessageQueueEndpoint - gets the message queue endpointfunc GetMessageQueueEndpoint() string {	host, _ := GetPublicIP()	if os.Getenv("MQ_HOST") != "" {		host = os.Getenv("MQ_HOST")	} else if config.Config.Server.MQHOST != "" {		host = config.Config.Server.MQHOST	}	//Do we want MQ port configurable???	return host + ":1883"}// GetMasterKey - gets the configured master key of serverfunc GetMasterKey() string {	key := ""	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}// IsMessageQueueBackend - checks if message queue is on or offfunc IsMessageQueueBackend() bool {	ismessagequeue := true	if os.Getenv("MESSAGEQUEUE_BACKEND") != "" {		if os.Getenv("MESSAGEQUEUE_BACKEND") == "off" {			ismessagequeue = false		}	} else if config.Config.Server.MessageQueueBackend != "" {		if config.Config.Server.MessageQueueBackend == "off" {			ismessagequeue = false		}	}	return ismessagequeue}// IsClientMode - checks if it should run in client modefunc IsClientMode() string {	isclient := "on"	if os.Getenv("CLIENT_MODE") == "off" {		isclient = "off"	}	if config.Config.Server.ClientMode == "off" {		isclient = "off"	}	return isclient}// Telemetry - checks if telemetry data should be sentfunc Telemetry() string {	telemetry := "on"	if os.Getenv("TELEMETRY") == "off" {		telemetry = "off"	}	if config.Config.Server.Telemetry == "off" {		telemetry = "off"	}	return telemetry}// ManageIPTables - checks if iptables should be manipulated on hostfunc ManageIPTables() string {	manage := "on"	if os.Getenv("MANAGE_IPTABLES") == "off" {		manage = "off"	}	if config.Config.Server.ManageIPTables == "off" {		manage = "off"	}	return manage}// GetServer - gets the server namefunc GetServer() string {	server := ""	if os.Getenv("SERVER_NAME") != "" {		server = os.Getenv("SERVER_NAME")	} else if config.Config.Server.Server != "" {		server = config.Config.Server.Server	}	return server}func GetVerbosity() int32 {	var verbosity = 0	var err error	if os.Getenv("VERBOSITY") != "" {		verbosity, err = strconv.Atoi(os.Getenv("VERBOSITY"))		if err != nil {			verbosity = 0		}	} else if config.Config.Server.Verbosity != 0 {		verbosity = int(config.Config.Server.Verbosity)	}	if verbosity < 0 || verbosity > 3 {		verbosity = 0	}	return int32(verbosity)}// 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}// 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}// 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}// GetIPForwardServiceList - get the list of services that the server should be forwardingfunc GetPortForwardServiceList() []string {	//services := "mq,dns,ssh"	services := ""	if os.Getenv("PORT_FORWARD_SERVICES") != "" {		services = os.Getenv("PORT_FORWARD_SERVICES")	} else if config.Config.Server.PortForwardServices != "" {		services = config.Config.Server.PortForwardServices	}	serviceSlice := strings.Split(services, ",")	return serviceSlice}// 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}// IsHostNetwork - checks if running on host networkfunc IsHostNetwork() bool {	ishost := false	if os.Getenv("HOST_NETWORK") == "on" {		ishost = true	} else if config.Config.Server.HostNetwork == "on" {		ishost = true	}	return ishost}// GetNodeID - gets the node idfunc GetNodeID() string {	var id string	var err error	// id = getMacAddr()	if os.Getenv("NODE_ID") != "" {		id = os.Getenv("NODE_ID")	} else if config.Config.Server.NodeID != "" {		id = config.Config.Server.NodeID	} else {		id, err = os.Hostname()		if err != nil {			return ""		}	}	return id}func SetNodeID(id string) {	config.Config.Server.NodeID = 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}// GetRce - sees if Rce is enabled, off by defaultfunc GetRce() bool {	return os.Getenv("RCE") == "on" || config.Config.Server.RCE == "on"}// GetDebug -- checks if debugging is enabled, off by defaultfunc GetDebug() bool {	return os.Getenv("DEBUG") == "on" || config.Config.Server.Debug == true}
 |