From 264865f9d825f2058dd265c7c805aae8abd2cac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D1=83=D1=86=D0=B5=D0=BD=D0=BA=D0=BE=20=D0=90=D0=BD?= =?UTF-8?q?=D0=B4=D1=80=D0=B5=D0=B9=20=D0=90=D0=BD=D0=B0=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 10 Apr 2026 17:49:23 +1000 Subject: [PATCH] =?UTF-8?q?fix(snmp):=20=D1=87=D0=B8=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20FDB=20=D0=B8=D0=B7=20Q-BRIDGE-MIB=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил сбор dot1qTpFdbPort и парсинг MAC из хвоста OID-индекса, чтобы Таблица 2 заполнялась на коммутаторах, где FDB хранится в Q-BRIDGE-MIB (vlan+mac). Made-with: Cursor --- internal/scans/runner.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/internal/scans/runner.go b/internal/scans/runner.go index 33810c2..54d3f35 100644 --- a/internal/scans/runner.go +++ b/internal/scans/runner.go @@ -227,12 +227,21 @@ func probePortDevices(client *gosnmp.GoSNMP, ip string, checkedAt time.Time) []P basePortIfIndex := walkAsMap(client, ".1.3.6.1.2.1.17.1.4.1.2") // dot1dTpFdbPort: mac(6 octets) -> bridge-port fdbMacToBridgePort := walkAsMap(client, ".1.3.6.1.2.1.17.4.3.1.2") + // dot1qTpFdbPort (Q-BRIDGE-MIB): vlan + mac(6 octets) -> bridge-port + qFdbMacToBridgePort := walkAsMap(client, ".1.3.6.1.2.1.17.7.1.2.2.1.2") // ipNetToMediaPhysAddress: ifIndex.ip -> mac arpIfIPToMac := walkAsMap(client, ".1.3.6.1.2.1.4.22.1.2") - if len(basePortIfIndex) == 0 || len(fdbMacToBridgePort) == 0 { + if len(basePortIfIndex) == 0 || (len(fdbMacToBridgePort) == 0 && len(qFdbMacToBridgePort) == 0) { return nil } + combinedFdb := make(map[string]string, len(fdbMacToBridgePort)+len(qFdbMacToBridgePort)) + for k, v := range fdbMacToBridgePort { + combinedFdb[k] = v + } + for k, v := range qFdbMacToBridgePort { + combinedFdb[k] = v + } macToIPs := make(map[string]map[string]struct{}) for key, mac := range arpIfIPToMac { @@ -255,9 +264,9 @@ func probePortDevices(client *gosnmp.GoSNMP, ip string, checkedAt time.Time) []P } seen := make(map[string]struct{}) - out := make([]PortDeviceResult, 0, len(fdbMacToBridgePort)) - for macTail, bridgePortRaw := range fdbMacToBridgePort { - mac := dottedDecimalToMAC(macTail) + out := make([]PortDeviceResult, 0, len(combinedFdb)) + for macTail, bridgePortRaw := range combinedFdb { + mac := dottedDecimalToMACTail(macTail) if mac == "" { continue } @@ -322,11 +331,12 @@ func probePortDevices(client *gosnmp.GoSNMP, ip string, checkedAt time.Time) []P return out } -func dottedDecimalToMAC(s string) string { +func dottedDecimalToMACTail(s string) string { p := strings.Split(strings.TrimSpace(s), ".") - if len(p) != 6 { + if len(p) < 6 { return "" } + p = p[len(p)-6:] b := make([]byte, 6) for i := 0; i < 6; i++ { n, err := strconv.Atoi(p[i])