package config import ( "bytes" "os" "reflect" "time" utilsConfig "git.familybaby.top/flight/utils/config" "github.com/sirupsen/logrus" _ "github.com/spf13/viper/remote" ) var ( local = utilsConfig.New() ServerName = "upgrade" log = logrus.WithField("module", "config") ) func _default() { local.Register("viper", "remote", false) local.Register("viper", "provider", "") local.Register("viper", "endpoint", "") local.Register("viper", "path", "") local.Register("oss", "type", "local") local.Register("oss", "endpoint", "") local.Register("oss", "access_key", "") local.Register("oss", "access_secret", "") local.Register("oss", "bucket_name", "") local.Register("oss", "base_url", "") local.Register("oss", "secure", false) local.Register("database", "type", "sqlite3") local.Register("database", "url", "./sqlite.db") local.Register("database", "debug", false) local.Register("database", "sync", true) local.Register("log", "compress", true) local.Register("log", "disable_colors", false) local.Register("log", "disable_timestamp", false) local.Register("log", "caller", true) local.Register("log", "filename", "log.txt") local.Register("log", "level", "trace") local.Register("log", "max_age", 30) local.Register("log", "max_backups", 3) local.Register("log", "max_size", 10) local.Register("log", "output", "stdout") local.Register("log", "timestamp_format", "2006-01-02 15:04:05") local.Register("web", "cert", "") local.Register("web", "cors", true) local.Register("web", "debug", true) local.Register("web", "email", "") local.Register("web", "gzip", true) local.Register("web", "hosts", []string{}) local.Register("web", "port", 8080) local.Register("web", "https", "") local.Register("web", "key", ServerName) local.Register("web", "jwt.expire", 7200) local.Register("web", "jwt.method", "SigningMethodHS256") local.Register("service", "name", ServerName) local.Register("service", "description", "通用ota 平台") isExist, err := local.ReadConfigAndFileExist() if err != nil || !isExist { _ = local.Store() } } var oldMap map[string]any func isSame() bool { if oldMap == nil { oldMap = local.Viper.AllSettings() //不做这个操作 将无法通过远程 更新本地配置 b := bytes.NewReader(nil) _ = local.Viper.ReadConfig(b) log.Debug("清空 本地viper 配置") } newMap := local.Viper.AllSettings() return reflect.DeepEqual(oldMap, newMap) } func watchRemote() { for { time.Sleep(time.Second * 60) // delay after each request // currently, only tested with etcd support err := local.Viper.WatchRemoteConfigOnChannel() if err != nil { log.Errorf("unable to read remote config: %v", err) continue } //err = local.Viper.ReadRemoteConfig() //if err != nil { // log.Error("读取viper远端配置失败:", err) //} if !isSame() { err = local.Store() if err == nil { log.Debug("远端配置 修改, 将退出应用", err) os.Exit(0) } } } } func init() { _default() param, err := GetViperParam() if err != nil { log.Error("获取本地viper 配置错误:", err) } else { if param.Remote { local.Viper.SetConfigName("") err = local.Viper.AddRemoteProvider( param.Provider, param.Endpoint, param.Path, ) if err != nil { log.Error("添加viper远端配置失败:", err) } else { err = local.Viper.ReadRemoteConfig() if err != nil { log.Error("读取viper远端配置失败:", err) } else { } go watchRemote() } } } } func GetViperParam() (c viper, err error) { err = local.Unmarshal(&c, "viper") return } func GetLogParam() (c Log, err error) { err = local.Unmarshal(&c, "log") return }