config.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package config
  2. import (
  3. log "github.com/sirupsen/logrus"
  4. "github.com/spf13/viper"
  5. )
  6. type Config struct {
  7. BindAddress string `mapstructure:"bind_address"`
  8. Port string `mapstructure:"listen_port"`
  9. IPInfoAPIKey string `mapstructure:"ipinfo_api_key"`
  10. StatsPassword string `mapstructure:"statistics_password"`
  11. RedactIP bool `mapstructure:"redact_ip_addresses"`
  12. DatabaseType string `mapstructure:"database_type"`
  13. DatabaseHostname string `mapstructure:"database_hostname"`
  14. DatabaseName string `mapstructure:"database_name"`
  15. DatabaseUsername string `mapstructure:"database_username"`
  16. DatabasePassword string `mapstructure:"database_password"`
  17. DatabaseFile string `mapstructure:"database_file"`
  18. }
  19. var (
  20. loadedConfig *Config = nil
  21. )
  22. func init() {
  23. viper.SetDefault("listen_port", "8989")
  24. viper.SetDefault("download_chunks", 4)
  25. viper.SetDefault("distance_unit", "K")
  26. viper.SetDefault("enable_cors", false)
  27. viper.SetDefault("statistics_password", "PASSWORD")
  28. viper.SetDefault("redact_ip_addresses", false)
  29. viper.SetDefault("database_type", "postgresql")
  30. viper.SetDefault("database_hostname", "localhost")
  31. viper.SetDefault("database_name", "speedtest")
  32. viper.SetDefault("database_username", "postgres")
  33. viper.SetConfigName("settings")
  34. viper.AddConfigPath(".")
  35. }
  36. func Load() Config {
  37. var conf Config
  38. if err := viper.ReadInConfig(); err != nil {
  39. if _, ok := err.(viper.ConfigFileNotFoundError); ok {
  40. log.Warnf("No config file found in search paths, using default values")
  41. } else {
  42. log.Fatalf("Error reading config: %+v", err)
  43. }
  44. }
  45. if err := viper.Unmarshal(&conf); err != nil {
  46. log.Fatalf("Error parsing config: %s", err)
  47. }
  48. loadedConfig = &conf
  49. return conf
  50. }
  51. func LoadedConfig() *Config {
  52. if loadedConfig == nil {
  53. Load()
  54. }
  55. return loadedConfig
  56. }