config.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. serverNodeTemp.XuguAddr = value
  43. }
  44. }
  45. //k,v读取出来的是父节点的参数
  46. for key, value := range config.v.GetStringMapString("node") {
  47. //读取的是[node]的子组[node.*]
  48. subNodeConfigTempMap := config.v.GetStringMapString(fmt.Sprintf("node." + key))
  49. if len(subNodeConfigTempMap) != 0 {
  50. //子组[node.*]参数解析
  51. serverNodeTemp := models.ServerNodeInfo{}
  52. for k, v := range subNodeConfigTempMap {
  53. selectNodeConfig(k, v, &serverNodeTemp)
  54. }
  55. //config.subNodeConfig[fmt.Sprintf("node."+key)] = &serverNodeTemp
  56. config.subNodeConfig[key] = &serverNodeTemp
  57. }
  58. //基类节点的参数解析
  59. selectNodeConfig(key, value, config.baseNodeConfig)
  60. }
  61. //检查子节点配置信息是否为空,为空则用基节点信息替换
  62. for _, serverNodeTemp := range config.subNodeConfig {
  63. checkServerNodeInfoIsEmpty(serverNodeTemp, config.baseNodeConfig)
  64. }
  65. //获取配置文件里的xugu
  66. for key, value := range config.v.GetStringMapString("xugu") {
  67. config.xginiMap[key] = value
  68. }
  69. //获取配置文件里的cluster
  70. for key, value := range config.v.GetStringMapString("cluster") {
  71. config.clusterMap[key] = value
  72. }
  73. //输出服务器节点配置信息
  74. // fmt.Printf("config.baseNodeConfig: %v\n", config.baseNodeConfig)
  75. // for k, v := range config.subNodeConfig {
  76. // fmt.Printf("subNodeConfigK: %s,subNodeConfigV: %v \n", k, *v)
  77. // }
  78. }
  79. func (config *configFile) openConfigFile(path string) {
  80. //读取指定config.toml配置文件
  81. config.v.SetConfigType("toml")
  82. config.v.SetConfigFile(path)
  83. if err := config.v.ReadInConfig(); err != nil {
  84. log.Fatalf("读取配置文件失败: %v", err)
  85. }
  86. }
  87. // 检查服务器节点配置信息是否为空,为空则用基节点信息替换
  88. func checkServerNodeInfoIsEmpty(nodeInfo *models.ServerNodeInfo, baseNodeInfo *models.ServerNodeInfo) {
  89. isEmpty := func(s string) bool {
  90. return len(s) == 0
  91. }
  92. // if isEmpty(nodeInfo.IpPort) {
  93. // nodeInfo.IpPort = baseNodeInfo.IpPort
  94. // }
  95. if isEmpty(nodeInfo.LocalFile) {
  96. nodeInfo.LocalFile = baseNodeInfo.LocalFile
  97. }
  98. if isEmpty(nodeInfo.TargetFile) {
  99. nodeInfo.TargetFile = baseNodeInfo.TargetFile
  100. }
  101. if isEmpty(nodeInfo.User) {
  102. nodeInfo.User = baseNodeInfo.User
  103. }
  104. if isEmpty(nodeInfo.Password) {
  105. nodeInfo.Password = baseNodeInfo.Password
  106. }
  107. if isEmpty(nodeInfo.XuguAddr) {
  108. nodeInfo.XuguAddr = baseNodeInfo.XuguAddr
  109. }
  110. }
  111. func (config *configFile) GetXuguini() map[string]string {
  112. return config.xginiMap
  113. }
  114. func (config *configFile) GetCluster() map[string]string {
  115. return config.clusterMap
  116. }
  117. func (config *configFile) GetNodeConfig() map[string]*models.ServerNodeInfo {
  118. return config.subNodeConfig
  119. }