config.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package config
  2. import (
  3. "fmt"
  4. "log"
  5. "xg_auto_deploy/internal/models"
  6. "xg_auto_deploy/internal/utils"
  7. "github.com/spf13/viper"
  8. )
  9. type configFile struct {
  10. v *viper.Viper
  11. baseNodeConfig *models.ServerNodeInfo
  12. subNodeConfig map[string]*models.ServerNodeInfo
  13. xginiMap map[string]string
  14. clusterMap map[string]string
  15. }
  16. func InitNodeSetting(path string) *configFile {
  17. config := configFile{
  18. v: viper.New(),
  19. baseNodeConfig: &models.ServerNodeInfo{},
  20. subNodeConfig: make(map[string]*models.ServerNodeInfo),
  21. xginiMap: make(map[string]string),
  22. clusterMap: make(map[string]string),
  23. }
  24. config.openConfigFile(path)
  25. config.parseConfigfile()
  26. return &config
  27. }
  28. func (config *configFile) parseConfigfile() {
  29. selectNodeConfig := func(key, value string, serverNodeTemp *models.ServerNodeInfo) {
  30. switch key {
  31. case "ip_port":
  32. serverNodeTemp.IpPort = value
  33. case "target_file":
  34. serverNodeTemp.TargetFile = value
  35. case "local_file":
  36. serverNodeTemp.LocalFile = value
  37. case "user_password":
  38. r, l := utils.SplitColon(value)
  39. serverNodeTemp.User = r
  40. serverNodeTemp.Password = l
  41. case "xugu_addr":
  42. fmt.Printf("xugu_addr: %s\n", value)
  43. serverNodeTemp.XuguAddr = value
  44. }
  45. }
  46. //k,v读取出来的是父节点的参数
  47. for key, value := range config.v.GetStringMapString("node") {
  48. //读取的是[node]的子组[node.*]
  49. subNodeConfigTempMap := config.v.GetStringMapString(fmt.Sprintf("node." + key))
  50. if len(subNodeConfigTempMap) != 0 {
  51. //子组[node.*]参数解析
  52. serverNodeTemp := models.ServerNodeInfo{}
  53. for k, v := range subNodeConfigTempMap {
  54. selectNodeConfig(k, v, &serverNodeTemp)
  55. }
  56. //config.subNodeConfig[fmt.Sprintf("node."+key)] = &serverNodeTemp
  57. config.subNodeConfig[key] = &serverNodeTemp
  58. }
  59. //基类节点的参数解析
  60. selectNodeConfig(key, value, config.baseNodeConfig)
  61. }
  62. //检查子节点配置信息是否为空,为空则用基节点信息替换
  63. for _, serverNodeTemp := range config.subNodeConfig {
  64. checkServerNodeInfoIsEmpty(serverNodeTemp, config.baseNodeConfig)
  65. }
  66. //获取配置文件里的xugu
  67. for key, value := range config.v.GetStringMapString("xugu") {
  68. config.xginiMap[key] = value
  69. }
  70. //获取配置文件里的cluster
  71. for key, value := range config.v.GetStringMapString("cluster") {
  72. config.clusterMap[key] = value
  73. }
  74. //输出服务器节点配置信息
  75. // fmt.Printf("config.baseNodeConfig: %v\n", config.baseNodeConfig)
  76. // for k, v := range config.subNodeConfig {
  77. // fmt.Printf("subNodeConfigK: %s,subNodeConfigV: %v \n", k, *v)
  78. // }
  79. }
  80. func (config *configFile) openConfigFile(path string) {
  81. //读取指定config.toml配置文件
  82. config.v.SetConfigType("toml")
  83. config.v.SetConfigFile(path)
  84. if err := config.v.ReadInConfig(); err != nil {
  85. log.Fatalf("读取配置文件失败: %v", err)
  86. }
  87. }
  88. // 检查服务器节点配置信息是否为空,为空则用基节点信息替换
  89. func checkServerNodeInfoIsEmpty(nodeInfo *models.ServerNodeInfo, baseNodeInfo *models.ServerNodeInfo) {
  90. isEmpty := func(s string) bool {
  91. return len(s) == 0
  92. }
  93. // if isEmpty(nodeInfo.IpPort) {
  94. // nodeInfo.IpPort = baseNodeInfo.IpPort
  95. // }
  96. if isEmpty(nodeInfo.LocalFile) {
  97. nodeInfo.LocalFile = baseNodeInfo.LocalFile
  98. }
  99. if isEmpty(nodeInfo.TargetFile) {
  100. nodeInfo.TargetFile = baseNodeInfo.TargetFile
  101. }
  102. if isEmpty(nodeInfo.User) {
  103. nodeInfo.User = baseNodeInfo.User
  104. }
  105. if isEmpty(nodeInfo.Password) {
  106. nodeInfo.Password = baseNodeInfo.Password
  107. }
  108. if isEmpty(nodeInfo.XuguAddr) {
  109. nodeInfo.XuguAddr = baseNodeInfo.XuguAddr
  110. }
  111. }
  112. func (config *configFile) GetXuguini() map[string]string {
  113. return config.xginiMap
  114. }
  115. func (config *configFile) GetCluster() map[string]string {
  116. return config.clusterMap
  117. }
  118. func (config *configFile) GetNodeConfig() map[string]*models.ServerNodeInfo {
  119. return config.subNodeConfig
  120. }