From e200178142ce94a8b05723d209ede779a5125c4b Mon Sep 17 00:00:00 2001 From: nekohepott Date: Wed, 17 Jun 2026 04:16:24 +0300 Subject: [PATCH] its fucking slop bruuuuh --- main.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index a650d35..f5e1355 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,7 @@ import ( "fmt" "os" "os/exec" - "regexp" + "path/filepath" "strconv" "strings" ) @@ -18,6 +18,8 @@ const ( var dist string +type LinuxProvider struct{} + func getDist() string { f, _ := os.Open("/etc/os-release") defer func(f *os.File) { @@ -96,26 +98,83 @@ func getCpu() string { return cpu } -func getGpu() string { - out, err := exec.Command("sh", "-c", "lspci | grep -E 'VGA|3D'").Output() +func (lp *LinuxProvider) getNvidiaGpuInfoPath() string { + entries, err := os.ReadDir("/proc/driver/nvidia/gpus/") if err != nil { - return "Unknown GPU" + return "" } - line := string(out) - parts := strings.Split(line, ": ") - if len(parts) > 1 { - return cleanGpuString(parts[1]) + + for _, entry := range entries { + return filepath.Join("/proc/driver/nvidia/gpus/", entry.Name(), "information") } - return "GPU not found" + + return "" } -func cleanGpuString(raw string) string { - re := regexp.MustCompile(`\(.*\)`) - res := re.ReplaceAllString(raw, "") - res = strings.ReplaceAll(res, "Corporation", "") - res = strings.ReplaceAll(res, "[", "") - res = strings.ReplaceAll(res, "]", "") - return strings.Join(strings.Fields(res), " ") +func (lp *LinuxProvider) findAmdGpuBase() string { + for i := 0; i < 10; i++ { + base := fmt.Sprintf("/sys/class/drm/card%d/device/", i) + vendorPath := filepath.Join(base, "vendor") + + data, err := os.ReadFile(vendorPath) + if err == nil { + vendorID := strings.TrimSpace(string(data)) + // 0x1002 — это PCI ID компании AMD + if vendorID == "0x1002" { + return base + } + } + } + return "" +} + +func (lp *LinuxProvider) findStringInStreamWithDelimiter(filePath string, targetKey string, delimiter string) string { + file, err := os.Open(filePath) + if err != nil { + return "" + } + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + if strings.Contains(line, targetKey) { + parts := strings.SplitN(line, delimiter, 2) + if len(parts) > 1 { + return strings.TrimSpace(parts[1]) + } + } + } + return "" +} + +func (lp *LinuxProvider) getGpu() string { + if _, err := os.Stat("/proc/driver/nvidia"); err == nil { + path := lp.getNvidiaGpuInfoPath() + if path != "" { + name := lp.findStringInStreamWithDelimiter(path, "Model", ":") + if name != "" { + return name + } + } + } else { + base := lp.findAmdGpuBase() + if base != "" { + if data, err := os.ReadFile(filepath.Join(base, "product_name")); err == nil { + name := strings.TrimSpace(string(data)) + if name != "" { + return name + } + } + + pci := lp.findStringInStreamWithDelimiter(filepath.Join(base, "uevent"), "PCI_ID", "=") + if pci != "" && pci != "?" { + return "AMD GPU (" + pci + ")" + } + return "AMD GPU" + } + } + + return "Unknown GPU" } func getKernel() string { @@ -186,6 +245,7 @@ func main() { Label string Value string } + lp := &LinuxProvider{} stats := []Info{ {"distro", getDist()}, @@ -194,7 +254,7 @@ func main() { {"hostname", getHostname()}, {"memory", getRam()}, {"cpu", getCpu()}, - {"gpu", getGpu()}, + {"gpu", lp.getGpu()}, } fmt.Print(BlueBright) fmt.Printf(getAscii())