[agent-wdd] 基本完成Info部分的整理
This commit is contained in:
177
agent-wdd/config/CPU.go
Normal file
177
agent-wdd/config/CPU.go
Normal file
@@ -0,0 +1,177 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"bufio"
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Gather 获取CPU相关的信息
|
||||
func (cpu *CPU) Gather() {
|
||||
log.Info("Gathering INFO => CPU !")
|
||||
|
||||
cpu.getBasicInfo()
|
||||
cpu.getVirtualizationInfo()
|
||||
}
|
||||
|
||||
func (cpu *CPU) Save() {
|
||||
log.Info("Saving INFO => CPU !")
|
||||
|
||||
ConfigCache.Agent.CPU = *cpu
|
||||
SaveConfig()
|
||||
}
|
||||
|
||||
func (cpu *CPU) getBasicInfo() {
|
||||
switch runtime.GOOS {
|
||||
case "linux":
|
||||
cpu.getLinuxCPUInfo()
|
||||
case "windows":
|
||||
cpu.getWindowsCPUInfo()
|
||||
case "darwin":
|
||||
cpu.getDarwinCPUInfo()
|
||||
default:
|
||||
// 其他平台处理
|
||||
}
|
||||
}
|
||||
|
||||
func (cpu *CPU) getLinuxCPUInfo() {
|
||||
data, err := os.ReadFile("/proc/cpuinfo")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
contents := string(data)
|
||||
cpu.Cores = strings.Count(contents, "processor\t:")
|
||||
|
||||
// 创建带缓冲的扫描器
|
||||
scanner := bufio.NewScanner(bytes.NewReader(data))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if strings.Contains(line, "model name") {
|
||||
cpu.Brand = strings.TrimSpace(strings.SplitN(line, ":", 2)[1])
|
||||
}
|
||||
if strings.Contains(line, "cpu MHz") {
|
||||
cpu.Mhz = strings.TrimSpace(strings.Split(line, ":")[1])
|
||||
}
|
||||
}
|
||||
|
||||
cpu.Arch = runtime.GOARCH
|
||||
}
|
||||
|
||||
func (cpu *CPU) getWindowsCPUInfo() {
|
||||
cmd := exec.Command("wmic", "cpu", "get", "Name,NumberOfCores,CurrentClockSpeed", "/VALUE")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
info := string(output)
|
||||
lines := strings.Split(info, "\n")
|
||||
for _, line := range lines {
|
||||
if strings.HasPrefix(line, "Name=") {
|
||||
cpu.Brand = strings.TrimSpace(strings.SplitN(line, "=", 2)[1])
|
||||
}
|
||||
if strings.HasPrefix(line, "NumberOfCores=") {
|
||||
cores, _ := strconv.Atoi(strings.SplitN(line, "=", 2)[1])
|
||||
cpu.Cores = cores
|
||||
}
|
||||
if strings.HasPrefix(line, "CurrentClockSpeed=") {
|
||||
cpu.Mhz = strings.SplitN(line, "=", 2)[1]
|
||||
}
|
||||
}
|
||||
|
||||
// 架构处理
|
||||
switch runtime.GOARCH {
|
||||
case "amd64":
|
||||
cpu.Arch = "x86_64"
|
||||
default:
|
||||
cpu.Arch = runtime.GOARCH
|
||||
}
|
||||
}
|
||||
|
||||
func (cpu *CPU) getVirtualizationInfo() {
|
||||
switch runtime.GOOS {
|
||||
case "linux":
|
||||
cpu.getLinuxVirtualization()
|
||||
case "windows":
|
||||
cpu.getWindowsVirtualization()
|
||||
}
|
||||
}
|
||||
|
||||
func (cpu *CPU) getLinuxVirtualization() {
|
||||
// 检查CPU虚拟化支持
|
||||
data, err := ioutil.ReadFile("/proc/cpuinfo")
|
||||
if err == nil {
|
||||
if strings.Contains(string(data), "vmx") || strings.Contains(string(data), "svm") {
|
||||
cpu.Virt = "supported"
|
||||
}
|
||||
}
|
||||
|
||||
// 检测是否在虚拟机中
|
||||
if _, err := os.Stat("/sys/hypervisor/uid"); !os.IsNotExist(err) {
|
||||
cpu.Virt = "virtualized"
|
||||
if data, err := ioutil.ReadFile("/sys/hypervisor/type"); err == nil {
|
||||
cpu.Hypervisor = strings.TrimSpace(string(data))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 使用systemd-detect-virt
|
||||
cmd := exec.Command("systemd-detect-virt")
|
||||
if output, err := cmd.Output(); err == nil {
|
||||
result := strings.TrimSpace(string(output))
|
||||
if result != "none" {
|
||||
cpu.Virt = "virtualized"
|
||||
cpu.Hypervisor = result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (cpu *CPU) getWindowsVirtualization() {
|
||||
cmd := exec.Command("wmic", "computersystem", "get", "model", "/VALUE")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
model := strings.ToLower(string(output))
|
||||
switch {
|
||||
case strings.Contains(model, "virtualbox"):
|
||||
cpu.Hypervisor = "VirtualBox"
|
||||
case strings.Contains(model, "vmware"):
|
||||
cpu.Hypervisor = "VMware"
|
||||
case strings.Contains(model, "kvm"):
|
||||
cpu.Hypervisor = "KVM"
|
||||
case strings.Contains(model, "hyper-v"):
|
||||
cpu.Hypervisor = "Hyper-V"
|
||||
case strings.Contains(model, "xen"):
|
||||
cpu.Hypervisor = "Xen"
|
||||
}
|
||||
|
||||
if cpu.Hypervisor != "" {
|
||||
cpu.Virt = "virtualized"
|
||||
}
|
||||
}
|
||||
|
||||
func (cpu *CPU) getDarwinCPUInfo() {
|
||||
// macOS实现
|
||||
cmd := exec.Command("sysctl", "-n", "machdep.cpu.brand_string")
|
||||
if output, err := cmd.Output(); err == nil {
|
||||
cpu.Brand = strings.TrimSpace(string(output))
|
||||
}
|
||||
|
||||
cmd = exec.Command("sysctl", "-n", "hw.ncpu")
|
||||
if output, err := cmd.Output(); err == nil {
|
||||
if cores, err := strconv.Atoi(strings.TrimSpace(string(output))); err == nil {
|
||||
cpu.Cores = cores
|
||||
}
|
||||
}
|
||||
|
||||
cpu.Arch = runtime.GOARCH
|
||||
}
|
||||
Reference in New Issue
Block a user