1
0

Feat: 支持通过MAC地址进行邻居匹配和拓扑连线

- Neighbor模型添加RemoteMAC字段
- Device模型添加MACAddresses字段
- H3C解析器保存邻居MAC地址和设备所有接口MAC
- 拓扑构建支持三层匹配: IP -> 设备名 -> MAC地址
- 即使ARP表获取失败也能通过MAC地址自动连线
This commit is contained in:
Your Name
2026-04-26 01:08:14 +08:00
vanhempi 872ebc0376
commit 6771858c40
3 muutettua tiedostoa jossa 44 lisäystä ja 11 poistoa
+25 -8
Näytä tiedosto
@@ -56,24 +56,41 @@ func (b *Builder) Build() models.TopologyGraph {
edgeMap := make(map[string]bool) // 用于去重
for _, device := range b.devices {
for _, neighbor := range device.Neighbors {
// 检查邻居是否在设备列表中
if _, exists := nodeMap[neighbor.RemoteIP]; !exists && neighbor.RemoteDevice != "" {
// 尝试通过设备名匹配
// 尝试匹配邻居设备
targetIP := neighbor.RemoteIP
// 如果没有IP,尝试通过设备名匹配
if targetIP == "" && neighbor.RemoteDevice != "" {
for _, d := range b.devices {
if d.Hostname == neighbor.RemoteDevice {
neighbor.RemoteIP = d.IP
targetIP = d.IP
break
}
}
}
// 如果还是没有,尝试通过MAC地址匹配(新增)
if targetIP == "" && neighbor.RemoteMAC != "" {
for _, d := range b.devices {
for _, mac := range d.MACAddresses {
if mac == neighbor.RemoteMAC {
targetIP = d.IP
break
}
}
if targetIP != "" {
break
}
}
}
if neighbor.RemoteIP == "" {
if targetIP == "" {
continue
}
// 创建唯一的边ID
edgeID := fmt.Sprintf("%s-%s-%s", device.IP, neighbor.LocalInterface, neighbor.RemoteIP)
reverseEdgeID := fmt.Sprintf("%s-%s-%s", neighbor.RemoteIP, neighbor.RemoteInterface, device.IP)
edgeID := fmt.Sprintf("%s-%s-%s", device.IP, neighbor.LocalInterface, targetIP)
reverseEdgeID := fmt.Sprintf("%s-%s-%s", targetIP, neighbor.RemoteInterface, device.IP)
// 避免重复边
if edgeMap[edgeID] || edgeMap[reverseEdgeID] {
@@ -83,7 +100,7 @@ func (b *Builder) Build() models.TopologyGraph {
edge := models.TopologyEdge{
ID: edgeID,
Source: device.IP,
Target: neighbor.RemoteIP,
Target: targetIP,
SourceInterface: neighbor.LocalInterface,
TargetInterface: neighbor.RemoteInterface,
Protocol: neighbor.Protocol,