164 lines
3.3 KiB
Go
164 lines
3.3 KiB
Go
package services
|
|
|
|
import (
|
|
"bufio"
|
|
"cmii-uav-watchdog-common/models"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// NewCPUInfo 创建一个默认的 CPUInfo
|
|
func NewCPUInfo() models.CPUInfo {
|
|
return models.CPUInfo{
|
|
ModelName: "unknown",
|
|
Cores: 0,
|
|
Architecture: "unknown",
|
|
UUID: "unknown",
|
|
}
|
|
}
|
|
|
|
const (
|
|
exePath = "/proc/self/exe"
|
|
elfMagic = 0x7f
|
|
elfMagicString = "ELF"
|
|
eMachineOffset = 18
|
|
)
|
|
|
|
// parseLine 解析单行 CPU 信息
|
|
func parseLine(line string, cpuInfo *models.CPUInfo) {
|
|
if strings.HasPrefix(line, "model name") {
|
|
cpuInfo.ModelName = strings.TrimSpace(strings.Split(line, ":")[1])
|
|
}
|
|
}
|
|
|
|
// getCPUCores 通过 processor 行获取 CPU 核心数
|
|
func getCPUCores() (int, error) {
|
|
cores := 0
|
|
file, err := os.Open("/proc/cpuinfo")
|
|
if err != nil {
|
|
return cores, err
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if strings.HasPrefix(line, "processor") {
|
|
cores++
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
return cores, err
|
|
}
|
|
|
|
return cores, nil
|
|
}
|
|
|
|
// getCPUUUID 获取 CPU UUID
|
|
func getCPUUUID() (string, error) {
|
|
data, err := os.ReadFile("/sys/class/dmi/id/product_uuid")
|
|
if err != nil {
|
|
return "unknown", err
|
|
}
|
|
return strings.TrimSpace(string(data)), nil
|
|
}
|
|
|
|
func getCPUArchitecture() string {
|
|
cpuarch := "unknown"
|
|
|
|
// 打开当前进程的执行文件
|
|
file, err := os.Open(exePath)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Error opening %s: %v\n", exePath, err)
|
|
return cpuarch
|
|
}
|
|
defer file.Close()
|
|
|
|
// 读取前64个字节以获取 ELF 头部信息
|
|
header := make([]byte, 64)
|
|
if _, err := file.Read(header); err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Error reading header: %v\n", err)
|
|
return cpuarch
|
|
}
|
|
|
|
// 检查 ELF 文件标识
|
|
if header[0] != elfMagic || string(header[1:4]) != elfMagicString {
|
|
_, _ = fmt.Fprintln(os.Stderr, "File is not an ELF file")
|
|
return cpuarch
|
|
}
|
|
|
|
// 获取架构信息
|
|
arch := header[eMachineOffset] // e_machine 字段的偏移量
|
|
switch arch {
|
|
case 0x02: // EM_386
|
|
cpuarch = "x86(32-bit)"
|
|
case 0x03: // EM_X86_64
|
|
cpuarch = "x86_64(64-bit)"
|
|
case 0x28: // EM_ARM
|
|
cpuarch = "ARM"
|
|
case 0x2A: // EM_ARM64
|
|
cpuarch = "ARM64"
|
|
case 0x08: // EM_MIPS
|
|
cpuarch = "MIPS"
|
|
default:
|
|
cpuarch = "unknown architecture"
|
|
}
|
|
|
|
return cpuarch
|
|
}
|
|
|
|
// GetCPUInfo 获取 CPU 信息
|
|
func GetCPUInfo() models.CPUInfo {
|
|
cpuInfo := NewCPUInfo()
|
|
|
|
// 读取 /proc/cpuinfo
|
|
file, err := os.Open("/proc/cpuinfo")
|
|
if err != nil {
|
|
fmt.Println("Error opening /proc/cpuinfo:", err)
|
|
return cpuInfo // 返回默认值
|
|
}
|
|
defer func() {
|
|
if err := file.Close(); err != nil {
|
|
fmt.Println("Error closing /proc/cpuinfo:", err)
|
|
}
|
|
}()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
parseLine(scanner.Text(), &cpuInfo)
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
fmt.Println("Error reading /proc/cpuinfo:", err)
|
|
return cpuInfo // 返回默认值
|
|
}
|
|
|
|
// 获取 CPU 核心数
|
|
cores, err := getCPUCores()
|
|
if err != nil {
|
|
fmt.Println("Error getting CPU cores:", err)
|
|
} else {
|
|
cpuInfo.Cores = cores
|
|
}
|
|
|
|
// 获取 CPU UUID
|
|
uuid, err := getCPUUUID()
|
|
if err != nil {
|
|
fmt.Println("Error getting CPU UUID:", err)
|
|
} else {
|
|
cpuInfo.UUID = uuid
|
|
}
|
|
|
|
cpuInfo.Architecture = getCPUArchitecture()
|
|
|
|
return cpuInfo
|
|
}
|
|
|
|
/*
|
|
CPU模型名称: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
|
|
核心数量: 4
|
|
架构信息: x86_64
|
|
|
|
*/
|