config.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. StatsPassword string `mapstructure:"statistics_password"`
  12. RedactIP bool `mapstructure:"redact_ip_addresses"`
  13. DatabaseType string `mapstructure:"database_type"`
  14. DatabaseHostname string `mapstructure:"database_hostname"`
  15. DatabaseName string `mapstructure:"database_name"`
  16. DatabaseUsername string `mapstructure:"database_username"`
  17. DatabasePassword string `mapstructure:"database_password"`
  18. DatabaseFile string `mapstructure:"database_file"`
  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. }