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}