diff --git a/config/asrockrack.go b/config/asrockrack.go index 347b77a..7d1e745 100644 --- a/config/asrockrack.go +++ b/config/asrockrack.go @@ -110,6 +110,10 @@ func (cm *asrockrackVendorConfig) Unmarshal(cfgData string) (err error) { return } +func (cm *asrockrackVendorConfig) StandardConfig() (biosConfig map[string]string, err error) { + return +} + // Generic config options func (cm *asrockrackVendorConfig) EnableTPM() { diff --git a/config/dell.go b/config/dell.go index 42d452b..835abf3 100644 --- a/config/dell.go +++ b/config/dell.go @@ -134,6 +134,10 @@ func (cm *dellVendorConfig) Unmarshal(cfgData string) (err error) { return } +func (cm *dellVendorConfig) StandardConfig() (biosConfig map[string]string, err error) { + return +} + // Generic config options func (cm *dellVendorConfig) EnableTPM() { diff --git a/config/errors.go b/config/errors.go index 60dd15f..e16dfde 100644 --- a/config/errors.go +++ b/config/errors.go @@ -7,11 +7,16 @@ import ( var errUnknownConfigFormat = errors.New("unknown config format") var errUnknownVendor = errors.New("unknown/unsupported vendor") +var errUnknownSettingType = errors.New("unknown setting type") func UnknownConfigFormatError(format string) error { return fmt.Errorf("unknown config format %w : %s", errUnknownConfigFormat, format) } +func UnknownSettingType(t string) error { + return fmt.Errorf("unknown setting type %w : %s", errUnknownSettingType, t) +} + func UnknownVendorError(vendorName string) error { return fmt.Errorf("unknown/unsupported vendor %w : %s", errUnknownVendor, vendorName) } diff --git a/config/interface.go b/config/interface.go index e860368..14724aa 100644 --- a/config/interface.go +++ b/config/interface.go @@ -13,6 +13,7 @@ type VendorConfigManager interface { Raw(name, value string, menuPath []string) Marshal() (string, error) Unmarshal(cfgData string) (err error) + StandardConfig() (biosConfig map[string]string, err error) } func NewVendorConfigManager(configFormat, vendorName string, vendorOptions map[string]string) (VendorConfigManager, error) { diff --git a/config/supermicro.go b/config/supermicro.go index 4a01362..15ed013 100644 --- a/config/supermicro.go +++ b/config/supermicro.go @@ -5,6 +5,12 @@ import ( "strings" ) +const ( + // enabledValue and disabledValue are utilized for bios setting value normalization + enabledValue = "Enabled" + disabledValue = "Disabled" +) + type supermicroVendorConfig struct { ConfigFormat string ConfigData *supermicroConfig @@ -32,6 +38,7 @@ type supermicroBiosCfgSetting struct { Order string `xml:"order,attr"` SelectedOption string `xml:"selectedOption,attr"` Type string `xml:"type,attr"` + CheckedStatus string `xml:"checkedStatus,attr"` } func NewSupermicroVendorConfigManager(configFormat string, vendorOptions map[string]string) (VendorConfigManager, error) { @@ -119,6 +126,102 @@ func (cm *supermicroVendorConfig) Unmarshal(cfgData string) (err error) { return } +func (cm *supermicroVendorConfig) StandardConfig() (biosConfig map[string]string, err error) { + biosConfig = make(map[string]string) + + for _, menu := range cm.ConfigData.BiosCfg.Menus { + for _, s := range menu.Settings { + switch s.Name { + // We want to drop this list of settings + case "NewSetupPassword", "NewSysPassword", "OldSetupPassword", "OldSysPassword": + // All others get normalized + default: + var k, v string + k, v, err = normalizeSetting(s) + if err != nil { + return + } + + biosConfig[k] = v + } + } + } + + return +} + +func normalizeSetting(s *supermicroBiosCfgSetting) (k, v string, err error) { + switch s.Type { + case "CheckBox": + k = normalizeName(s.Name) + v = normalizeValue(k, s.CheckedStatus) + return + case "Option": + k = normalizeName(s.Name) + v = normalizeValue(k, s.SelectedOption) + return + default: + err = UnknownSettingType(s.Type) + return + } +} + +func normalizeName(name string) string { + switch name { + case "CpuMinSevAsid": + return "amd_sev" + case "BootMode", "Boot mode select": + return "boot_mode" + case "IntelTxt": + return "intel_txt" + case "Software Guard Extensions (SGX)": + return "intel_sgx" + case "SecureBoot", "Secure Boot": + return "secure_boot" + case "Hyper-Threading", "Hyper-Threading [ALL]", "LogicalProc": + return "smt" + case "SriovGlobalEnable": + return "sr_iov" + case "TpmSecurity", "Security Device Support": + return "tpm" + default: + // When we don't normalize the value append "raw:" to the value + return "raw:" + name + } +} + +func normalizeBootMode(v string) string { + switch strings.ToLower(v) { + case "legacy": + return "BIOS" + default: + return strings.ToUpper(v) + } +} + +func normalizeValue(k, v string) string { + if k == "boot_mode" { + return normalizeBootMode(v) + } + + switch strings.ToLower(v) { + case "disable": + return disabledValue + case "disabled": + return disabledValue + case "enable": + return enabledValue + case "enabled": + return enabledValue + case "off": + return disabledValue + case "on": + return enabledValue + default: + return v + } +} + // Generic config options func (cm *supermicroVendorConfig) EnableTPM() {