settings.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package logic
  2. import (
  3. "encoding/json"
  4. "os"
  5. "regexp"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/gravitl/netmaker/config"
  10. "github.com/gravitl/netmaker/database"
  11. "github.com/gravitl/netmaker/models"
  12. "github.com/gravitl/netmaker/servercfg"
  13. )
  14. var serverSettingsDBKey = "server_cfg"
  15. func GetServerSettings() (s models.ServerSettings) {
  16. data, err := database.FetchRecord(database.SERVER_SETTINGS, serverSettingsDBKey)
  17. if err != nil {
  18. return
  19. }
  20. json.Unmarshal([]byte(data), &s)
  21. return
  22. }
  23. func UpsertServerSettings(s models.ServerSettings) error {
  24. data, err := json.Marshal(s)
  25. if err != nil {
  26. return err
  27. }
  28. err = database.Insert(serverSettingsDBKey, string(data), database.SERVER_SETTINGS)
  29. if err != nil {
  30. return err
  31. }
  32. return nil
  33. }
  34. func ValidateNewSettings(req models.ServerSettings) bool {
  35. // TODO: add checks for different fields
  36. return true
  37. }
  38. func GetServerSettingsFromEnv() (s models.ServerSettings) {
  39. s = models.ServerSettings{
  40. NetclientAutoUpdate: servercfg.AutoUpdateEnabled(),
  41. Verbosity: servercfg.GetVerbosity(),
  42. AuthProvider: os.Getenv("AUTH_PROVIDER"),
  43. OIDCIssuer: os.Getenv("OIDC_ISSUER"),
  44. ClientID: os.Getenv("CLIENT_ID"),
  45. ClientSecret: os.Getenv("CLIENT_SECRET"),
  46. AzureTenant: servercfg.GetAzureTenant(),
  47. Telemetry: servercfg.Telemetry(),
  48. BasicAuth: servercfg.IsBasicAuthEnabled(),
  49. JwtValidityDuration: servercfg.GetJwtValidityDurationFromEnv(),
  50. RacAutoDisable: servercfg.GetRacAutoDisable(),
  51. RacRestrictToSingleNetwork: servercfg.GetRacRestrictToSingleNetwork(),
  52. EndpointDetection: servercfg.IsEndpointDetectionEnabled(),
  53. AllowedEmailDomains: servercfg.GetAllowedEmailDomains(),
  54. EmailSenderAddr: servercfg.GetSenderEmail(),
  55. EmailSenderUser: servercfg.GetSenderUser(),
  56. EmailSenderPassword: servercfg.GetEmaiSenderPassword(),
  57. SmtpHost: servercfg.GetSmtpHost(),
  58. SmtpPort: servercfg.GetSmtpPort(),
  59. MetricInterval: servercfg.GetMetricInterval(),
  60. MetricsPort: servercfg.GetMetricsPort(),
  61. ManageDNS: servercfg.GetManageDNS(),
  62. DefaultDomain: servercfg.GetDefaultDomain(),
  63. Stun: servercfg.IsStunEnabled(),
  64. StunServers: servercfg.GetStunServers(),
  65. TextSize: "16",
  66. Theme: models.Dark,
  67. ReducedMotion: false,
  68. }
  69. return
  70. }
  71. // GetServerConfig - gets the server config into memory from file or env
  72. func GetServerConfig() config.ServerConfig {
  73. var cfg config.ServerConfig
  74. settings := GetServerSettings()
  75. cfg.APIConnString = servercfg.GetAPIConnString()
  76. cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()
  77. cfg.APIHost = servercfg.GetAPIHost()
  78. cfg.APIPort = servercfg.GetAPIPort()
  79. cfg.MasterKey = "(hidden)"
  80. cfg.DNSKey = "(hidden)"
  81. cfg.AllowedOrigin = servercfg.GetAllowedOrigin()
  82. cfg.RestBackend = "off"
  83. cfg.NodeID = servercfg.GetNodeID()
  84. cfg.BrokerType = servercfg.GetBrokerType()
  85. cfg.EmqxRestEndpoint = servercfg.GetEmqxRestEndpoint()
  86. if settings.NetclientAutoUpdate {
  87. cfg.NetclientAutoUpdate = "enabled"
  88. } else {
  89. cfg.NetclientAutoUpdate = "disabled"
  90. }
  91. if servercfg.IsRestBackend() {
  92. cfg.RestBackend = "on"
  93. }
  94. cfg.DNSMode = "off"
  95. if servercfg.IsDNSMode() {
  96. cfg.DNSMode = "on"
  97. }
  98. cfg.DisplayKeys = "off"
  99. if servercfg.IsDisplayKeys() {
  100. cfg.DisplayKeys = "on"
  101. }
  102. cfg.DisableRemoteIPCheck = "off"
  103. if servercfg.DisableRemoteIPCheck() {
  104. cfg.DisableRemoteIPCheck = "on"
  105. }
  106. cfg.Database = servercfg.GetDB()
  107. cfg.Platform = servercfg.GetPlatform()
  108. cfg.Version = servercfg.GetVersion()
  109. cfg.PublicIp = servercfg.GetServerHostIP()
  110. // == auth config ==
  111. var authInfo = GetAuthProviderInfo(settings)
  112. cfg.AuthProvider = authInfo[0]
  113. cfg.ClientID = authInfo[1]
  114. cfg.ClientSecret = authInfo[2]
  115. cfg.FrontendURL = servercfg.GetFrontendURL()
  116. cfg.AzureTenant = settings.AzureTenant
  117. cfg.Telemetry = settings.Telemetry
  118. cfg.Server = servercfg.GetServer()
  119. cfg.Verbosity = settings.Verbosity
  120. cfg.IsPro = "no"
  121. if servercfg.IsPro {
  122. cfg.IsPro = "yes"
  123. }
  124. cfg.JwtValidityDuration = time.Duration(settings.JwtValidityDuration) * time.Second
  125. cfg.RacAutoDisable = settings.RacAutoDisable
  126. cfg.RacRestrictToSingleNetwork = settings.RacRestrictToSingleNetwork
  127. cfg.MetricInterval = settings.MetricInterval
  128. cfg.ManageDNS = settings.ManageDNS
  129. cfg.Stun = settings.Stun
  130. cfg.StunServers = settings.StunServers
  131. cfg.DefaultDomain = settings.DefaultDomain
  132. return cfg
  133. }
  134. // GetServerInfo - gets the server config into memory from file or env
  135. func GetServerInfo() models.ServerConfig {
  136. var cfg models.ServerConfig
  137. serverSettings := GetServerSettings()
  138. cfg.Server = servercfg.GetServer()
  139. if servercfg.GetBrokerType() == servercfg.EmqxBrokerType {
  140. cfg.MQUserName = "HOST_ID"
  141. cfg.MQPassword = "HOST_PASS"
  142. } else {
  143. cfg.MQUserName = servercfg.GetMqUserName()
  144. cfg.MQPassword = servercfg.GetMqPassword()
  145. }
  146. cfg.API = servercfg.GetAPIConnString()
  147. cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()
  148. cfg.APIPort = servercfg.GetAPIPort()
  149. cfg.DNSMode = "off"
  150. cfg.Broker = servercfg.GetPublicBrokerEndpoint()
  151. cfg.BrokerType = servercfg.GetBrokerType()
  152. if servercfg.IsDNSMode() {
  153. cfg.DNSMode = "on"
  154. }
  155. cfg.Version = servercfg.GetVersion()
  156. cfg.IsPro = servercfg.IsPro
  157. cfg.MetricInterval = serverSettings.MetricInterval
  158. cfg.MetricsPort = serverSettings.MetricsPort
  159. cfg.ManageDNS = serverSettings.ManageDNS
  160. cfg.Stun = serverSettings.Stun
  161. cfg.StunServers = serverSettings.StunServers
  162. cfg.DefaultDomain = serverSettings.DefaultDomain
  163. cfg.EndpointDetection = serverSettings.EndpointDetection
  164. return cfg
  165. }
  166. // GetDefaultDomain - get the default domain
  167. func GetDefaultDomain() string {
  168. return GetServerSettings().DefaultDomain
  169. }
  170. func ValidateDomain(domain string) bool {
  171. domainPattern := `[a-zA-Z0-9][a-zA-Z0-9_-]{0,62}(\.[a-zA-Z0-9][a-zA-Z0-9_-]{0,62})*(\.[a-zA-Z][a-zA-Z0-9]{0,10}){1}`
  172. exp := regexp.MustCompile("^" + domainPattern + "$")
  173. return exp.MatchString(domain)
  174. }
  175. // Telemetry - checks if telemetry data should be sent
  176. func Telemetry() string {
  177. return GetServerSettings().Telemetry
  178. }
  179. // GetJwtValidityDuration - returns the JWT validity duration in seconds
  180. func GetJwtValidityDuration() time.Duration {
  181. return GetServerConfig().JwtValidityDuration
  182. }
  183. // GetRacAutoDisable - returns whether the feature to autodisable RAC is enabled
  184. func GetRacAutoDisable() bool {
  185. return GetServerSettings().RacAutoDisable
  186. }
  187. // GetRacRestrictToSingleNetwork - returns whether the feature to allow simultaneous network connections via RAC is enabled
  188. func GetRacRestrictToSingleNetwork() bool {
  189. return GetServerSettings().RacRestrictToSingleNetwork
  190. }
  191. func GetSmtpHost() string {
  192. return GetServerSettings().SmtpHost
  193. }
  194. func GetSmtpPort() int {
  195. return GetServerSettings().SmtpPort
  196. }
  197. func GetSenderEmail() string {
  198. return GetServerSettings().EmailSenderAddr
  199. }
  200. func GetSenderUser() string {
  201. return GetServerSettings().EmailSenderUser
  202. }
  203. func GetEmaiSenderPassword() string {
  204. return GetServerSettings().EmailSenderPassword
  205. }
  206. // AutoUpdateEnabled returns a boolean indicating whether netclient auto update is enabled or disabled
  207. // default is enabled
  208. func AutoUpdateEnabled() bool {
  209. return GetServerSettings().NetclientAutoUpdate
  210. }
  211. // GetAuthProviderInfo = gets the oauth provider info
  212. func GetAuthProviderInfo(settings models.ServerSettings) (pi []string) {
  213. var authProvider = ""
  214. defer func() {
  215. if authProvider == "oidc" {
  216. if settings.OIDCIssuer != "" {
  217. pi = append(pi, settings.OIDCIssuer)
  218. } else {
  219. pi = []string{"", "", ""}
  220. }
  221. }
  222. }()
  223. if settings.AuthProvider != "" && settings.ClientID != "" && settings.ClientSecret != "" {
  224. authProvider = strings.ToLower(settings.AuthProvider)
  225. if authProvider == "google" || authProvider == "azure-ad" || authProvider == "github" || authProvider == "oidc" {
  226. return []string{authProvider, settings.ClientID, settings.ClientSecret}
  227. } else {
  228. authProvider = ""
  229. }
  230. }
  231. return []string{"", "", ""}
  232. }
  233. // GetAzureTenant - retrieve the azure tenant ID from env variable or config file
  234. func GetAzureTenant() string {
  235. return GetServerSettings().AzureTenant
  236. }
  237. // GetMetricsPort - get metrics port
  238. func GetMetricsPort() int {
  239. return GetServerSettings().MetricsPort
  240. }
  241. // GetMetricInterval - get the publish metric interval
  242. func GetMetricIntervalInMinutes() time.Duration {
  243. //default 15 minutes
  244. mi := "15"
  245. if os.Getenv("PUBLISH_METRIC_INTERVAL") != "" {
  246. mi = os.Getenv("PUBLISH_METRIC_INTERVAL")
  247. }
  248. interval, err := strconv.Atoi(mi)
  249. if err != nil {
  250. interval = 15
  251. }
  252. return time.Duration(interval) * time.Minute
  253. }
  254. // GetMetricInterval - get the publish metric interval
  255. func GetMetricInterval() string {
  256. return GetServerSettings().MetricInterval
  257. }
  258. // GetManageDNS - if manage DNS enabled or not
  259. func GetManageDNS() bool {
  260. return GetServerSettings().ManageDNS
  261. }
  262. // IsBasicAuthEnabled - checks if basic auth has been configured to be turned off
  263. func IsBasicAuthEnabled() bool {
  264. return GetServerSettings().BasicAuth
  265. }
  266. // IsEndpointDetectionEnabled - returns true if endpoint detection enabled
  267. func IsEndpointDetectionEnabled() bool {
  268. return GetServerSettings().EndpointDetection
  269. }
  270. // IsStunEnabled - returns true if STUN set to on
  271. func IsStunEnabled() bool {
  272. return GetServerSettings().Stun
  273. }
  274. func GetStunServers() string {
  275. return GetServerSettings().StunServers
  276. }
  277. // GetAllowedEmailDomains - gets the allowed email domains for oauth signup
  278. func GetAllowedEmailDomains() string {
  279. return GetServerSettings().AllowedEmailDomains
  280. }
  281. func GetVerbosity() int32 {
  282. return GetServerSettings().Verbosity
  283. }