118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
//
|
|
// Use and distribution licensed under the Apache license version 2.
|
|
//
|
|
// See the COPYING file in the root project directory for full text.
|
|
//
|
|
|
|
package ghw
|
|
|
|
import "fmt"
|
|
|
|
var (
|
|
chassisTypeDescriptions = map[string]string{
|
|
"1": "Other",
|
|
"2": "Unknown",
|
|
"3": "Desktop",
|
|
"4": "Low profile desktop",
|
|
"5": "Pizza box",
|
|
"6": "Mini tower",
|
|
"7": "Tower",
|
|
"8": "Portable",
|
|
"9": "Laptop",
|
|
"10": "Notebook",
|
|
"11": "Hand held",
|
|
"12": "Docking station",
|
|
"13": "All in one",
|
|
"14": "Sub notebook",
|
|
"15": "Space-saving",
|
|
"16": "Lunch box",
|
|
"17": "Main server chassis",
|
|
"18": "Expansion chassis",
|
|
"19": "SubChassis",
|
|
"20": "Bus Expansion chassis",
|
|
"21": "Peripheral chassis",
|
|
"22": "RAID chassis",
|
|
"23": "Rack mount chassis",
|
|
"24": "Sealed-case PC",
|
|
"25": "Multi-system chassis",
|
|
"26": "Compact PCI",
|
|
"27": "Advanced TCA",
|
|
"28": "Blade",
|
|
"29": "Blade enclosure",
|
|
"30": "Tablet",
|
|
"31": "Convertible",
|
|
"32": "Detachable",
|
|
"33": "IoT gateway",
|
|
"34": "Embedded PC",
|
|
"35": "Mini PC",
|
|
"36": "Stick PC",
|
|
}
|
|
)
|
|
|
|
// ChassisInfo defines chassis release information
|
|
type ChassisInfo struct {
|
|
AssetTag string `json:"asset_tag"`
|
|
SerialNumber string `json:"serial_number"`
|
|
Type string `json:"type"`
|
|
TypeDescription string `json:"type_description"`
|
|
Vendor string `json:"vendor"`
|
|
Version string `json:"version"`
|
|
}
|
|
|
|
func (i *ChassisInfo) String() string {
|
|
|
|
vendorStr := ""
|
|
if i.Vendor != "" {
|
|
vendorStr = " vendor=" + i.Vendor
|
|
}
|
|
serialStr := ""
|
|
if i.SerialNumber != "" && i.SerialNumber != UNKNOWN {
|
|
serialStr = " serial=" + i.SerialNumber
|
|
}
|
|
versionStr := ""
|
|
if i.Version != "" {
|
|
versionStr = " version=" + i.Version
|
|
}
|
|
|
|
res := fmt.Sprintf(
|
|
"chassis type=%s%s%s%s",
|
|
i.TypeDescription,
|
|
vendorStr,
|
|
serialStr,
|
|
versionStr,
|
|
)
|
|
return res
|
|
}
|
|
|
|
// Chassis returns a pointer to a ChassisInfo struct containing information
|
|
// about the host's chassis
|
|
func Chassis(opts ...*WithOption) (*ChassisInfo, error) {
|
|
mergeOpts := mergeOptions(opts...)
|
|
ctx := &context{
|
|
chroot: *mergeOpts.Chroot,
|
|
}
|
|
info := &ChassisInfo{}
|
|
if err := ctx.chassisFillInfo(info); err != nil {
|
|
return nil, err
|
|
}
|
|
return info, nil
|
|
}
|
|
|
|
// simple private struct used to encapsulate chassis information in a top-level
|
|
// "chassis" YAML/JSON map/object key
|
|
type chassisPrinter struct {
|
|
Info *ChassisInfo `json:"chassis"`
|
|
}
|
|
|
|
// YAMLString returns a string with the chassis information formatted as YAML
|
|
// under a top-level "dmi:" key
|
|
func (info *ChassisInfo) YAMLString() string {
|
|
return safeYAML(chassisPrinter{info})
|
|
}
|
|
|
|
// JSONString returns a string with the chassis information formatted as JSON
|
|
// under a top-level "chassis:" key
|
|
func (info *ChassisInfo) JSONString(indent bool) string {
|
|
return safeJSON(chassisPrinter{info}, indent)
|
|
}
|