Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
topology_discovery_example.py10.5 kB
#!/usr/bin/env python3 """ NetBrain MCP 拓扑发现功能使用示例 本示例展示如何使用NetBrain MCP的拓扑发现功能: 1. 从种子设备开始发现整个网络拓扑 2. 查询设备的邻居信息 3. 获取拓扑统计数据 4. 使用不同厂商的设备进行拓扑发现 使用方法: 1. 确保已添加网络设备和凭据 2. 运行此脚本查看拓扑发现示例 """ import asyncio import sys import os # 添加项目根目录到 Python 路径 sys.path.insert(0, os.path.abspath('..')) from network_devices import ( device_manager, NetworkDevice, DeviceCredential, DeviceType, DeviceVendor, ConnectionProtocol ) from device_connector import connection_manager from topology_discovery_improved import create_improved_topology_discovery async def example_basic_topology_discovery(): """基础拓扑发现示例""" print("=" * 60) print("基础拓扑发现示例") print("=" * 60) # 创建拓扑发现引擎 topology_discovery = create_improved_topology_discovery(device_manager, connection_manager) # 查看当前设备列表 devices = device_manager.list_devices() print(f"\n当前系统中的设备:") for i, device in enumerate(devices, 1): credential_info = "" if device.credential_id: cred = device_manager.get_credential(device.credential_id) if cred: credential_info = f" (凭据: {cred.name})" print(f" {i}. {device.name} - {device.ip_address} - {device.vendor.value}{credential_info}") if not devices: print(" 没有找到设备。请先添加一些设备再运行此示例。") return # 从第一个设备开始拓扑发现 device = devices[0] print(f"\n从设备 '{device.name}' 开始拓扑发现...") try: topology = await topology_discovery.discover_topology_from_devices([device.id]) print(f"\n拓扑发现完成!") print(f" - 发现的节点数量: {len(topology.nodes)}") print(f" - 发现的链路数量: {len(topology.links)}") print(f" - 发现时间: {topology.last_discovery}") # 显示发现的节点 if topology.nodes: print(f"\n发现的网络节点:") for node_id, node in topology.nodes.items(): print(f" - {node.device_name} ({node.ip_address}) - {node.vendor}") print(f" 接口数量: {len(node.interfaces)}") # 显示发现的链路 if topology.links: print(f"\n发现的网络链路:") for link in topology.links: source_node = topology.nodes.get(link.source_device_id) target_node = topology.nodes.get(link.target_device_id) source_name = source_node.device_name if source_node else "未知设备" target_name = target_node.device_name if target_node else "未知设备" print(f" - {source_name}[{link.source_interface}] <--> {target_name}[{link.target_interface}]") print(f" 协议: {link.protocol.value}") except Exception as e: print(f" 拓扑发现失败: {e}") async def example_device_neighbor_discovery(): """设备邻居发现示例""" print("\n" + "=" * 60) print("设备邻居发现示例") print("=" * 60) topology_discovery = create_improved_topology_discovery(device_manager, connection_manager) devices = device_manager.list_devices() if not devices: print("没有找到设备。") return device = devices[0] print(f"\n发现设备 '{device.name}' 的邻居...") try: neighbors, interfaces = await topology_discovery.discover_device_neighbors(device) print(f"\n邻居发现结果:") print(f" - 发现的邻居数量: {len(neighbors)}") print(f" - 发现的接口数量: {len(interfaces)}") if neighbors: print(f"\n邻居设备信息:") for neighbor in neighbors: print(f" - 设备ID: {neighbor.get('device_id', '未知')}") print(f" IP地址: {neighbor.get('ip_address', '未知')}") print(f" 本地接口: {neighbor.get('local_interface', '未知')}") print(f" 远程接口: {neighbor.get('remote_interface', '未知')}") print(f" 协议: {neighbor.get('protocol', '未知')}") print() if interfaces: print(f"设备接口信息 (前5个):") for i, interface in enumerate(interfaces[:5]): print(f" {i+1}. {interface.name}") print(f" IP地址: {interface.ip_address or '未配置'}") print(f" 状态: {interface.status}/{interface.protocol}") except Exception as e: print(f" 邻居发现失败: {e}") def example_topology_statistics(): """拓扑统计示例""" print("\n" + "=" * 60) print("拓扑统计示例") print("=" * 60) topology_discovery = create_improved_topology_discovery(device_manager, connection_manager) topology = topology_discovery.get_topology() print(f"\n当前拓扑统计:") print(f" - 总节点数: {len(topology.nodes)}") print(f" - 总链路数: {len(topology.links)}") print(f" - 最后发现时间: {topology.last_discovery or '从未发现'}") # 协议分布统计 if topology.links: protocol_stats = {} for link in topology.links: protocol = link.protocol.value protocol_stats[protocol] = protocol_stats.get(protocol, 0) + 1 print(f"\n协议分布:") for protocol, count in protocol_stats.items(): print(f" - {protocol.upper()}: {count} 条链路") # 厂商分布统计 if topology.nodes: vendor_stats = {} for node in topology.nodes.values(): vendor = node.vendor vendor_stats[vendor] = vendor_stats.get(vendor, 0) + 1 print(f"\n厂商分布:") for vendor, count in vendor_stats.items(): print(f" - {vendor.upper()}: {count} 个设备") def example_add_sample_devices(): """添加示例设备""" print("\n" + "=" * 60) print("添加示例设备 (仅用于演示,不连接真实设备)") print("=" * 60) # 添加示例凭据 sample_credential = DeviceCredential( name="示例SSH凭据", username="admin", password="admin123", protocol=ConnectionProtocol.SSH, port=22 ) cred_id = device_manager.add_credential(sample_credential) # 添加思科路由器示例 cisco_router = NetworkDevice( name="Core-Router-01", ip_address="192.168.1.1", device_type=DeviceType.ROUTER, vendor=DeviceVendor.CISCO, platform="cisco_iosxe", model="ISR4431", location="数据中心机房A", description="核心路由器", credential_id=cred_id ) device_manager.add_device(cisco_router) # 添加华为交换机示例 huawei_switch = NetworkDevice( name="Access-Switch-01", ip_address="192.168.1.10", device_type=DeviceType.SWITCH, vendor=DeviceVendor.HUAWEI, platform="huawei_vrp", model="S5720-28P-LI", location="数据中心机房A", description="接入交换机", credential_id=cred_id ) device_manager.add_device(huawei_switch) print("已添加示例设备:") print(f" - {cisco_router.name} ({cisco_router.ip_address}) - 思科路由器") print(f" - {huawei_switch.name} ({huawei_switch.ip_address}) - 华为交换机") def example_command_templates(): """命令模板使用示例""" print("\n" + "=" * 60) print("命令模板使用示例") print("=" * 60) from templates.command_templates import get_command_template print("\n思科设备拓扑发现命令:") cisco_commands = [ ("CDP邻居详情", get_command_template("cisco", "topology_discovery", "get_cdp_neighbors_detail")), ("LLDP邻居详情", get_command_template("cisco", "topology_discovery", "get_lldp_neighbors_detail")), ("接口简要信息", get_command_template("cisco", "topology_discovery", "get_interface_brief")), ("启用CDP", get_command_template("cisco", "topology_discovery", "enable_cdp")), ] for desc, cmd in cisco_commands: print(f" - {desc}: {cmd}") print("\n华为设备拓扑发现命令:") huawei_commands = [ ("LLDP邻居详情", get_command_template("huawei", "topology_discovery", "get_lldp_neighbors_detail")), ("接口简要信息", get_command_template("huawei", "topology_discovery", "get_interface_brief")), ("启用LLDP", get_command_template("huawei", "topology_discovery", "enable_lldp")), ("MAC地址表", get_command_template("huawei", "topology_discovery", "get_mac_address_table")), ] for desc, cmd in huawei_commands: print(f" - {desc}: {cmd}") async def main(): """主函数""" print("NetBrain MCP 拓扑发现功能使用示例") print("本示例展示拓扑发现的各种功能和用法") # 1. 显示命令模板 example_command_templates() # 2. 显示当前拓扑统计 example_topology_statistics() # 3. 基础拓扑发现 await example_basic_topology_discovery() # 4. 设备邻居发现 await example_device_neighbor_discovery() # 5. 再次显示统计(可能已有数据) example_topology_statistics() print("\n" + "=" * 60) print("示例完成!") print("\n提示:") print("- 要进行真实的拓扑发现,请确保设备可达且凭据正确") print("- 支持思科CDP和标准LLDP协议") print("- 可以通过Web API或MCP工具调用拓扑发现功能") print("- 拓扑数据会自动保存到data/topology.json文件") print("=" * 60) if __name__ == "__main__": asyncio.run(main())

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NorthLaneMS/NetBrain_MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server