bigbluebutton-Github/bbb-graphql-middleware/config/Config.go

103 lines
2.7 KiB
Go
Raw Normal View History

package config
import (
"dario.cat/mergo"
log "github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
"io/ioutil"
"os"
"path/filepath"
"sync"
)
var (
instance *Config
once sync.Once
)
var DefaultConfigPath = "/usr/share/bbb-graphql-middleware/config.yml"
var OverrideConfigPath = "/etc/bigbluebutton/bbb-graphql-middleware.yml"
type Config struct {
Server struct {
Host string `yaml:"listen_host"`
Port int `yaml:"listen_port"`
MaxConnections int `yaml:"max_connections"`
MaxConnectionsPerSecond int `yaml:"max_connections_per_session_token"`
MaxConnectionsPerSessionToken int `yaml:"max_connections_per_second"`
AuthorizedCrossOrigin string `yaml:"authorized_cross_origin"`
JsonPatchDisabled bool `yaml:"json_patch_disabled"`
SubscriptionAllowedList string `yaml:"subscriptions_allowed_list"`
SubscriptionsDeniedList string `yaml:"subscriptions_denied_list"`
} `yaml:"server"`
Redis struct {
Host string `yaml:"host"`
Port int32 `yaml:"port"`
Password string `yaml:"password"`
} `yaml:"redis"`
Hasura struct {
Url string `yaml:"url"`
} `yaml:"hasura"`
GraphqlActions struct {
Url string `yaml:"url"`
} `yaml:"graphql-actions"`
AuthHook struct {
Url string `yaml:"url"`
} `yaml:"auth_hook"`
SessionVarsHook struct {
Url string `yaml:"url"`
} `yaml:"session_vars_hook"`
LogLevel string `yaml:"log_level"`
PrometheusAdvancedMetricsEnabled bool `yaml:"prometheus_advanced_metrics_enabled"`
}
func GetConfig() *Config {
once.Do(func() {
instance = &Config{}
instance.loadConfigs()
})
return instance
}
func (c *Config) loadConfigs() {
// Load default config file
configDefault, err := loadConfigFile(DefaultConfigPath)
if err != nil {
log.Fatalf("Error while loading config file (%s): %v", DefaultConfigPath, err)
}
// Load override config file if exists
if _, err := os.Stat(OverrideConfigPath); err == nil {
configOverride, err := loadConfigFile(OverrideConfigPath)
if err != nil {
log.Fatalf("Error while loading override config file (%s): %v", OverrideConfigPath, err)
}
log.Info("Override config found at " + OverrideConfigPath)
// Use mergo to merge configs
err = mergo.Merge(&configDefault, configOverride, mergo.WithOverride)
if err != nil {
log.Fatalf("Erro ao mesclar as configurações: %v", err)
}
}
// Update the singleton instance with the merged config
*instance = configDefault
}
func loadConfigFile(path string) (Config, error) {
var config Config
data, err := ioutil.ReadFile(filepath.Clean(path))
if err != nil {
return config, err
}
err = yaml.Unmarshal(data, &config)
if err != nil {
return config, err
}
return config, nil
}