| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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
- }
|