From 21b1b17e8494bb45aa6b750ce12f542e68507d2f Mon Sep 17 00:00:00 2001 From: Akizon77 Date: Mon, 26 May 2025 19:12:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20GPU=20=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E8=8E=B7=E5=8F=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- monitoring/unit/gpu_linux.go | 32 ++++++++++++++++++++ monitoring/unit/gpu_test.go | 13 ++++++++ monitoring/unit/gpu_windows.go | 54 ++++++++++++++++++++++++++++++++++ server/basicInfo.go | 2 +- 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 monitoring/unit/gpu_linux.go create mode 100644 monitoring/unit/gpu_test.go create mode 100644 monitoring/unit/gpu_windows.go 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, }