New parsers: - NVIDIA Field Diagnostics parser with dmidecode output support - NVIDIA Bug Report parser with comprehensive hardware extraction - Supermicro crashdump (CDump.txt) parser - Generic fallback parser for unrecognized text files Enhanced GPU parsing (nvidia-bug-report): - Model and manufacturer detection (NVIDIA H100 80GB HBM3) - UUID, Video BIOS version, IRQ information - Bus location (BDF), DMA size/mask, device minor - PCIe bus type details New hardware detection (nvidia-bug-report): - System Information: server S/N, UUID, manufacturer, product name - CPU: model, S/N, cores, threads, frequencies from dmidecode - Memory: P/N, S/N, manufacturer, speed for all DIMMs - Power Supplies: manufacturer, model, S/N, wattage, status - Network Adapters: Ethernet/InfiniBand controllers with VPD data - Model, P/N, S/N from lspci Vital Product Data - Port count/type detection (QSFP56, OSFP, etc.) - Support for ConnectX-6/7 adapters Archive handling improvements: - Plain .gz file support (not just tar.gz) - Increased size limit for plain gzip files (50MB) - Better error handling for mixed archive formats Web interface enhancements: - Display parser name and filename badges - Improved file info section with visual indicators Co-Authored-By: Claude (qwen3-coder:480b) <noreply@anthropic.com>
99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
// Package supermicro provides parser for Supermicro BMC crashdump archives
|
|
// Tested with: Supermicro SYS-821GE-TNHR (Crashdump format)
|
|
//
|
|
// IMPORTANT: Increment parserVersion when modifying parser logic!
|
|
// This helps track which version was used to parse specific logs.
|
|
package supermicro
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.mchus.pro/mchus/logpile/internal/models"
|
|
"git.mchus.pro/mchus/logpile/internal/parser"
|
|
)
|
|
|
|
// parserVersion - version of this parser module
|
|
// IMPORTANT: Increment this version when making changes to parser logic!
|
|
const parserVersion = "1.0.0"
|
|
|
|
func init() {
|
|
parser.Register(&Parser{})
|
|
}
|
|
|
|
// Parser implements VendorParser for Supermicro servers
|
|
type Parser struct{}
|
|
|
|
// Name returns human-readable parser name
|
|
func (p *Parser) Name() string {
|
|
return "SMC Crash Dump Parser"
|
|
}
|
|
|
|
// Vendor returns vendor identifier
|
|
func (p *Parser) Vendor() string {
|
|
return "supermicro"
|
|
}
|
|
|
|
// Version returns parser version
|
|
// IMPORTANT: Update parserVersion constant when modifying parser logic!
|
|
func (p *Parser) Version() string {
|
|
return parserVersion
|
|
}
|
|
|
|
// Detect checks if archive matches Supermicro crashdump format
|
|
// Returns confidence 0-100
|
|
func (p *Parser) Detect(files []parser.ExtractedFile) int {
|
|
confidence := 0
|
|
|
|
for _, f := range files {
|
|
path := strings.ToLower(f.Path)
|
|
|
|
// Strong indicator for Supermicro Crashdump format
|
|
if strings.HasSuffix(path, "cdump.txt") {
|
|
// Check if it's really Supermicro crashdump format
|
|
if containsCrashdumpMarkers(f.Content) {
|
|
confidence += 80
|
|
}
|
|
}
|
|
|
|
// Cap at 100
|
|
if confidence >= 100 {
|
|
return 100
|
|
}
|
|
}
|
|
|
|
return confidence
|
|
}
|
|
|
|
// containsCrashdumpMarkers checks if content has Supermicro crashdump markers
|
|
func containsCrashdumpMarkers(content []byte) bool {
|
|
s := string(content)
|
|
// Check for typical Supermicro Crashdump structure
|
|
return strings.Contains(s, "crash_data") &&
|
|
strings.Contains(s, "METADATA") &&
|
|
(strings.Contains(s, "bmc_fw_ver") || strings.Contains(s, "crashdump_ver"))
|
|
}
|
|
|
|
// Parse parses Supermicro crashdump archive
|
|
func (p *Parser) Parse(files []parser.ExtractedFile) (*models.AnalysisResult, error) {
|
|
result := &models.AnalysisResult{
|
|
Events: make([]models.Event, 0),
|
|
FRU: make([]models.FRUInfo, 0),
|
|
Sensors: make([]models.SensorReading, 0),
|
|
}
|
|
|
|
// Initialize hardware config
|
|
result.Hardware = &models.HardwareConfig{
|
|
CPUs: make([]models.CPU, 0),
|
|
}
|
|
|
|
// Parse CDump.txt (JSON crashdump)
|
|
if f := parser.FindFileByName(files, "CDump.txt"); f != nil {
|
|
if err := ParseCrashDump(f.Content, result); err != nil {
|
|
// Log error but continue parsing other files
|
|
_ = err // Ignore error for now
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|