fix(snmp): читать FDB из Q-BRIDGE-MIB для таблицы устройств за портом
Добавил сбор dot1qTpFdbPort и парсинг MAC из хвоста OID-индекса, чтобы Таблица 2 заполнялась на коммутаторах, где FDB хранится в Q-BRIDGE-MIB (vlan+mac). Made-with: Cursor
This commit is contained in:
@@ -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")
|
basePortIfIndex := walkAsMap(client, ".1.3.6.1.2.1.17.1.4.1.2")
|
||||||
// dot1dTpFdbPort: mac(6 octets) -> bridge-port
|
// dot1dTpFdbPort: mac(6 octets) -> bridge-port
|
||||||
fdbMacToBridgePort := walkAsMap(client, ".1.3.6.1.2.1.17.4.3.1.2")
|
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
|
// ipNetToMediaPhysAddress: ifIndex.ip -> mac
|
||||||
arpIfIPToMac := walkAsMap(client, ".1.3.6.1.2.1.4.22.1.2")
|
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
|
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{})
|
macToIPs := make(map[string]map[string]struct{})
|
||||||
for key, mac := range arpIfIPToMac {
|
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{})
|
seen := make(map[string]struct{})
|
||||||
out := make([]PortDeviceResult, 0, len(fdbMacToBridgePort))
|
out := make([]PortDeviceResult, 0, len(combinedFdb))
|
||||||
for macTail, bridgePortRaw := range fdbMacToBridgePort {
|
for macTail, bridgePortRaw := range combinedFdb {
|
||||||
mac := dottedDecimalToMAC(macTail)
|
mac := dottedDecimalToMACTail(macTail)
|
||||||
if mac == "" {
|
if mac == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -322,11 +331,12 @@ func probePortDevices(client *gosnmp.GoSNMP, ip string, checkedAt time.Time) []P
|
|||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
func dottedDecimalToMAC(s string) string {
|
func dottedDecimalToMACTail(s string) string {
|
||||||
p := strings.Split(strings.TrimSpace(s), ".")
|
p := strings.Split(strings.TrimSpace(s), ".")
|
||||||
if len(p) != 6 {
|
if len(p) < 6 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
p = p[len(p)-6:]
|
||||||
b := make([]byte, 6)
|
b := make([]byte, 6)
|
||||||
for i := 0; i < 6; i++ {
|
for i := 0; i < 6; i++ {
|
||||||
n, err := strconv.Atoi(p[i])
|
n, err := strconv.Atoi(p[i])
|
||||||
|
|||||||
Reference in New Issue
Block a user