cloud_cfg.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/common/config/c_log"
  4. "cicv-data-closedloop/pji/common/cutil"
  5. "gopkg.in/yaml.v3"
  6. "os"
  7. "sync"
  8. "time"
  9. )
  10. type Platform struct {
  11. UrlDeviceAuth string `yaml:"url-device-auth"`
  12. UrlTaskPoll string `yaml:"url-task-poll"`
  13. UrlTask string `yaml:"url-task"`
  14. }
  15. type Host struct {
  16. Name string `yaml:"name"`
  17. Ip string `yaml:"ip"`
  18. Topics []string `yaml:"topics"`
  19. }
  20. type Ros struct {
  21. MasterAddress string `yaml:"master-address"`
  22. Nodes []string `yaml:"nodes"`
  23. }
  24. type cloudConfig struct {
  25. FullCollect bool `yaml:"full-collect"`
  26. ConfigRefreshInterval int `yaml:"config-refresh-interval"` // 配置刷新时间间隔
  27. BagNumber int `yaml:"bag-number"`
  28. TimeWindowSendGap int `yaml:"time-window-send-gap"` // 主节点向从节点发送窗口的最小时间间隔
  29. DiskUsage float64 `yaml:"disk-usage"`
  30. BagDataDir string `yaml:"bag-data-dir"`
  31. BagCopyDir string `yaml:"bag-copy-dir"`
  32. TriggersDir string `yaml:"triggers-dir"`
  33. TcpPort string `yaml:"tcp-port"`
  34. RpcPort string `yaml:"rpc-port"`
  35. Triggers []Trigger `yaml:"triggers"`
  36. Hosts []Host `yaml:"hosts"`
  37. Ros Ros `yaml:"ros"`
  38. Platform Platform `yaml:"platform"`
  39. }
  40. type Trigger struct {
  41. Label string `yaml:"label"`
  42. Topics []string `yaml:"topics"`
  43. }
  44. var (
  45. CloudConfig cloudConfig
  46. CloudConfigMutex sync.RWMutex
  47. )
  48. // InitCloudConfig 初始化业务配置
  49. func InitCloudConfig() {
  50. c_log.GlobalLogger.Info("初始化OSS配置文件 - 开始。")
  51. // 获取文件的目录
  52. cutil.CreateParentDir(LocalConfig.CloudConfigLocalPath)
  53. // 3 ------- 获取 yaml 字符串 -------
  54. var content []byte
  55. cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
  56. err := OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
  57. if err != nil {
  58. c_log.GlobalLogger.Error("程序崩溃,下载oss上的配置文件"+cloudConfigObjectKey+"失败。", err)
  59. os.Exit(-1)
  60. }
  61. content, err = os.ReadFile(LocalConfig.CloudConfigLocalPath)
  62. if err != nil {
  63. c_log.GlobalLogger.Error("程序崩溃,配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
  64. os.Exit(-1)
  65. }
  66. // 4 ------- 解析YAML内容 -------
  67. var newCloudConfig cloudConfig
  68. err = yaml.Unmarshal(content, &newCloudConfig)
  69. if err != nil {
  70. c_log.GlobalLogger.Error("程序崩溃,配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
  71. os.Exit(-1)
  72. }
  73. // 5 ------- 校验 yaml -------
  74. if checkConfig(newCloudConfig) {
  75. CloudConfigMutex.RLock()
  76. CloudConfig = newCloudConfig
  77. CloudConfigMutex.RUnlock()
  78. } else {
  79. c_log.GlobalLogger.Error("程序崩溃,配置文件格式错误:", newCloudConfig)
  80. os.Exit(-1)
  81. }
  82. c_log.GlobalLogger.Info("初始化OSS配置文件 - 成功。")
  83. cutil.CreateDir(CloudConfig.BagDataDir)
  84. cutil.CreateDir(CloudConfig.BagCopyDir)
  85. }
  86. // refreshCloudConfig 更新业务配置
  87. func refreshCloudConfig() {
  88. // 获取文件的目录
  89. cutil.CreateParentDir(LocalConfig.CloudConfigLocalPath)
  90. // 3 ------- 获取 yaml 字符串 -------
  91. var content []byte
  92. cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
  93. err := OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
  94. if err != nil {
  95. c_log.GlobalLogger.Error("下载oss上的配置文件"+cloudConfigObjectKey+"失败。", err)
  96. //os.Exit(-1)
  97. }
  98. content, err = os.ReadFile(LocalConfig.CloudConfigLocalPath)
  99. if err != nil {
  100. c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
  101. os.Exit(-1)
  102. }
  103. // 4 ------- 解析YAML内容 -------
  104. var newCloudConfig cloudConfig
  105. err = yaml.Unmarshal(content, &newCloudConfig)
  106. if err != nil {
  107. c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
  108. os.Exit(-1)
  109. }
  110. // 5 ------- 校验 yaml -------
  111. if checkConfig(newCloudConfig) {
  112. CloudConfigMutex.RLock()
  113. CloudConfig = newCloudConfig
  114. CloudConfigMutex.RUnlock()
  115. } else {
  116. c_log.GlobalLogger.Error("配置文件格式错误:", newCloudConfig)
  117. os.Exit(-1)
  118. }
  119. cutil.CreateDir(CloudConfig.BagDataDir)
  120. cutil.CreateDir(CloudConfig.BagCopyDir)
  121. }
  122. // RefreshCloudConfig 轮询oss上的配置文件更新到本地
  123. func RefreshCloudConfig() {
  124. for {
  125. time.Sleep(time.Duration(CloudConfig.ConfigRefreshInterval) * time.Second)
  126. refreshCloudConfig()
  127. }
  128. }
  129. // CheckConfig 校验 cfg.yaml 文件
  130. func checkConfig(check cloudConfig) bool {
  131. if len(check.Hosts) != 1 {
  132. c_log.GlobalLogger.Error("cloud-config.yaml中配置的hosts必须为1。")
  133. os.Exit(-1)
  134. }
  135. return true
  136. }