123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- package config
- import (
- "cicv-data-closedloop/common/config/c_log"
- "cicv-data-closedloop/common/util"
- "gopkg.in/yaml.v3"
- "os"
- "sync"
- "time"
- )
- type platform struct {
- UrlDeviceAuth string `yaml:"url-device-auth"`
- UrlTaskPoll string `yaml:"url-task-poll"`
- UrlTask string `yaml:"url-task"`
- }
- type host struct {
- Name string `yaml:"name"`
- Ip string `yaml:"ip"`
- Topics []string `yaml:"topics"`
- }
- type ros struct {
- MasterAddress string `yaml:"master-address"`
- Nodes []string `yaml:"nodes"`
- }
- type disk struct {
- Name string `yaml:"name"`
- Used uint64 `yaml:"used"`
- }
- type trigger struct {
- Label string `yaml:"label"`
- Topics []string `yaml:"topics"`
- }
- type cloudConfig struct {
- FullCollect bool `yaml:"full-collect"`
- ConfigRefreshInterval int `yaml:"config-refresh-interval"` // 配置刷新时间间隔
- BagNumber int `yaml:"bag-number"`
- TimeWindowSendGap int `yaml:"time-window-send-gap"` // 主节点向从节点发送窗口的最小时间间隔
- TimeToLabelJsonPath string `yaml:"time-to-label-json-path"`
- BagDataDir string `yaml:"bag-data-dir"`
- BagCopyDir string `yaml:"bag-copy-dir"`
- TriggersDir string `yaml:"triggers-dir"`
- TcpPort string `yaml:"tcp-port"`
- RpcPort string `yaml:"rpc-port"`
- Triggers []trigger `yaml:"triggers"`
- Hosts []host `yaml:"hosts"`
- Ros ros `yaml:"ros"`
- Platform platform `yaml:"platform"`
- Disk disk `yaml:"disk"`
- }
- var (
- CloudConfig cloudConfig
- CloudConfigMutex sync.RWMutex
- )
- // InitCloudConfig 初始化业务配置
- func InitCloudConfig() {
- c_log.GlobalLogger.Info("初始化OSS配置文件 - 开始。")
- // 获取文件的目录
- _ = util.CreateParentDir(LocalConfig.CloudConfigLocalPath)
- // 3 ------- 获取 yaml 字符串 -------
- var content []byte
- cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
- err := OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
- if err != nil {
- c_log.GlobalLogger.Error("下载oss上的配置文件"+cloudConfigObjectKey+"失败。", err)
- os.Exit(-1)
- }
- content, err = os.ReadFile(LocalConfig.CloudConfigLocalPath)
- if err != nil {
- c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
- os.Exit(-1)
- }
- // 4 ------- 解析YAML内容 -------
- var newCloudConfig cloudConfig
- err = yaml.Unmarshal(content, &newCloudConfig)
- if err != nil {
- c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
- os.Exit(-1)
- }
- // 5 ------- 校验 yaml -------
- if checkConfig(newCloudConfig) {
- CloudConfigMutex.RLock()
- CloudConfig = newCloudConfig
- CloudConfigMutex.RUnlock()
- } else {
- c_log.GlobalLogger.Error("配置文件格式错误:", newCloudConfig)
- os.Exit(-1)
- }
- c_log.GlobalLogger.Info("初始化OSS配置文件 - 成功。")
- _ = util.CreateDir(CloudConfig.BagDataDir)
- _ = util.CreateDir(CloudConfig.BagCopyDir)
- timeToLabelJson, _ := util.MapToJsonString(map[string]interface{}{"time": "label"})
- _ = util.WriteFile(timeToLabelJson, CloudConfig.TimeToLabelJsonPath)
- }
- // RefreshCloudConfig 初始化业务配置
- func refreshCloudConfig() {
- // 获取文件的目录
- _ = util.CreateParentDir(LocalConfig.CloudConfigLocalPath)
- // 3 ------- 获取 yaml 字符串 -------
- var content []byte
- cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
- err := OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
- if err != nil {
- c_log.GlobalLogger.Error("下载oss上的配置文件"+cloudConfigObjectKey+"失败。", err)
- return
- }
- content, err = os.ReadFile(LocalConfig.CloudConfigLocalPath)
- if err != nil {
- c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
- return
- }
- // 4 ------- 解析YAML内容 -------
- var newCloudConfig cloudConfig
- err = yaml.Unmarshal(content, &newCloudConfig)
- if err != nil {
- c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
- return
- }
- // 5 ------- 校验 yaml -------
- if checkConfig(newCloudConfig) {
- CloudConfigMutex.RLock()
- CloudConfig = newCloudConfig
- CloudConfigMutex.RUnlock()
- } else {
- c_log.GlobalLogger.Error("配置文件格式错误:", newCloudConfig)
- return
- }
- util.CreateDir(CloudConfig.BagDataDir)
- util.CreateDir(CloudConfig.BagCopyDir)
- }
- // RefreshCloudConfig 轮询oss上的配置文件更新到本地
- func RefreshCloudConfig() {
- for {
- time.Sleep(time.Duration(CloudConfig.ConfigRefreshInterval) * time.Second)
- refreshCloudConfig()
- }
- }
- // CheckConfig 校验 cfg.yaml 文件
- func checkConfig(check cloudConfig) bool {
- if len(check.Hosts) != 2 {
- c_log.GlobalLogger.Error("cloud-config.yaml中配置的hosts必须为2。")
- os.Exit(-1)
- }
- return true
- }
|