Skip to content

Commit

Permalink
config/supermicro: Add config normalization functions
Browse files Browse the repository at this point in the history
  • Loading branch information
splaspood committed Jun 3, 2024
1 parent 405a457 commit ef75250
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 0 deletions.
5 changes: 5 additions & 0 deletions config/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
1 change: 1 addition & 0 deletions config/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
103 changes: 103 additions & 0 deletions config/supermicro.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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() {
Expand Down

0 comments on commit ef75250

Please sign in to comment.