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:
57
internal/parser/vendors/inspur/component.go
vendored
57
internal/parser/vendors/inspur/component.go
vendored
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user