Fix NVIDIA GPU/NVSwitch parsing and Reanimator export statuses

This commit is contained in:
2026-02-15 21:00:30 +03:00
parent 0af3cee9b6
commit c7b2a7ab29
12 changed files with 695 additions and 92 deletions

View File

@@ -312,7 +312,7 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// From FRU
for _, fru := range result.FRU {
if fru.SerialNumber == "" {
if !hasUsableSerial(fru.SerialNumber) {
continue
}
name := fru.ProductName
@@ -320,8 +320,8 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
name = fru.Description
}
serials = append(serials, SerialEntry{
Component: name,
SerialNumber: fru.SerialNumber,
Component: name,
SerialNumber: strings.TrimSpace(fru.SerialNumber),
Manufacturer: fru.Manufacturer,
PartNumber: fru.PartNumber,
Category: "FRU",
@@ -331,10 +331,10 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// From Hardware
if result.Hardware != nil {
// Board
if result.Hardware.BoardInfo.SerialNumber != "" {
if hasUsableSerial(result.Hardware.BoardInfo.SerialNumber) {
serials = append(serials, SerialEntry{
Component: result.Hardware.BoardInfo.ProductName,
SerialNumber: result.Hardware.BoardInfo.SerialNumber,
SerialNumber: strings.TrimSpace(result.Hardware.BoardInfo.SerialNumber),
Manufacturer: result.Hardware.BoardInfo.Manufacturer,
PartNumber: result.Hardware.BoardInfo.PartNumber,
Category: "Board",
@@ -343,24 +343,20 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// CPUs
for _, cpu := range result.Hardware.CPUs {
sn := cpu.SerialNumber
if sn == "" {
sn = cpu.PPIN // Use PPIN as fallback identifier
}
if sn == "" {
if !hasUsableSerial(cpu.SerialNumber) {
continue
}
serials = append(serials, SerialEntry{
Component: cpu.Model,
Location: fmt.Sprintf("CPU%d", cpu.Socket),
SerialNumber: sn,
SerialNumber: strings.TrimSpace(cpu.SerialNumber),
Category: "CPU",
})
}
// Memory DIMMs
for _, mem := range result.Hardware.Memory {
if mem.SerialNumber == "" {
if !hasUsableSerial(mem.SerialNumber) {
continue
}
location := mem.Location
@@ -370,7 +366,7 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
serials = append(serials, SerialEntry{
Component: mem.PartNumber,
Location: location,
SerialNumber: mem.SerialNumber,
SerialNumber: strings.TrimSpace(mem.SerialNumber),
Manufacturer: mem.Manufacturer,
PartNumber: mem.PartNumber,
Category: "Memory",
@@ -379,13 +375,13 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// Storage
for _, stor := range result.Hardware.Storage {
if stor.SerialNumber == "" {
if !hasUsableSerial(stor.SerialNumber) {
continue
}
serials = append(serials, SerialEntry{
Component: stor.Model,
Location: stor.Slot,
SerialNumber: stor.SerialNumber,
SerialNumber: strings.TrimSpace(stor.SerialNumber),
Manufacturer: stor.Manufacturer,
Category: "Storage",
})
@@ -393,7 +389,7 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// GPUs
for _, gpu := range result.Hardware.GPUs {
if gpu.SerialNumber == "" {
if !hasUsableSerial(gpu.SerialNumber) {
continue
}
model := gpu.Model
@@ -403,7 +399,7 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
serials = append(serials, SerialEntry{
Component: model,
Location: gpu.Slot,
SerialNumber: gpu.SerialNumber,
SerialNumber: strings.TrimSpace(gpu.SerialNumber),
Manufacturer: gpu.Manufacturer,
Category: "GPU",
})
@@ -411,13 +407,13 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// PCIe devices
for _, pcie := range result.Hardware.PCIeDevices {
if pcie.SerialNumber == "" {
if !hasUsableSerial(pcie.SerialNumber) {
continue
}
serials = append(serials, SerialEntry{
Component: pcie.DeviceClass,
Location: pcie.Slot,
SerialNumber: pcie.SerialNumber,
SerialNumber: strings.TrimSpace(pcie.SerialNumber),
Manufacturer: pcie.Manufacturer,
PartNumber: pcie.PartNumber,
Category: "PCIe",
@@ -426,43 +422,47 @@ func (s *Server) handleGetSerials(w http.ResponseWriter, r *http.Request) {
// Network cards
for _, nic := range result.Hardware.NetworkCards {
if nic.SerialNumber == "" {
if !hasUsableSerial(nic.SerialNumber) {
continue
}
serials = append(serials, SerialEntry{
Component: nic.Model,
SerialNumber: nic.SerialNumber,
SerialNumber: strings.TrimSpace(nic.SerialNumber),
Category: "Network",
})
}
// Power supplies
for _, psu := range result.Hardware.PowerSupply {
if psu.SerialNumber == "" {
if !hasUsableSerial(psu.SerialNumber) {
continue
}
serials = append(serials, SerialEntry{
Component: psu.Model,
Location: psu.Slot,
SerialNumber: psu.SerialNumber,
SerialNumber: strings.TrimSpace(psu.SerialNumber),
Manufacturer: psu.Vendor,
Category: "PSU",
})
}
// Firmware (using version as "serial number" for display)
for _, fw := range result.Hardware.Firmware {
serials = append(serials, SerialEntry{
Component: fw.DeviceName,
SerialNumber: fw.Version,
Category: "Firmware",
})
}
}
jsonResponse(w, serials)
}
func hasUsableSerial(serial string) bool {
s := strings.TrimSpace(serial)
if s == "" {
return false
}
switch strings.ToUpper(s) {
case "N/A", "NA", "NONE", "NULL", "UNKNOWN", "-":
return false
default:
return true
}
}
func (s *Server) handleGetFirmware(w http.ResponseWriter, r *http.Request) {
result := s.GetResult()
if result == nil || result.Hardware == nil {