diff --git a/monitoring/unit/gpu_linux.go b/monitoring/unit/gpu_linux.go new file mode 100644 index 0000000..889eb19 --- /dev/null +++ b/monitoring/unit/gpu_linux.go @@ -0,0 +1,32 @@ +//go:build linux +// +build linux + +package monitoring + +import ( + "os/exec" + "strings" +) + +func GpuName() string { + accept := []string{"vga", "nvidia", "amd", "radeon", "render"} + out, err := exec.Command("lspci").Output() + if err == nil { + lines := strings.Split(string(out), "\n") + for _, line := range lines { + for _, a := range accept { + if strings.Contains(strings.ToLower(line), a) { + parts := strings.SplitN(line, ":", 4) + if len(parts) >= 4 { + return strings.TrimSpace(parts[3]) + } else if len(parts) == 3 { + return strings.TrimSpace(parts[2]) + } else if len(parts) == 2 { + return strings.TrimSpace(parts[1]) + } + } + } + } + } + return "None" +} diff --git a/monitoring/unit/gpu_test.go b/monitoring/unit/gpu_test.go new file mode 100644 index 0000000..d705054 --- /dev/null +++ b/monitoring/unit/gpu_test.go @@ -0,0 +1,13 @@ +package monitoring + +import ( + "testing" +) + +func TestGpuName(t *testing.T) { + name := GpuName() + if name == "" || name == "Unknown" { + t.Errorf("Expected GPU name, got empty or 'Unknown'") + } + t.Logf("GPU name: %s", name) +} diff --git a/monitoring/unit/gpu_windows.go b/monitoring/unit/gpu_windows.go new file mode 100644 index 0000000..b5ba968 --- /dev/null +++ b/monitoring/unit/gpu_windows.go @@ -0,0 +1,54 @@ +//go:build windows +// +build windows + +package monitoring + +import ( + "strings" + + "golang.org/x/sys/windows/registry" +) + +func GpuName() string { + displayPath := `SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}` + k, err := registry.OpenKey(registry.LOCAL_MACHINE, displayPath, registry.READ) + if err != nil { + return "Unknown" + } + defer k.Close() + + subKeys, err := k.ReadSubKeyNames(-1) + if err != nil { + return "Unknown" + } + gpuName := "" + for _, subKey := range subKeys { + if !strings.HasPrefix(subKey, "0") { + continue + } + + fullPath := displayPath + "\\" + subKey + sk, err := registry.OpenKey(registry.LOCAL_MACHINE, fullPath, registry.READ) + if err != nil { + continue + } + defer sk.Close() + + deviceDesc, _, err := sk.GetStringValue("DriverDesc") + if err != nil || deviceDesc == "" { + continue + } + deviceDesc = strings.TrimSpace(deviceDesc) + // 只接受支持 OpenGL 的 GPU + openGLVersion, _, err := sk.GetIntegerValue("OpenGLVersion") + if err != nil || openGLVersion == 0 { + continue + } + gpuName += deviceDesc + ", " + } + + if gpuName != "" { + return strings.TrimSuffix(gpuName, ", ") + } + return "None" +} diff --git a/server/basicInfo.go b/server/basicInfo.go index 08da2e9..abd0282 100644 --- a/server/basicInfo.go +++ b/server/basicInfo.go @@ -44,7 +44,7 @@ func uploadBasicInfo() error { "mem_total": monitoring.Ram().Total, "swap_total": monitoring.Swap().Total, "disk_total": monitoring.Disk().Total, - "gpu_name": "Unknown", + "gpu_name": monitoring.GpuName(), "version": update.CurrentVersion, }