Files

100 lines
2.5 KiB
Go

package config
import (
"strings"
"github.com/spf13/viper"
)
type Config struct {
OSI OSIConfig `mapstructure:"osi"`
PHIS PHISConfig `mapstructure:"phis"`
Redis RedisConfig `mapstructure:"redis"`
ReportLogFileDir string `mapstructure:"report_log_file_dir"`
RetryMax int `mapstructure:"retry_max"`
CircuitFailThreshold int `mapstructure:"circuit_fail_threshold"`
CircuitSleepSec int `mapstructure:"circuit_sleep_sec"`
}
type OSIConfig struct {
BaseURL string `mapstructure:"base_url"`
OrgCode string `mapstructure:"org_code"`
UserName string `mapstructure:"user_name"`
Ask string `mapstructure:"ask"`
DeviceSN string `mapstructure:"device_sn"`
OperateUser string `mapstructure:"operate_user"`
TimeoutSec int `mapstructure:"timeout_sec"`
Socks5Proxy string `mapstructure:"socks5_proxy"`
}
type PHISConfig struct {
BaseURL string `mapstructure:"base_url"`
Token string `mapstructure:"token"`
RegionCode string `mapstructure:"region_code"`
PollIntervalSec int `mapstructure:"poll_interval_sec"`
}
type RedisConfig struct {
Addr string `mapstructure:"addr"`
DB int `mapstructure:"db"`
}
func Load(path string) (Config, error) {
v := viper.New()
setDefaults(v)
bindEnv(v)
if path != "" {
v.SetConfigFile(path)
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
return Config{}, err
}
}
}
var cfg Config
if err := v.Unmarshal(&cfg); err != nil {
return Config{}, err
}
return cfg, nil
}
func setDefaults(v *viper.Viper) {
v.SetDefault("osi.base_url", "http://<osi-host>")
v.SetDefault("osi.timeout_sec", 20)
v.SetDefault("phis.poll_interval_sec", 5)
v.SetDefault("redis.db", 0)
v.SetDefault("report_log_file_dir", "logs")
v.SetDefault("retry_max", 3)
v.SetDefault("circuit_fail_threshold", 5)
v.SetDefault("circuit_sleep_sec", 60)
}
func bindEnv(v *viper.Viper) {
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
v.AutomaticEnv()
for _, key := range []string{
"osi.base_url",
"osi.org_code",
"osi.user_name",
"osi.ask",
"osi.device_sn",
"osi.operate_user",
"osi.timeout_sec",
"osi.socks5_proxy",
"phis.base_url",
"phis.token",
"phis.region_code",
"phis.poll_interval_sec",
"redis.addr",
"redis.db",
"report_log_file_dir",
"retry_max",
"circuit_fail_threshold",
"circuit_sleep_sec",
} {
_ = v.BindEnv(key)
}
}