Debug: 增强拓扑构建调试日志和MAC地址标准化
- 打印所有设备的MAC地址数据库 - 详细输出每个邻居的匹配过程 - 添加normalizeMAC函数标准化MAC地址格式 - 解决MAC地址格式不一致导致匹配失败的问题
This commit is contained in:
@@ -2,6 +2,7 @@ package topology
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"network-topology-discovery/pkg/models"
|
"network-topology-discovery/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -54,24 +55,44 @@ func (b *Builder) Build() models.TopologyGraph {
|
|||||||
|
|
||||||
// 构建边(基于邻居信息)
|
// 构建边(基于邻居信息)
|
||||||
edgeMap := make(map[string]bool) // 用于去重
|
edgeMap := make(map[string]bool) // 用于去重
|
||||||
|
|
||||||
|
// 打印所有设备的MAC地址,用于调试
|
||||||
|
fmt.Println("\n========== MAC Address Database ==========")
|
||||||
|
for _, d := range b.devices {
|
||||||
|
if len(d.MACAddresses) > 0 {
|
||||||
|
fmt.Printf("Device %s (%s): %d MAC addresses\n", d.Hostname, d.IP, len(d.MACAddresses))
|
||||||
|
for i, mac := range d.MACAddresses {
|
||||||
|
if i < 5 { // 只打印前5个
|
||||||
|
fmt.Printf(" MAC[%d]: %s\n", i, mac)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(d.MACAddresses) > 5 {
|
||||||
|
fmt.Printf(" ... and %d more\n", len(d.MACAddresses)-5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("==========================================\n")
|
||||||
|
|
||||||
for _, device := range b.devices {
|
for _, device := range b.devices {
|
||||||
fmt.Printf("Building edges for device %s: %d neighbors, %d MAC addresses\n",
|
fmt.Printf("Building edges for device %s: %d neighbors, %d MAC addresses\n",
|
||||||
device.IP, len(device.Neighbors), len(device.MACAddresses))
|
device.IP, len(device.Neighbors), len(device.MACAddresses))
|
||||||
|
|
||||||
for _, neighbor := range device.Neighbors {
|
for _, neighbor := range device.Neighbors {
|
||||||
|
fmt.Printf(" Processing neighbor on %s: RemoteMAC=%s, RemoteDevice=%s, RemoteIP=%s\n",
|
||||||
|
neighbor.LocalInterface, neighbor.RemoteMAC, neighbor.RemoteDevice, neighbor.RemoteIP)
|
||||||
|
|
||||||
// 尝试匹配邻居设备
|
// 尝试匹配邻居设备
|
||||||
targetIP := neighbor.RemoteIP
|
targetIP := neighbor.RemoteIP
|
||||||
matchMethod := "IP"
|
matchMethod := "IP"
|
||||||
|
|
||||||
// 如果没有IP,尝试通过设备名匹配
|
// 如果没有IP,尝试通过设备名匹配
|
||||||
if targetIP == "" && neighbor.RemoteDevice != "" {
|
if targetIP == "" && neighbor.RemoteDevice != "" {
|
||||||
fmt.Printf(" Neighbor %s has no IP, trying hostname match: %s\n",
|
fmt.Printf(" Trying hostname match: %s\n", neighbor.RemoteDevice)
|
||||||
neighbor.LocalInterface, neighbor.RemoteDevice)
|
|
||||||
for _, d := range b.devices {
|
for _, d := range b.devices {
|
||||||
if d.Hostname == neighbor.RemoteDevice {
|
if d.Hostname == neighbor.RemoteDevice {
|
||||||
targetIP = d.IP
|
targetIP = d.IP
|
||||||
matchMethod = "hostname"
|
matchMethod = "hostname"
|
||||||
fmt.Printf(" Matched by hostname: %s -> %s\n", d.Hostname, d.IP)
|
fmt.Printf(" ✓ Matched by hostname: %s -> %s\n", d.Hostname, d.IP)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,14 +100,18 @@ func (b *Builder) Build() models.TopologyGraph {
|
|||||||
|
|
||||||
// 如果还是没有,尝试通过MAC地址匹配(新增)
|
// 如果还是没有,尝试通过MAC地址匹配(新增)
|
||||||
if targetIP == "" && neighbor.RemoteMAC != "" {
|
if targetIP == "" && neighbor.RemoteMAC != "" {
|
||||||
fmt.Printf(" Neighbor %s has no IP/hostname, trying MAC match: %s\n",
|
fmt.Printf(" Trying MAC match: %s\n", neighbor.RemoteMAC)
|
||||||
neighbor.LocalInterface, neighbor.RemoteMAC)
|
|
||||||
for _, d := range b.devices {
|
for _, d := range b.devices {
|
||||||
for _, mac := range d.MACAddresses {
|
for _, mac := range d.MACAddresses {
|
||||||
if mac == neighbor.RemoteMAC {
|
// 标准化MAC地址进行比较(去除分隔符,转小写)
|
||||||
|
normalizedNeighborMAC := normalizeMAC(neighbor.RemoteMAC)
|
||||||
|
normalizedDeviceMAC := normalizeMAC(mac)
|
||||||
|
|
||||||
|
if normalizedNeighborMAC == normalizedDeviceMAC {
|
||||||
targetIP = d.IP
|
targetIP = d.IP
|
||||||
matchMethod = "MAC"
|
matchMethod = "MAC"
|
||||||
fmt.Printf(" Matched by MAC: %s -> %s\n", mac, d.IP)
|
fmt.Printf(" ✓ Matched by MAC: %s (device) == %s (neighbor) -> %s\n",
|
||||||
|
mac, neighbor.RemoteMAC, d.IP)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,12 +122,11 @@ func (b *Builder) Build() models.TopologyGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if targetIP == "" {
|
if targetIP == "" {
|
||||||
fmt.Printf(" Neighbor %s could not be matched (RemoteIP=%s, RemoteMAC=%s, RemoteDevice=%s)\n",
|
fmt.Printf(" ✗ Could not match neighbor on %s\n", neighbor.LocalInterface)
|
||||||
neighbor.LocalInterface, neighbor.RemoteIP, neighbor.RemoteMAC, neighbor.RemoteDevice)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf(" Creating edge: %s (%s) -> %s via %s, matched by %s\n",
|
fmt.Printf(" ✓ Creating edge: %s (%s) -> %s via %s, matched by %s\n",
|
||||||
device.IP, neighbor.LocalInterface, targetIP, neighbor.RemoteInterface, matchMethod)
|
device.IP, neighbor.LocalInterface, targetIP, neighbor.RemoteInterface, matchMethod)
|
||||||
|
|
||||||
// 创建唯一的边ID
|
// 创建唯一的边ID
|
||||||
@@ -131,6 +155,19 @@ func (b *Builder) Build() models.TopologyGraph {
|
|||||||
return graph
|
return graph
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// normalizeMAC 标准化MAC地址(去除分隔符,转小写)
|
||||||
|
func normalizeMAC(mac string) string {
|
||||||
|
// 去除所有分隔符(-、:、.)
|
||||||
|
result := ""
|
||||||
|
for _, c := range mac {
|
||||||
|
if c != '-' && c != ':' && c != '.' {
|
||||||
|
result += string(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 转小写
|
||||||
|
return strings.ToLower(result)
|
||||||
|
}
|
||||||
|
|
||||||
// getDeviceIcon 获取设备图标
|
// getDeviceIcon 获取设备图标
|
||||||
func getDeviceIcon(deviceType models.DeviceType) string {
|
func getDeviceIcon(deviceType models.DeviceType) string {
|
||||||
switch deviceType {
|
switch deviceType {
|
||||||
|
|||||||
Reference in New Issue
Block a user