123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package services
- import (
- "bytes"
- "fmt"
- "os"
- "path/filepath"
- "sync"
- "time"
- "xg_dba/api"
- "xg_dba/internal/global"
- "xg_dba/internal/models"
- "xg_dba/module/remote"
- "github.com/BurntSushi/toml"
- )
- func SetSystemInfo_service(connectInfo api.ConnectInfoRequest, saveFilePath string) error {
- //ssh连接服务器
- //执行命令
- //返回结果并存储到本地
- var wg sync.WaitGroup
- var mu sync.Mutex
- systemInfo := models.SystemMetaInfo{}
- commands := map[string]string{
- "OS Info": "cat /etc/os-release",
- "CPU Info": "lscpu",
- "Memory Info": "free -h",
- "Disk Info": "df -h",
- "Network Info": "ip addr",
- "Disk Speed": "dd if=/dev/zero of=/tmp/testfile bs=8K count=102400 oflag=direct; rm -f /tmp/testfile",
- "Network Speed": "ping -c 4 8.8.8.8",
- }
- for name, cmd := range commands {
- wg.Add(1)
- go func(name, cmd string) {
- defer wg.Done()
- // 每次执行命令都新建一个 SSH 客户端
- sshClient, err := remote.NewSSHClient(connectInfo.Id, connectInfo.Ssh.Username, connectInfo.Ssh.Password, connectInfo.Ssh.Host, connectInfo.Ssh.Port)
- if err != nil {
- global.Logger.Errorf("NewSSHClient failed for %s: %v", name, err)
- return
- }
- defer sshClient.Close()
- output, err := sshClient.RunCommand(cmd)
- if err != nil {
- global.Logger.Errorf("%s command failed: %v", name, err)
- return
- }
- mu.Lock()
- // 根据命令名称将输出赋值到结构体字段
- switch name {
- case "OS Info":
- systemInfo.Os = output
- case "CPU Info":
- systemInfo.Cpu = output
- case "Memory Info":
- systemInfo.Memory = output
- case "Disk Info":
- systemInfo.Disk = output
- case "Network Info":
- systemInfo.Network = output
- case "Disk Speed":
- systemInfo.DiskSpeed = output
- case "Network Speed":
- systemInfo.NetworkSpeed = output
- }
- mu.Unlock()
- fmt.Printf("--%s:\n%s\n", name, output)
- }(name, cmd)
- }
- wg.Wait()
- timestamp := time.Now().Format("20060102_150405")
- os.MkdirAll(filepath.Dir(saveFilePath), os.ModePerm)
- filePath := fmt.Sprintf("%sos_info_%s.toml", saveFilePath, timestamp)
- err := saveSystemMetaInfoToFile(systemInfo, filePath)
- if err != nil {
- fmt.Printf("Error: %v\n", err)
- } else {
- fmt.Println("System meta info saved successfully")
- }
- return nil
- }
- // 保存系统环境信息到文件
- func saveSystemMetaInfoToFile(info models.SystemMetaInfo, filePath string) error {
- var buffer bytes.Buffer
- encoder := toml.NewEncoder(&buffer)
- if err := encoder.Encode(info); err != nil {
- return fmt.Errorf("failed to encode system meta info to TOML: %v", err)
- }
- err := os.WriteFile(filePath, buffer.Bytes(), 0644)
- if err != nil {
- return fmt.Errorf("failed to write to file: %v", err)
- }
- return nil
- }
|