Add firmware versions for all components

Extract firmware from:
- asset.json: BIOS, ME, BKC, CPU Microcode, HDD/SSD/NVMe
- component.log: PSU firmware, Network adapter firmware

Deduplicate entries to avoid showing same firmware twice.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-25 09:24:36 +03:00
parent c243b4e141
commit 83378fa761
2 changed files with 84 additions and 0 deletions

View File

@@ -29,6 +29,9 @@ func ParseComponentLog(content []byte, hw *models.HardwareConfig) {
// Parse RESTful Network Adapter info
parseNetworkAdapterInfo(text, hw)
// Extract firmware from all components
extractComponentFirmware(text, hw)
}
// ParseComponentLogEvents extracts events from component.log (memory errors, etc.)
@@ -363,3 +366,57 @@ func parseMemoryEvents(text string) []models.Event {
return events
}
// extractComponentFirmware extracts firmware versions from all component data
func extractComponentFirmware(text string, hw *models.HardwareConfig) {
// Create a map to track existing firmware entries (avoid duplicates)
existingFW := make(map[string]bool)
for _, fw := range hw.Firmware {
existingFW[fw.DeviceName] = true
}
// HDD firmware is already extracted from asset.json with better names
// Skip extracting from component.log to avoid duplicates
// Extract PSU firmware from RESTful PSU info
rePSU := regexp.MustCompile(`RESTful PSU info:\s*(\{[\s\S]*?\})\s*RESTful Network`)
if match := rePSU.FindStringSubmatch(text); match != nil {
jsonStr := strings.ReplaceAll(match[1], "\n", "")
var psuInfo PSURESTInfo
if err := json.Unmarshal([]byte(jsonStr), &psuInfo); err == nil {
for _, psu := range psuInfo.PowerSupplies {
if psu.Present == 1 && psu.FwVer != "" {
fwName := fmt.Sprintf("PSU%d (%s)", psu.ID, psu.Model)
if !existingFW[fwName] {
hw.Firmware = append(hw.Firmware, models.FirmwareInfo{
DeviceName: fwName,
Version: psu.FwVer,
})
existingFW[fwName] = true
}
}
}
}
}
// Extract Network Adapter firmware from RESTful Network Adapter info
reNet := regexp.MustCompile(`RESTful Network Adapter info:\s*(\{[\s\S]*?\})\s*RESTful fan`)
if match := reNet.FindStringSubmatch(text); match != nil {
jsonStr := strings.ReplaceAll(match[1], "\n", "")
var netInfo NetworkAdapterRESTInfo
if err := json.Unmarshal([]byte(jsonStr), &netInfo); err == nil {
for _, adapter := range netInfo.SysAdapters {
if adapter.Present == 1 && adapter.FwVer != "" && adapter.FwVer != "NA" {
fwName := fmt.Sprintf("NIC %s (%s)", adapter.Location, adapter.Model)
if !existingFW[fwName] {
hw.Firmware = append(hw.Firmware, models.FirmwareInfo{
DeviceName: fwName,
Version: adapter.FwVer,
})
existingFW[fwName] = true
}
}
}
}
}
}