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 // hardware name
20 hardwareName, err := getHardwareName()
21 if err != nil {
22 return err
23 }
24 fmt.Printf("%s: %s\n", color.Green("Name"), hardwareName)
25
26 // cpu
27 cpuModel, cpuThreads, err := getCpuInfo() // shared with `sysinfo.go`
28 if err != nil {
29 return err
30 }
31 fmt.Printf("%s: %s (%v)\n", color.Green("CPU"), cpuModel, cpuThreads)
32
33 // gpu
34 gpu, err := ghw.GPU()
35 if err != nil {
36 fmt.Printf("Error getting GPU info: %v\n", err)
37 } else {
38 fmt.Printf("%s:\n", color.Green("GPUs"))
39
40 for _, card := range gpu.GraphicsCards {
41 fmt.Printf(" - %s: %s\n", color.Blue("Vendor"), card.DeviceInfo.Vendor.Name)
42 fmt.Printf(" %s: %s\n", color.Blue("Model"), card.DeviceInfo.Product.Name)
43 }
44 }
45
46 // memory
47 dmi, err := dmidecode.New()
48 if err != nil {
49 return fmt.Errorf("failed to get dmi info: %w", err)
50 }
51
52 fmt.Printf("%s:\n", color.Green("Memory"))
53
54 memoryDevices, err := dmi.MemoryDevice()
55 if err != nil {
56 return fmt.Errorf("failed to get memory info: %w", err)
57 }
58
59 for _, i := range memoryDevices {
60 if i.Type.String() != "Unknown" {
61 fmt.Printf(" - %s: %s\n", color.Blue("Manufacturer"), i.Manufacturer)
62 fmt.Printf(" %s: %s\n", color.Blue("Type"), i.Type)
63 fmt.Printf(" %s: %v GB\n", color.Blue("Size"), i.Size/1024)
64 fmt.Printf(" %s: %v MHz\n", color.Blue("Speed"), i.Speed)
65 fmt.Printf(" %s: %s \n", color.Blue("Model"), i.PartNumber)
66 }
67 }
68
69 // disk
70 block, err := ghw.Block()
71 if err != nil {
72 return fmt.Errorf("failed to get block storage info: %w", err)
73 }
74
75 fmt.Printf("%s:\n", color.Green("Disks"))
76 for _, disk := range block.Disks {
77 if (disk.DriveType.String() != "virtual") && (disk.DriveType.String() != "Unknown") && (disk.DriveType.String() != "ODD") {
78 fmt.Printf(" - %s: %s\n", color.Blue("Type"), disk.DriveType)
79 fmt.Printf(" %s: %s\n", color.Blue("Model"), disk.Model)
80 fmt.Printf(" %s: %v GB\n", color.Blue("Size"), disk.SizeBytes/1000/1000/1000)
81 }
82 }
83
84 // mainboard
85 //// mainboardInfo, err := dmi.BaseBoard()
86 baseboard, err := ghw.Baseboard()
87 if err != nil {
88 return fmt.Errorf("failed to get baseboard info: %w", err)
89 }
90
91 fmt.Printf("%s:\n", color.Green("Mainboard"))
92 fmt.Printf(" - %s: %s\n", color.Blue("Manufacturer"), baseboard.Vendor)
93 fmt.Printf(" %s: %s\n", color.Blue("Model"), baseboard.Product)
94 return nil
95}
96
97func getHardwareName() (string, error) {
98 product, err := ghw.Product()
99 if err != nil {
100 return "", err
101 }
102
103 return product.Name, nil
104}