diff --git a/internal/scans/runner.go b/internal/scans/runner.go index 4f359eb..83a1fbb 100644 --- a/internal/scans/runner.go +++ b/internal/scans/runner.go @@ -203,19 +203,27 @@ func probeSNMPAndLLDP(ip, community string, checkedAt time.Time, timeoutMS int) return out, probeLLDP(client, ip, checkedAt) } +// snmpBytesToDisplay строка для OCTET STRING SNMP: UTF-8 текст, иначе MAC (6 байт) или 0x+hex. +func snmpBytesToDisplay(b []byte) string { + if len(b) == 0 { + return "" + } + if utf8.Valid(b) { + s := strings.TrimSpace(string(b)) + if s != "" { + return s + } + } + // LLDP chassis/port id часто — MAC из 6 байт (не UTF-8). + if len(b) == 6 { + return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", b[0], b[1], b[2], b[3], b[4], b[5]) + } + return "0x" + hex.EncodeToString(b) +} + func snmpValueToString(v any) string { if b, ok := v.([]byte); ok { - if len(b) == 0 { - return "" - } - if utf8.Valid(b) { - s := strings.TrimSpace(string(b)) - if s != "" { - return s - } - } - // Chassis ID / port ID в LLDP часто приходят как OCTET STRING (MAC и т.д.) — не UTF-8 - return "0x" + hex.EncodeToString(b) + return snmpBytesToDisplay(b) } return strings.TrimSpace(fmt.Sprint(v)) }