201 lines
4.3 KiB
Go
201 lines
4.3 KiB
Go
//go:build linux
|
|
// +build linux
|
|
|
|
package utils
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
// getCPUInfoPlatform 获取Linux下的CPU信息
|
|
func (s *SysUtils) getCPUInfoPlatform(info *CPUInfo) {
|
|
file, err := os.Open("/proc/cpuinfo")
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if strings.HasPrefix(line, "model name") {
|
|
parts := strings.Split(line, ":")
|
|
if len(parts) > 1 {
|
|
info.ModelName = strings.TrimSpace(parts[1])
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// getMemoryInfoPlatform 获取Linux下的内存信息
|
|
func (s *SysUtils) getMemoryInfoPlatform(info *MemoryInfo) {
|
|
file, err := os.Open("/proc/meminfo")
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
fields := strings.Fields(line)
|
|
if len(fields) < 2 {
|
|
continue
|
|
}
|
|
|
|
value, err := strconv.ParseUint(fields[1], 10, 64)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
value *= 1024 // Convert KB to bytes
|
|
|
|
switch fields[0] {
|
|
case "MemTotal:":
|
|
info.Total = value
|
|
case "MemAvailable:":
|
|
info.Available = value
|
|
}
|
|
}
|
|
|
|
if info.Total > 0 && info.Available > 0 {
|
|
info.Used = info.Total - info.Available
|
|
}
|
|
}
|
|
|
|
// getDiskUsagePlatform Linux平台获取磁盘信息
|
|
func (s *SysUtils) getDiskUsagePlatform(path string) (*DiskInfo, error) {
|
|
var stat syscall.Statfs_t
|
|
err := syscall.Statfs(path, &stat)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("获取磁盘信息失败: %w", err)
|
|
}
|
|
|
|
total := stat.Blocks * uint64(stat.Bsize)
|
|
free := stat.Bavail * uint64(stat.Bsize)
|
|
used := total - free
|
|
usedPct := float64(used) / float64(total) * 100
|
|
|
|
return &DiskInfo{
|
|
Path: path,
|
|
Total: total,
|
|
Free: free,
|
|
Used: used,
|
|
UsedPct: usedPct,
|
|
FileSystem: "ext4", // Linux通常是ext4,这里简化处理
|
|
}, nil
|
|
}
|
|
|
|
// getAllMountPoints 获取所有挂载点
|
|
func (s *SysUtils) getAllMountPoints() ([]string, error) {
|
|
// 读取/proc/mounts文件
|
|
content, err := os.ReadFile("/proc/mounts")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("读取挂载点失败: %w", err)
|
|
}
|
|
|
|
var mountPoints []string
|
|
lines := strings.Split(string(content), "\n")
|
|
|
|
for _, line := range lines {
|
|
fields := strings.Fields(line)
|
|
if len(fields) >= 2 {
|
|
mountPoint := fields[1]
|
|
// 过滤掉一些虚拟文件系统
|
|
if !strings.HasPrefix(mountPoint, "/proc") &&
|
|
!strings.HasPrefix(mountPoint, "/sys") &&
|
|
!strings.HasPrefix(mountPoint, "/dev") &&
|
|
mountPoint != "/" {
|
|
mountPoints = append(mountPoints, mountPoint)
|
|
}
|
|
}
|
|
}
|
|
|
|
return mountPoints, nil
|
|
}
|
|
|
|
// getAllDisksInfoPlatform Linux平台获取所有磁盘信息
|
|
func (s *SysUtils) getAllDisksInfoPlatform() ([]*DiskInfo, error) {
|
|
var disks []*DiskInfo
|
|
|
|
// 通常检查根目录和常见挂载点
|
|
commonPaths := []string{"/", "/home", "/var", "/tmp"}
|
|
|
|
for _, path := range commonPaths {
|
|
if _, err := os.Stat(path); err == nil {
|
|
diskInfo, err := s.GetDiskUsage(path)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
disks = append(disks, diskInfo)
|
|
}
|
|
}
|
|
|
|
// 也可以尝试从挂载点获取
|
|
mountPoints, err := s.getAllMountPoints()
|
|
if err == nil {
|
|
for _, mount := range mountPoints {
|
|
diskInfo, err := s.GetDiskUsage(mount)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
// 检查是否已经存在
|
|
exists := false
|
|
for _, d := range disks {
|
|
if d.Path == diskInfo.Path {
|
|
exists = true
|
|
break
|
|
}
|
|
}
|
|
if !exists {
|
|
disks = append(disks, diskInfo)
|
|
}
|
|
}
|
|
}
|
|
|
|
return disks, nil
|
|
}
|
|
|
|
// getGPUInfoPlatform 获取Linux下的GPU信息
|
|
func (s *SysUtils) getGPUInfoPlatform() []string {
|
|
var gpus []string
|
|
|
|
// 尝试使用lspci获取GPU信息
|
|
cmd := exec.Command("lspci")
|
|
output, err := cmd.Output()
|
|
if err != nil {
|
|
return gpus
|
|
}
|
|
|
|
lines := strings.Split(string(output), "\n")
|
|
for _, line := range lines {
|
|
if strings.Contains(strings.ToLower(line), "vga") ||
|
|
strings.Contains(strings.ToLower(line), "3d") ||
|
|
strings.Contains(strings.ToLower(line), "display") {
|
|
gpus = append(gpus, strings.TrimSpace(line))
|
|
}
|
|
}
|
|
|
|
return gpus
|
|
}
|
|
|
|
// getSystemUptime 获取Linux系统启动时间
|
|
func (s *SysUtils) getSystemUptime() time.Duration {
|
|
file, err := os.Open("/proc/uptime")
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
defer file.Close()
|
|
|
|
var uptime float64
|
|
fmt.Fscanf(file, "%f", &uptime)
|
|
return time.Duration(uptime) * time.Second
|
|
}
|