apm_white_list_v2.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package containers
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/coroot/coroot-node-agent/common"
  6. "github.com/coroot/coroot-node-agent/utils"
  7. . "github.com/coroot/coroot-node-agent/utils/modelse"
  8. log "github.com/sirupsen/logrus"
  9. "os"
  10. "path"
  11. "strings"
  12. )
  13. func (r *Registry) getWhiteListAll() []WhiteSettingInfo {
  14. return r.whiteListRules["all"]
  15. }
  16. func (r *Registry) getWhiteListFromEnv() (WhiteDataV2, error) {
  17. whitelistStr := os.Getenv("Whitelist")
  18. if whitelistStr == "" {
  19. return WhiteDataV2{}, fmt.Errorf("Whitelist environment variable is not set")
  20. }
  21. // 按逗号分割字符串
  22. appRules := strings.Split(whitelistStr, ",")
  23. var settingList []WhiteSettingInfo
  24. for _, appRule := range appRules {
  25. // 去除前后空格
  26. appRule = strings.TrimSpace(appRule)
  27. if appRule == "" {
  28. continue
  29. }
  30. // 按冒号分割 appname:rule
  31. parts := strings.Split(appRule, ":")
  32. if len(parts) != 2 {
  33. log.Warnf("Invalid whitelist format: %s, expected 'appname:rule'", appRule)
  34. continue
  35. }
  36. appName := strings.TrimSpace(parts[0])
  37. rule := strings.TrimSpace(parts[1])
  38. if appName == "" || rule == "" {
  39. log.Warnf("Empty appname or rule in: %s", appRule)
  40. continue
  41. }
  42. // 创建 WhiteSettingInfo 结构
  43. setting := WhiteSettingInfo{
  44. AppName: appName,
  45. ProcessKey: rule,
  46. Filters: rule, // 根据现有代码逻辑,Filters 设置为 ProcessKey
  47. }
  48. settingList = append(settingList, setting)
  49. }
  50. return WhiteDataV2{
  51. SettingList: settingList,
  52. LastUpdatedTime: 0, // 环境变量配置没有时间戳
  53. }, nil
  54. }
  55. func (r *Registry) setWhiteListV2(whiteData WhiteDataV2) {
  56. whiteListMap := make(WhiteListMap)
  57. code := "all"
  58. for _, setting := range whiteData.SettingList {
  59. setting.Filters = setting.ProcessKey
  60. whiteListMap[code] = append(whiteListMap[code], setting)
  61. }
  62. r.whiteListRules = whiteListMap
  63. }
  64. func (r *Registry) pullWhiteListV2() (bool, error) {
  65. if r.isFusing {
  66. return false, nil
  67. }
  68. if common.IsOpenFilter() {
  69. return false, nil
  70. }
  71. // 优先尝试从环境变量获取白名单配置
  72. whiteData, err := r.getWhiteListFromEnv()
  73. if err == nil {
  74. // 环境变量配置成功,使用环境变量配置
  75. log.Infof("Using whitelist configuration from environment variable")
  76. // 将白名单配置转换为 JSON 字符串并输出日志
  77. whiteDataJSON, jsonErr := json.Marshal(whiteData)
  78. if jsonErr != nil {
  79. log.Errorf("Failed to marshal whitelist data to JSON: %v", jsonErr)
  80. } else {
  81. log.Infof("Whitelist configuration from environment variable: %s", string(whiteDataJSON))
  82. }
  83. r.whiteLastUpdatedTime = whiteData.LastUpdatedTime
  84. r.setWhiteListV2(whiteData)
  85. saveRule(whiteData)
  86. return true, nil
  87. }
  88. // 环境变量配置失败,回退到原有的 WhiteListV2 函数
  89. log.Infof("Environment variable whitelist not available, falling back to server API: %v", err)
  90. nodeInfo := r.nodeInfo.GetNodeInfo()
  91. if nodeInfo == nil {
  92. return false, fmt.Errorf("could not find node info")
  93. }
  94. whiteListReq := WhiteListReq{
  95. HostId: nodeInfo.HostID,
  96. AccountId: nodeInfo.AccountID,
  97. WhiteType: 2,
  98. }
  99. whiteData, err = r.connServer.WhiteListV2(whiteListReq)
  100. if err != nil {
  101. log.Errorf("report WhiteList info error is %v.", err)
  102. return false, err
  103. }
  104. //fmt.Println(r.whiteLastUpdatedTime)
  105. //fmt.Println(whiteData.LastUpdatedTime)
  106. // 后端切换主机与全局规则时,时间不会变化
  107. // 不用更新
  108. //if r.whiteLastUpdatedTime == whiteData.LastUpdatedTime {
  109. // return false, nil
  110. //}
  111. //
  112. //// 更新时间
  113. r.whiteLastUpdatedTime = whiteData.LastUpdatedTime
  114. r.setWhiteListV2(whiteData)
  115. saveRule(whiteData)
  116. return true, nil
  117. }
  118. func saveRule(runtimeApps WhiteDataV2) {
  119. appStr, _ := json.Marshal(runtimeApps)
  120. dumpPath := path.Join(utils.GetDefaultRuntimePath(), "memdump")
  121. err := os.MkdirAll(dumpPath, 0755)
  122. if err != nil {
  123. log.Error(err)
  124. }
  125. fileName := path.Join(dumpPath, "rule.snap")
  126. err = os.WriteFile(fileName, appStr, 0644)
  127. if err != nil {
  128. log.Error(err)
  129. }
  130. }