You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
7.2 KiB
247 lines
7.2 KiB
3 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/spf13/viper"
|
||
|
l "gitlab.com/cyclops-utilities/logging"
|
||
|
)
|
||
|
|
||
|
// The following structs are part of the configuration struct which
|
||
|
// acts as the main reference for configuration parameters in the system.
|
||
|
type apiKey struct {
|
||
|
Enabled bool
|
||
|
Key string
|
||
|
Place string
|
||
|
Token string
|
||
|
}
|
||
|
|
||
|
type configuration struct {
|
||
|
APIKey apiKey
|
||
|
General generalConfig
|
||
|
Heappe heappeConfig
|
||
|
Kafka kafkaConfig
|
||
|
Keycloak keycloakConfig
|
||
|
Lieutenant lieutenantConfig
|
||
|
OpenStack openStackConfig
|
||
|
Prometheus prometheusConfig
|
||
|
RGW rgwConfig
|
||
|
NameFilters []string
|
||
|
ProjectFilters []string
|
||
|
Services map[string]string
|
||
|
}
|
||
|
|
||
|
type generalConfig struct {
|
||
|
InsecureSkipVerify bool
|
||
|
LogFile string
|
||
|
LogLevel string
|
||
|
LogToConsole bool
|
||
|
ObjectsPeriodicity int
|
||
|
Periodicity int
|
||
|
PrometheusPeriodicity int
|
||
|
}
|
||
|
|
||
|
type heappeConfig struct {
|
||
|
Username string
|
||
|
Password string
|
||
|
GroupResourceUsageReportURI string
|
||
|
AuthenticateUserPasswordURI string
|
||
|
}
|
||
|
|
||
|
type kafkaConfig struct {
|
||
|
Brokers []string
|
||
|
MaxBytes int
|
||
|
MinBytes int
|
||
|
Offset int64
|
||
|
Partition int
|
||
|
TLSEnabled bool
|
||
|
TopicUDR string
|
||
|
TopicEEngine string
|
||
|
}
|
||
|
|
||
|
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 lieutenantConfig struct {
|
||
|
Host string
|
||
|
Token string
|
||
|
}
|
||
|
|
||
|
type openStackConfig struct {
|
||
|
Domain string
|
||
|
Keystone string
|
||
|
Password string
|
||
|
Project string
|
||
|
Region string
|
||
|
User string
|
||
|
}
|
||
|
|
||
|
type prometheusConfig struct {
|
||
|
Host string
|
||
|
MetricsExport bool
|
||
|
MetricsPort string
|
||
|
MetricsRoute string
|
||
|
}
|
||
|
|
||
|
type rgwConfig struct {
|
||
|
AccessKeyID string
|
||
|
AdminPath string
|
||
|
Region string
|
||
|
SecretAccessKey string
|
||
|
ServerURL 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.Heappe.Username = masked(c.Heappe.Username, 4)
|
||
|
cfgCopy.Heappe.Password = masked(c.Heappe.Password, 4)
|
||
|
cfgCopy.Keycloak.ClientSecret = masked(c.Keycloak.ClientSecret, 4)
|
||
|
cfgCopy.Lieutenant.Token = masked(c.Lieutenant.Token, 4)
|
||
|
cfgCopy.OpenStack.Password = masked(c.OpenStack.Password, 4)
|
||
|
cfgCopy.RGW.AccessKeyID = masked(c.RGW.AccessKeyID, 4)
|
||
|
cfgCopy.RGW.SecretAccessKey = masked(c.RGW.SecretAccessKey, 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"),
|
||
|
},
|
||
|
|
||
|
General: generalConfig{
|
||
|
InsecureSkipVerify: viper.GetBool("general.insecureskipverify"),
|
||
|
LogFile: viper.GetString("general.logfile"),
|
||
|
LogLevel: viper.GetString("general.loglevel"),
|
||
|
LogToConsole: viper.GetBool("general.logtoconsole"),
|
||
|
ObjectsPeriodicity: viper.GetInt("general.objectsperiodicity"),
|
||
|
Periodicity: viper.GetInt("general.periodicity"),
|
||
|
PrometheusPeriodicity: viper.GetInt("general.prometheusperiodicity"),
|
||
|
},
|
||
|
|
||
|
Heappe: heappeConfig{
|
||
|
Username: viper.GetString("heappe.username"),
|
||
|
Password: viper.GetString("heappe.password"),
|
||
|
GroupResourceUsageReportURI: viper.GetString("heappe.groupResourceUsageReportUri"),
|
||
|
AuthenticateUserPasswordURI: viper.GetString("heappe.authenticateUserPasswordUri"),
|
||
|
},
|
||
|
|
||
|
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"),
|
||
|
TLSEnabled: viper.GetBool("kafka.tlsenabled"),
|
||
|
TopicUDR: viper.GetString("kafka.topicudr"),
|
||
|
TopicEEngine: viper.GetString("kafka.topiceengine"),
|
||
|
},
|
||
|
|
||
|
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"),
|
||
|
},
|
||
|
|
||
|
Lieutenant: lieutenantConfig{
|
||
|
Host: viper.GetString("lieutenant.host"),
|
||
|
Token: viper.GetString("lieutenant.token"),
|
||
|
},
|
||
|
|
||
|
OpenStack: openStackConfig{
|
||
|
Domain: viper.GetString("openstack.domain"),
|
||
|
Keystone: viper.GetString("openstack.keystone"),
|
||
|
Password: viper.GetString("openstack.password"),
|
||
|
Project: viper.GetString("openstack.project"),
|
||
|
Region: viper.GetString("openstack.region"),
|
||
|
User: viper.GetString("openstack.user"),
|
||
|
},
|
||
|
|
||
|
Prometheus: prometheusConfig{
|
||
|
Host: viper.GetString("prometheus.host"),
|
||
|
MetricsExport: viper.GetBool("prometheus.metricsexport"),
|
||
|
MetricsPort: viper.GetString("prometheus.metricsport"),
|
||
|
MetricsRoute: viper.GetString("prometheus.metricsroute"),
|
||
|
},
|
||
|
|
||
|
RGW: rgwConfig{
|
||
|
AccessKeyID: viper.GetString("rgw.accesskey"),
|
||
|
AdminPath: viper.GetString("rgw.adminpath"),
|
||
|
Region: viper.GetString("rgw.region"),
|
||
|
SecretAccessKey: viper.GetString("rgw.secretaccesskey"),
|
||
|
ServerURL: viper.GetString("rgw.serverurl"),
|
||
|
},
|
||
|
|
||
|
NameFilters: viper.GetStringSlice("events.namefilters"),
|
||
|
ProjectFilters: viper.GetStringSlice("events.projectfilters"),
|
||
|
Services: viper.GetStringMapString("services"),
|
||
|
}
|
||
|
|
||
|
return
|
||
|
|
||
|
}
|