snap.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package flags
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path"
  8. "time"
  9. "github.com/coroot/coroot-node-agent/utils"
  10. "github.com/coroot/coroot-node-agent/utils/modelse"
  11. "github.com/jedib0t/go-pretty/v6/table"
  12. )
  13. func DumpTableFeatures(outputFormat string) {
  14. dumpPath := path.Join(utils.GetDefaultRuntimePath(), "memdump")
  15. fileName := path.Join(dumpPath, "app.snap")
  16. // 打开文件并获取文件信息
  17. file, err := os.Open(fileName)
  18. if err != nil {
  19. fmt.Println("no app.snap")
  20. os.Exit(0)
  21. }
  22. defer file.Close()
  23. // 获取文件修改时间
  24. fileInfo, err := file.Stat()
  25. if err != nil {
  26. fmt.Println("Failed to get file information")
  27. os.Exit(0)
  28. }
  29. fileModTime := fileInfo.ModTime().Format("2006/01/02 15:04:05")
  30. // 读取文件内容
  31. content, err := io.ReadAll(file)
  32. if err != nil {
  33. fmt.Println("Failed to read file content")
  34. os.Exit(0)
  35. }
  36. s := make(map[uint32]modelse.AppStatusInfo)
  37. err = json.Unmarshal(content, &s)
  38. if err != nil {
  39. fmt.Println(err.Error())
  40. os.Exit(0)
  41. }
  42. // 根据输出格式选择显示方式
  43. if outputFormat == "json" {
  44. // JSON格式输出
  45. output := map[string]interface{}{
  46. "snap_updated": fileModTime,
  47. "data": s,
  48. }
  49. jsonData, err := json.MarshalIndent(output, "", " ")
  50. if err != nil {
  51. fmt.Println("Failed to marshal JSON:", err.Error())
  52. os.Exit(1)
  53. }
  54. fmt.Println(string(jsonData))
  55. } else {
  56. // 默认表格格式输出
  57. t := table.NewWriter()
  58. t.SetTitle(fmt.Sprintf("Application Status (Snap Updated: %s)", fileModTime))
  59. for pid, info := range s {
  60. t.AppendRow(table.Row{
  61. //info.AgentID,
  62. //info.UpdateAt,
  63. pid,
  64. info.ProcName,
  65. info.AppName,
  66. info.Language,
  67. info.LanguageVersion,
  68. info.RegisterAt,
  69. info.PreStatus.String(),
  70. info.Status.String(),
  71. info.StackStatus,
  72. })
  73. }
  74. t.SetAutoIndex(true)
  75. t.AppendHeader(table.Row{
  76. //"agent id",
  77. //"update at",
  78. "pid",
  79. "process",
  80. "app name",
  81. "code",
  82. "version",
  83. "reg at",
  84. "app pre status",
  85. "app status",
  86. "stack status",
  87. })
  88. fmt.Println(t.Render())
  89. }
  90. os.Exit(0)
  91. }
  92. func DumpRuleTableFeatures(outputFormat string) {
  93. dumpPath := path.Join(utils.GetDefaultRuntimePath(), "memdump")
  94. fileName := path.Join(dumpPath, "rule.snap")
  95. // 打开文件并获取文件信息
  96. file, err := os.Open(fileName)
  97. if err != nil {
  98. fmt.Println("no rule.snap")
  99. os.Exit(0)
  100. }
  101. defer file.Close()
  102. // 获取文件修改时间
  103. fileInfo, err := file.Stat()
  104. if err != nil {
  105. fmt.Println("Failed to get file information")
  106. os.Exit(0)
  107. }
  108. fileModTime := fileInfo.ModTime().Format("2006/01/02 15:04:05")
  109. // 读取文件内容
  110. content, err := io.ReadAll(file)
  111. if err != nil {
  112. fmt.Println("Failed to read file content")
  113. os.Exit(0)
  114. }
  115. var whiteData modelse.WhiteDataV2
  116. err = json.Unmarshal(content, &whiteData)
  117. if err != nil {
  118. fmt.Println(err.Error())
  119. os.Exit(0)
  120. }
  121. // 根据输出格式选择显示方式
  122. if outputFormat == "json" {
  123. // JSON格式输出
  124. lastUpdatedTime := time.Unix(int64(whiteData.LastUpdatedTime), 0).Format("2006/01/02 15:04:05")
  125. output := map[string]interface{}{
  126. "rule_updated": lastUpdatedTime,
  127. "snap_updated": fileModTime,
  128. "data": whiteData.SettingList,
  129. }
  130. jsonData, err := json.MarshalIndent(output, "", " ")
  131. if err != nil {
  132. fmt.Println("Failed to marshal JSON:", err.Error())
  133. os.Exit(1)
  134. }
  135. fmt.Println(string(jsonData))
  136. } else {
  137. // 默认表格格式输出
  138. t := table.NewWriter()
  139. // 设置表格标题,包含规则更新时间和文件更新时间
  140. lastUpdatedTime := time.Unix(int64(whiteData.LastUpdatedTime), 0).Format("2006/01/02 15:04:05")
  141. t.SetTitle(fmt.Sprintf("Rule Configuration (Rule Updated: %s, Snap Updated: %s)", lastUpdatedTime, fileModTime))
  142. for _, setting := range whiteData.SettingList {
  143. t.AppendRow(table.Row{
  144. setting.AppName,
  145. setting.ProcessKey,
  146. setting.Filters,
  147. setting.WhiteStackSettingInfo.OpenStack,
  148. setting.WhiteStackSettingInfo.WhiteList,
  149. setting.WhiteStackSettingInfo.BlackList,
  150. })
  151. }
  152. t.SetAutoIndex(true)
  153. t.AppendHeader(table.Row{
  154. "App Name",
  155. "Setting rule",
  156. "Filters",
  157. "Stack Switch",
  158. "White List",
  159. "Black List",
  160. })
  161. fmt.Println(t.Render())
  162. }
  163. os.Exit(0)
  164. }