hostname-service/config/config.go

90 lines
2.2 KiB
Go
Raw Normal View History

2024-01-17 18:05:55 +01:00
package config
import (
"encoding/json"
"errors"
"flag"
"io/ioutil"
"os"
"reflect"
"strings"
// You might need additional imports for file handling, etc.
)
type AppConfig struct {
JwtKey string
DatabaseFile string
}
var GlobalConfig *AppConfig
func LoadConfig() error {
GlobalConfig = &AppConfig{}
// Check command line arguments
configFile := flag.String("c", "", "path to config file")
flag.Parse()
if *configFile != "" {
return loadConfigFromFile(*configFile, GlobalConfig)
}
// Check environment variable for config file path
envConfigFile := os.Getenv("HS_CONFIGFILE")
if envConfigFile != "" {
return loadConfigFromFile(envConfigFile, GlobalConfig)
}
// Try to load from a default config file
defaultConfigFile := "config.json" // Replace with your default config file name
if _, err := os.Stat(defaultConfigFile); err == nil {
return loadConfigFromFile(defaultConfigFile, GlobalConfig)
}
// Load config from environment variables or docker secrets
loadConfigFromEnvOrSecrets(GlobalConfig)
// Check if the configuration has been loaded successfully
if GlobalConfig.JwtKey == "" || GlobalConfig.DatabaseFile == "" {
// Add more checks as necessary for other required config fields
return errors.New("failed to load configuration from any source")
}
return nil
}
func loadConfigFromFile(filePath string, config *AppConfig) error {
fileData, err := ioutil.ReadFile(filePath)
if err != nil {
return err
}
err = json.Unmarshal(fileData, config)
if err != nil {
return err
}
return nil
}
func loadConfigFromEnvOrSecrets(config *AppConfig) {
val := reflect.ValueOf(config).Elem()
typ := val.Type()
for i := 0; i < val.NumField(); i++ {
field := typ.Field(i)
envVar := "HS_CONFIG_" + strings.ToUpper(field.Name)
if value, exists := os.LookupEnv(envVar); exists {
val.Field(i).SetString(value)
}
// Handling Docker secrets (file-based secrets)
secretFileEnvVar := envVar + "_FILE"
if secretFilePath, exists := os.LookupEnv(secretFileEnvVar); exists {
if secretValue, err := ioutil.ReadFile(secretFilePath); err == nil {
val.Field(i).SetString(string(secretValue))
}
}
}
}