package nodeconfigs import ( "encoding/json" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/iwind/TeaGo/Tea" "io/ioutil" ) var sharedNodeConfig *NodeConfig = nil type NodeConfig struct { Id string `yaml:"id" json:"id"` IsOn bool `yaml:"isOn" json:"isOn"` Servers []*serverconfigs.ServerConfig `yaml:"servers" json:"servers"` Version int64 `yaml:"version" json:"version"` Name string `yaml:"name" json:"name"` // 全局配置 GlobalConfig *serverconfigs.GlobalConfig `yaml:"globalConfig" json:"globalConfig"` // 全局配置 } // 取得当前节点配置单例 func SharedNodeConfig() (*NodeConfig, error) { shared.Locker.Lock() defer shared.Locker.Unlock() if sharedNodeConfig != nil { return sharedNodeConfig, nil } data, err := ioutil.ReadFile(Tea.ConfigFile("node.json")) if err != nil { return &NodeConfig{}, err } config := &NodeConfig{} err = json.Unmarshal(data, &config) if err != nil { return &NodeConfig{}, err } sharedNodeConfig = config return config, nil } // 重置节点配置 func ResetNodeConfig(nodeConfig *NodeConfig) { shared.Locker.Lock() sharedNodeConfig = nodeConfig shared.Locker.Unlock() } // 根据网络地址和协议分组 func (this *NodeConfig) AvailableGroups() []*serverconfigs.ServerGroup { groupMapping := map[string]*serverconfigs.ServerGroup{} // protocol://addr => Server Group for _, server := range this.Servers { if !server.IsOn { continue } for _, addr := range server.FullAddresses() { group, ok := groupMapping[addr] if ok { group.Add(server) } else { group = serverconfigs.NewServerGroup(addr) group.Add(server) } groupMapping[addr] = group } } result := []*serverconfigs.ServerGroup{} for _, group := range groupMapping { result = append(result, group) } return result } func (this *NodeConfig) Init() error { for _, server := range this.Servers { err := server.Init() if err != nil { return err } } return nil } // 写入到文件 func (this *NodeConfig) Save() error { shared.Locker.Lock() defer shared.Locker.Unlock() data, err := json.Marshal(this) if err != nil { return err } return ioutil.WriteFile(Tea.ConfigFile("node.json"), data, 0777) }