Files
argus/rear/pkg/utils/sys_utils_lunix.go
T

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
}