package config import ( "encoding/json" "errors" "fmt" "log" "net" "os" "path/filepath" "strings" "SIMANC-WCS/app" "SIMANC-WCS/lib/server" ) // 配置文件名称 const configName = "config.json" // ReadFile 从数据目录中读取 name func ReadFile(name string) ([]byte, error) { fileName := filepath.Join(app.DataPath, name) _, err := os.Stat(fileName) if err != nil { return nil, err } b, err := os.ReadFile(fileName) if err != nil { log.Println(err) return nil, err } return b, nil } // Config 配置文件 type Config struct { // Servers 服务器地址, 其中第一个元素作为主服务器, 剩余作为备用服务器 Servers []string `json:"servers"` } func (c *Config) saveConfig(config Config) error { b, err := json.Marshal(config) if err != nil { return err } if err = os.MkdirAll(app.DataPath, os.ModePerm); err != nil { return err } dir := filepath.Join(app.DataPath, configName) return os.WriteFile(dir, b, os.ModePerm) } // GetConfig 获取配置文件 func (c *Config) GetConfig() (Config, error) { b, err := ReadFile(configName) if err != nil { return Config{}, err } var config Config if err = json.Unmarshal(b, &config); err != nil { return Config{}, err } return config, nil } // SaveConfig 保存配置文件 // 保存时需要校验所有配置项 func (c *Config) SaveConfig(cfg Config) error { if len(cfg.Servers) < 1 { return errors.New("no servers") } for i, address := range cfg.Servers { if !strings.Contains(address, ":") { // 端口号不存在时添加默认端口 address = net.JoinHostPort(address, "80") } _, _, err := net.SplitHostPort(address) if err != nil { return fmt.Errorf("invalid server address: %s", err) } cfg.Servers[i] = address } // 测试服务器是否联通 if err := server.ConnectTest(app.Context, cfg.Servers); err != nil { return err } // 保存配置文件 if err := c.saveConfig(cfg); err != nil { return err } // 更新内存数据 c.Servers = cfg.Servers return nil }