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}