package config import ( "fmt" "log" "xg_auto_deploy/internal/models" "xg_auto_deploy/internal/utils" "github.com/spf13/viper" ) type configFile struct { v *viper.Viper baseNodeConfig *models.ServerNodeInfo subNodeConfig map[string]*models.ServerNodeInfo xginiMap map[string]string clusterMap map[string]string } func InitNodeSetting(path string) *configFile { config := configFile{ v: viper.New(), baseNodeConfig: &models.ServerNodeInfo{}, subNodeConfig: make(map[string]*models.ServerNodeInfo), xginiMap: make(map[string]string), clusterMap: make(map[string]string), } config.openConfigFile(path) config.parseConfigfile() return &config } func (config *configFile) parseConfigfile() { selectNodeConfig := func(key, value string, serverNodeTemp *models.ServerNodeInfo) { switch key { case "ip_port": serverNodeTemp.IpPort = value case "target_file": serverNodeTemp.TargetFile = value case "local_file": serverNodeTemp.LocalFile = value case "user_password": r, l := utils.SplitColon(value) serverNodeTemp.User = r serverNodeTemp.Password = l case "xugu_addr": serverNodeTemp.XuguAddr = value } } //k,v读取出来的是父节点的参数 for key, value := range config.v.GetStringMapString("node") { //读取的是[node]的子组[node.*] subNodeConfigTempMap := config.v.GetStringMapString(fmt.Sprintf("node." + key)) if len(subNodeConfigTempMap) != 0 { //子组[node.*]参数解析 serverNodeTemp := models.ServerNodeInfo{} for k, v := range subNodeConfigTempMap { selectNodeConfig(k, v, &serverNodeTemp) } //config.subNodeConfig[fmt.Sprintf("node."+key)] = &serverNodeTemp config.subNodeConfig[key] = &serverNodeTemp } //基类节点的参数解析 selectNodeConfig(key, value, config.baseNodeConfig) } //检查子节点配置信息是否为空,为空则用基节点信息替换 for _, serverNodeTemp := range config.subNodeConfig { checkServerNodeInfoIsEmpty(serverNodeTemp, config.baseNodeConfig) } //获取配置文件里的xugu for key, value := range config.v.GetStringMapString("xugu") { config.xginiMap[key] = value } //获取配置文件里的cluster for key, value := range config.v.GetStringMapString("cluster") { config.clusterMap[key] = value } //输出服务器节点配置信息 // fmt.Printf("config.baseNodeConfig: %v\n", config.baseNodeConfig) // for k, v := range config.subNodeConfig { // fmt.Printf("subNodeConfigK: %s,subNodeConfigV: %v \n", k, *v) // } } func (config *configFile) openConfigFile(path string) { //读取指定config.toml配置文件 config.v.SetConfigType("toml") config.v.SetConfigFile(path) if err := config.v.ReadInConfig(); err != nil { log.Fatalf("读取配置文件失败: %v", err) } } // 检查服务器节点配置信息是否为空,为空则用基节点信息替换 func checkServerNodeInfoIsEmpty(nodeInfo *models.ServerNodeInfo, baseNodeInfo *models.ServerNodeInfo) { isEmpty := func(s string) bool { return len(s) == 0 } // if isEmpty(nodeInfo.IpPort) { // nodeInfo.IpPort = baseNodeInfo.IpPort // } if isEmpty(nodeInfo.LocalFile) { nodeInfo.LocalFile = baseNodeInfo.LocalFile } if isEmpty(nodeInfo.TargetFile) { nodeInfo.TargetFile = baseNodeInfo.TargetFile } if isEmpty(nodeInfo.User) { nodeInfo.User = baseNodeInfo.User } if isEmpty(nodeInfo.Password) { nodeInfo.Password = baseNodeInfo.Password } if isEmpty(nodeInfo.XuguAddr) { nodeInfo.XuguAddr = baseNodeInfo.XuguAddr } } func (config *configFile) GetXuguini() map[string]string { return config.xginiMap } func (config *configFile) GetCluster() map[string]string { return config.clusterMap } func (config *configFile) GetNodeConfig() map[string]*models.ServerNodeInfo { return config.subNodeConfig }