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 */