package cmd import ( "encoding/json" "fmt" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" "go.uber.org/zap" "os" "packet-ui/internal/model" "packet-ui/internal/server" "packet-ui/pkg" "packet-ui/pkg/db" "strings" ) func InitConfig() (err error) { if cfgFile != "" { // Use config file from the flag. viper.SetConfigFile(cfgFile) } else { var workdir string // Find workdir. workdir, err = os.Getwd() if err != nil { return err } // set default config file $PWD/conf/application.yml viper.AddConfigPath(workdir + "/conf") viper.SetConfigType("yaml") viper.SetConfigName("application") } configDefault() configWatch() viper.AutomaticEnv() // read in environment variables that match // If a config file is found, read it in. if err = viper.ReadInConfig(); err != nil { return } if err = viper.Unmarshal(model.GetConfig()); err != nil { return } cfgData, _ := json.Marshal(model.GetConfig()) println("config", pkg.B2S(cfgData)) svr := model.GetConfig().Svr if strings.HasPrefix(svr.Address, ":") { svr.Address = "0.0.0.0" + svr.Address } //defer func() { // if e := viper.WriteConfig(); e != nil { // zap.L().Warn("save config err!", zap.Error(e)) // } //}() return err } func configDefault() { // db viper.SetDefault("db.type", db.TypeSQLITE) viper.SetDefault("db.dsn", "./packet-ui.db") // file viper.SetDefault("file.data", "./data/root") // viper. } func configWatch() { viper.OnConfigChange(func(in fsnotify.Event) { eventString := fmt.Sprintf("%s -> `%s`", in.Op, in.Name) zap.L().Info("config file change", zap.String("event", eventString)) if err := viper.Unmarshal(model.GetConfig()); err != nil { zap.L().Info("save config err!", zap.Error(err)) } server.GetSvr().Dispatch(model.GetConfig()) }) viper.WatchConfig() }