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.
		
		
		
		
		
			
		
			
				
					
					
						
							258 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
	
	
							258 lines
						
					
					
						
							7.3 KiB
						
					
					
				| 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
 | |
| 
 | |
| }
 | |
| 
 |