fix: complete hardware collection diagnostics

This commit is contained in:
2026-08-25 17:04:33 +03:00
parent 33ace33de5
commit ccc781856e
19 changed files with 311 additions and 81 deletions
+47 -3
View File
@@ -6,6 +6,7 @@ import (
"os"
"path/filepath"
"regexp"
"sort"
"strconv"
"strings"
)
@@ -42,6 +43,7 @@ func enrichPCIeWithNICTelemetry(devs []schema.HardwarePCIeDevice) []schema.Hardw
if len(ifaces) == 0 {
continue
}
sort.Strings(ifaces)
iface := ifaces[0]
devs[i].MacAddresses = collectInterfaceMACs(ifaces)
if devs[i].SerialNumber == nil {
@@ -58,11 +60,24 @@ func enrichPCIeWithNICTelemetry(devs []schema.HardwarePCIeDevice) []schema.Hardw
}
}
if out, err := ethtoolModuleQuery(iface); err == nil {
if injectSFPDOMTelemetry(&devs[i], out) {
enriched++
for port, portIface := range ifaces {
out, err := ethtoolModuleQuery(portIface)
if err != nil {
continue
}
legacy := schema.HardwarePCIeDevice{}
if !injectSFPDOMTelemetry(&legacy, out) || legacy.SFPIdentifier == nil {
continue
}
devs[i].SFPModules = append(devs[i].SFPModules, sfpModuleFromLegacy(port, legacy))
// Keep the v2.10 scalar representation for old Reanimator installs.
if len(devs[i].SFPModules) == 1 {
copyLegacySFPFields(&devs[i], legacy)
}
}
if len(devs[i].SFPModules) > 0 {
enriched++
continue
}
if len(devs[i].MacAddresses) > 0 || devs[i].Firmware != nil {
enriched++
@@ -72,6 +87,27 @@ func enrichPCIeWithNICTelemetry(devs []schema.HardwarePCIeDevice) []schema.Hardw
return devs
}
func sfpModuleFromLegacy(port int, dev schema.HardwarePCIeDevice) schema.HardwareSFPModule {
m := schema.HardwareSFPModule{Port: port, Identifier: dev.SFPIdentifier, Connector: dev.SFPConnector,
Vendor: dev.SFPVendor, PartNumber: dev.SFPPartNumber, SerialNumber: dev.SFPSerialNumber,
Revision: dev.SFPRevision, TransceiverType: dev.SFPTransceiverType,
TemperatureC: dev.SFPTemperatureC, TXPowerDBM: dev.SFPTXPowerDBM, RXPowerDBM: dev.SFPRXPowerDBM,
VoltageV: dev.SFPVoltageV, BiasMA: dev.SFPBiasMA}
if dev.SFPWavelengthNM != nil {
v := int(*dev.SFPWavelengthNM + 0.5)
m.WavelengthNM = &v
}
return m
}
func copyLegacySFPFields(dst *schema.HardwarePCIeDevice, src schema.HardwarePCIeDevice) {
dst.SFPPresent, dst.SFPIdentifier, dst.SFPConnector = src.SFPPresent, src.SFPIdentifier, src.SFPConnector
dst.SFPVendor, dst.SFPPartNumber, dst.SFPSerialNumber = src.SFPVendor, src.SFPPartNumber, src.SFPSerialNumber
dst.SFPRevision, dst.SFPTransceiverType = src.SFPRevision, src.SFPTransceiverType
dst.SFPWavelengthNM, dst.SFPTemperatureC, dst.SFPTXPowerDBM, dst.SFPRXPowerDBM = src.SFPWavelengthNM, src.SFPTemperatureC, src.SFPTXPowerDBM, src.SFPRXPowerDBM
dst.SFPVoltageV, dst.SFPBiasMA = src.SFPVoltageV, src.SFPBiasMA
}
func isNICDevice(dev schema.HardwarePCIeDevice) bool {
if dev.DeviceClass == nil {
return false
@@ -140,6 +176,14 @@ func injectSFPDOMTelemetry(dev *schema.HardwarePCIeDevice, raw string) bool {
s := strings.TrimSpace(val)
dev.SFPSerialNumber = &s
changed = true
case key == "vendor rev":
s := strings.TrimSpace(val)
dev.SFPRevision = &s
changed = true
case key == "transceiver type":
s := strings.TrimSpace(val)
dev.SFPTransceiverType = &s
changed = true
case strings.Contains(key, "laser wavelength"):
if f, ok := firstFloat(val); ok {
dev.SFPWavelengthNM = &f