package main import ( "strings" "github.com/segmentio/encoding/json" "github.com/spf13/viper" l "gitlab.com/cyclops-utilities/logging" ) // The following structs: apikey, dbConfig, eventsConfig, generalConfig, // kafkaConfig, and keycloakConfig are part of the configuration struct which // acts as the main reference for configuration parameters in the system. type apiKey struct { Enabled bool `json:"enabled"` Key string Place string Token string `json:"token"` } type configuration struct { APIKey apiKey Credit creditConfig DB dbConfig Events eventsConfig General generalConfig Kafka kafkaConfig Keycloak keycloakConfig `json:"keycloak"` OpenStack openStackConfig Plans planConfig Prometheus prometheusConfig } type creditConfig struct { Usage bool } type dbConfig struct { CacheRetention string DbName string Host string Password string Port int SSLMode string Username string } type eventsConfig struct { Filters []string } type generalConfig struct { CertificateFile string `json:"certificate_file"` CertificateKey string `json:"certificate_key"` CORSEnabled bool CORSHeaders []string CORSMethods []string CORSOrigins []string HTTPSEnabled bool InsecureSkipVerify bool LogFile string LogLevel string LogToConsole bool ServerPort int Services map[string]string } type kafkaConfig struct { Brokers []string MaxBytes int MinBytes int Offset int64 Partition int TopicsIn []string TopicsOut []string TLSEnabled bool } type keycloakConfig struct { ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` Enabled bool `json:"enabled"` Host string `json:"host"` Port int `json:"port"` Realm string `json:"realm"` RedirectURL string `json:"redirect_url"` UseHTTP bool `json:"use_http"` } type openStackConfig struct { Domain string Filters []string Keystone string Password string Project string Regions []string User string } type planConfig struct { Default string } type prometheusConfig struct { Host string MetricsExport bool MetricsPort string MetricsRoute string } // dumpConfig 's job is to dumps the configuration in JSON format to the log // system. It makes use of the masking function to keep some secrecy in the log. // Parameters: // - c: configuration type containing the config present in the system. func dumpConfig(c configuration) { cfgCopy := c // deal with configuration params that should be masked cfgCopy.APIKey.Token = masked(c.APIKey.Token, 4) cfgCopy.DB.Password = masked(c.DB.Password, 4) cfgCopy.Keycloak.ClientSecret = masked(c.Keycloak.ClientSecret, 4) cfgCopy.OpenStack.Password = masked(c.OpenStack.Password, 4) // mmrshalindent creates a string containing newlines; each line starts with // two spaces and two spaces are added for each indent... configJSON, _ := json.MarshalIndent(cfgCopy, " ", " ") l.Info.Printf("[CONFIG] Configuration settings:\n") l.Info.Printf("%v\n", string(configJSON)) } // masked 's job is to return asterisks in place of the characters in a // string with the exception of the last indicated. // Parameters: // - s: string to be masked // - unmaskedChars: int with the amount (counting from the end of the string) of // characters to keep unmasked. // Returns: // - returnString: the s string passed as parameter masked. func masked(s string, unmaskedChars int) (returnString string) { if len(s) <= unmaskedChars { returnString = s return } asteriskString := strings.Repeat("*", (len(s) - unmaskedChars)) returnString = asteriskString + string(s[len(s)-unmaskedChars:]) return } // parseConfig handles the filling of the config struct with the data Viper gets // from the configuration file. // Returns: // - c: the configuration struct filled with the relevant parsed configuration. func parseConfig() (c configuration) { l.Trace.Printf("[CONFIG] Retrieving configuration.\n") c = configuration{ APIKey: apiKey{ Enabled: viper.GetBool("apikey.enabled"), Key: viper.GetString("apikey.key"), Place: viper.GetString("apikey.place"), Token: viper.GetString("apikey.token"), }, Credit: creditConfig{ Usage: viper.GetBool("credit.usageinsteadofcost"), }, DB: dbConfig{ CacheRetention: viper.GetString("portaldb.cacheretention"), DbName: viper.GetString("portaldb.dbname"), Host: viper.GetString("portaldb.host"), Password: viper.GetString("portaldb.password"), Port: viper.GetInt("portaldb.port"), SSLMode: viper.GetString("portaldb.sslmode"), Username: viper.GetString("portaldb.username"), }, Events: eventsConfig{ Filters: viper.GetStringSlice("events.filters"), }, General: generalConfig{ CertificateFile: viper.GetString("general.certificatefile"), CertificateKey: viper.GetString("general.certificatekey"), CORSEnabled: viper.GetBool("general.corsenabled"), CORSHeaders: viper.GetStringSlice("general.corsheaders"), CORSMethods: viper.GetStringSlice("general.corsmethods"), CORSOrigins: viper.GetStringSlice("general.corsorigins"), HTTPSEnabled: viper.GetBool("general.httpsenabled"), InsecureSkipVerify: viper.GetBool("general.insecureskipverify"), LogFile: viper.GetString("general.logfile"), LogLevel: viper.GetString("general.loglevel"), LogToConsole: viper.GetBool("general.logtoconsole"), ServerPort: viper.GetInt("general.serverport"), Services: viper.GetStringMapString("general.services"), }, Kafka: kafkaConfig{ Brokers: viper.GetStringSlice("kafka.brokers"), MaxBytes: viper.GetInt("kafka.sizemax"), MinBytes: viper.GetInt("kafka.sizemin"), Offset: viper.GetInt64("kafka.offset"), Partition: viper.GetInt("kafka.partition"), TopicsIn: viper.GetStringSlice("kafka." + service + "in"), TopicsOut: viper.GetStringSlice("kafka." + service + "out"), TLSEnabled: viper.GetBool("kafka.tlsenabled"), }, Keycloak: keycloakConfig{ ClientID: viper.GetString("keycloak.clientid"), ClientSecret: viper.GetString("keycloak.clientsecret"), Enabled: viper.GetBool("keycloak.enabled"), Host: viper.GetString("keycloak.host"), Port: viper.GetInt("keycloak.port"), Realm: viper.GetString("keycloak.realm"), RedirectURL: viper.GetString("keycloak.redirecturl"), UseHTTP: viper.GetBool("keycloak.usehttp"), }, OpenStack: openStackConfig{ Domain: viper.GetString("openstack.domain"), Filters: viper.GetStringSlice("openstack.filters"), Keystone: viper.GetString("openstack.keystone"), Password: viper.GetString("openstack.password"), Project: viper.GetString("openstack.project"), Regions: viper.GetStringSlice("openstack.region"), User: viper.GetString("openstack.user"), }, Plans: planConfig{ Default: viper.GetString("Plans.default"), }, Prometheus: prometheusConfig{ Host: viper.GetString("prometheus.host"), MetricsExport: viper.GetBool("prometheus.metricsexport"), MetricsPort: viper.GetString("prometheus.metricsport"), MetricsRoute: viper.GetString("prometheus.metricsroute"), }, } return }