master
 1package get
 2
 3import "C"
 4import (
 5	"fmt"
 6	"os"
 7
 8	"github.com/jaypipes/ghw"
 9	"github.com/kahnwong/swissknife/configs/color"
10	"github.com/yumaojun03/dmidecode"
11)
12
13func HwInfo() error {
14	// need to run as sudo
15	if os.Geteuid() != 0 {
16		return fmt.Errorf("need to run as sudo")
17	}
18
19	// cpu
20	cpuModel, cpuThreads, err := getCpuInfo() // shared with `sysinfo.go`
21	if err != nil {
22		return err
23	}
24	fmt.Printf("%s: %s (%v)\n", color.Green("CPU"), cpuModel, cpuThreads)
25
26	// gpu
27	gpu, err := ghw.GPU()
28	if err != nil {
29		fmt.Printf("Error getting GPU info: %v\n", err)
30	} else {
31		fmt.Printf("%s:\n", color.Green("GPUs"))
32
33		for _, card := range gpu.GraphicsCards {
34			fmt.Printf("  - %s: %s\n", color.Blue("Vendor"), card.DeviceInfo.Vendor.Name)
35			fmt.Printf("    %s: %s\n", color.Blue("Model"), card.DeviceInfo.Product.Name)
36		}
37	}
38
39	// memory
40	dmi, err := dmidecode.New()
41	if err != nil {
42		return fmt.Errorf("failed to get dmi info: %w", err)
43	}
44
45	fmt.Printf("%s:\n", color.Green("Memory"))
46
47	memoryDevices, err := dmi.MemoryDevice()
48	if err != nil {
49		return fmt.Errorf("failed to get memory info: %w", err)
50	}
51
52	for _, i := range memoryDevices {
53		if i.Type.String() != "Unknown" {
54			fmt.Printf("  - %s: %s\n", color.Blue("Manufacturer"), i.Manufacturer)
55			fmt.Printf("    %s: %s\n", color.Blue("Type"), i.Type)
56			fmt.Printf("    %s: %v GB\n", color.Blue("Size"), i.Size/1024)
57			fmt.Printf("    %s: %v MHz\n", color.Blue("Speed"), i.Speed)
58			fmt.Printf("    %s: %s \n", color.Blue("Model"), i.PartNumber)
59		}
60	}
61
62	// disk
63	block, err := ghw.Block()
64	if err != nil {
65		return fmt.Errorf("failed to get block storage info: %w", err)
66	}
67
68	fmt.Printf("%s:\n", color.Green("Disks"))
69	for _, disk := range block.Disks {
70		if (disk.DriveType.String() != "virtual") && (disk.DriveType.String() != "Unknown") && (disk.DriveType.String() != "ODD") {
71			fmt.Printf("  - %s: %s\n", color.Blue("Type"), disk.DriveType)
72			fmt.Printf("    %s: %s\n", color.Blue("Model"), disk.Model)
73			fmt.Printf("    %s: %v GB\n", color.Blue("Size"), disk.SizeBytes/1000/1000/1000)
74		}
75	}
76
77	// mainboard
78	//// mainboardInfo, err := dmi.BaseBoard()
79	baseboard, err := ghw.Baseboard()
80	if err != nil {
81		return fmt.Errorf("failed to get baseboard info: %w", err)
82	}
83
84	fmt.Printf("%s:\n", color.Green("Mainboard"))
85	fmt.Printf("  - %s: %s\n", color.Blue("Manufacturer"), baseboard.Vendor)
86	fmt.Printf("    %s: %s\n", color.Blue("Model"), baseboard.Product)
87	return nil
88}