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