config.go 1.9 KB

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