system_services.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package services
  2. import (
  3. "bytes"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "sync"
  8. "time"
  9. "xg_dba/api"
  10. "xg_dba/internal/global"
  11. "xg_dba/internal/models"
  12. "xg_dba/module/remote"
  13. "github.com/BurntSushi/toml"
  14. )
  15. func SetSystemInfo_service(connectInfo api.ConnectInfoRequest, saveFilePath string) error {
  16. //ssh连接服务器
  17. //执行命令
  18. //返回结果并存储到本地
  19. var wg sync.WaitGroup
  20. var mu sync.Mutex
  21. systemInfo := models.SystemMetaInfo{}
  22. commands := map[string]string{
  23. "OS Info": "cat /etc/os-release",
  24. "CPU Info": "lscpu",
  25. "Memory Info": "free -h",
  26. "Disk Info": "df -h",
  27. "Network Info": "ip addr",
  28. "Disk Speed": "dd if=/dev/zero of=/tmp/testfile bs=8K count=102400 oflag=direct; rm -f /tmp/testfile",
  29. "Network Speed": "ping -c 4 8.8.8.8",
  30. }
  31. for name, cmd := range commands {
  32. wg.Add(1)
  33. go func(name, cmd string) {
  34. defer wg.Done()
  35. // 每次执行命令都新建一个 SSH 客户端
  36. sshClient, err := remote.NewSSHClient(connectInfo.Id, connectInfo.Ssh.Username, connectInfo.Ssh.Password, connectInfo.Ssh.Host, connectInfo.Ssh.Port)
  37. if err != nil {
  38. global.Logger.Errorf("NewSSHClient failed for %s: %v", name, err)
  39. return
  40. }
  41. defer sshClient.Close()
  42. output, err := sshClient.RunCommand(cmd)
  43. if err != nil {
  44. global.Logger.Errorf("%s command failed: %v", name, err)
  45. return
  46. }
  47. mu.Lock()
  48. // 根据命令名称将输出赋值到结构体字段
  49. switch name {
  50. case "OS Info":
  51. systemInfo.Os = output
  52. case "CPU Info":
  53. systemInfo.Cpu = output
  54. case "Memory Info":
  55. systemInfo.Memory = output
  56. case "Disk Info":
  57. systemInfo.Disk = output
  58. case "Network Info":
  59. systemInfo.Network = output
  60. case "Disk Speed":
  61. systemInfo.DiskSpeed = output
  62. case "Network Speed":
  63. systemInfo.NetworkSpeed = output
  64. }
  65. mu.Unlock()
  66. fmt.Printf("--%s:\n%s\n", name, output)
  67. }(name, cmd)
  68. }
  69. wg.Wait()
  70. timestamp := time.Now().Format("20060102_150405")
  71. os.MkdirAll(filepath.Dir(saveFilePath), os.ModePerm)
  72. filePath := fmt.Sprintf("%sos_info_%s.toml", saveFilePath, timestamp)
  73. err := saveSystemMetaInfoToFile(systemInfo, filePath)
  74. if err != nil {
  75. fmt.Printf("Error: %v\n", err)
  76. } else {
  77. fmt.Println("System meta info saved successfully")
  78. }
  79. return nil
  80. }
  81. // 保存系统环境信息到文件
  82. func saveSystemMetaInfoToFile(info models.SystemMetaInfo, filePath string) error {
  83. var buffer bytes.Buffer
  84. encoder := toml.NewEncoder(&buffer)
  85. if err := encoder.Encode(info); err != nil {
  86. return fmt.Errorf("failed to encode system meta info to TOML: %v", err)
  87. }
  88. err := os.WriteFile(filePath, buffer.Bytes(), 0644)
  89. if err != nil {
  90. return fmt.Errorf("failed to write to file: %v", err)
  91. }
  92. return nil
  93. }