Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
topology_discovery_improved.cpython-312.pyc54.2 kB
� �q1hή����ddlmZmZmZmZmZmZddlmZm Z ddl m Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlZddlZGd�de j,�Ze j0e j2de j4e j6� �g� �e j8j:D]-Zeee j4�s�ejAed���/e jBd �Z"dd l#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*Gd�de �Z+Gd�de �Z,eGd�d��Z-eGd�d��Z.eGd�d��Z/eGd�d��Z0Gd�d�Z1de$de*de1fd�Z2y) �)�Dict�List�Optional�Any�Set�Tuple)� dataclass�field)�EnumN)�datetime� timedeltac�*��eZdZd�fd� Z�fd�Z�xZS)� JsonFormatterc�(��t�|�|||�y�N)�super�__init__)�self�fmt�datefmt�style� __class__s ��-F:\NetBrainMCP\topology_discovery_improved.pyrzJsonFormatter.__init__s��� ����g�u�-�c�f��t�|�|�}|jdd��jd�S)N�utf-8�replace)�errors)r�format�encode�decode)r�record� log_recordrs �rrzJsonFormatter.formats2����W�^�F�+� �� � ��� �;�B�B�7�K�Kr)NN�%)�__name__� __module__� __qualname__rr� __classcell__)rs@rrrs���.�L�Lrrz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�stream)�levelr�handlers�topology_discovery_improved)� DeviceManager� NetworkDevice� DeviceVendor� DeviceType� DeviceStatus)�ConnectionManagerc��eZdZdZdZdZdZy)�TopologyProtocolu拓扑发现协议枚举�cdp�lldp�unknownN)r%r&r'�__doc__�CDP�LLDP�UNKNOWN�rrr4r4*s��"� �C� �D��Grr4c�$�eZdZdZdZdZdZdZdZy)�ConnectionTypeu连接类型枚举�ethernet�serial�trunk�accessr7N) r%r&r'r8�ETHERNET�SERIAL�TRUNK�ACCESSr;r<rrr>r>0s����H� �F� �E� �F��Grr>c���eZdZUdZeed<dZeeed<dZeeed<dZ eeed<dZ eed<dZ eed <dZ eeed <dZ eeed <dZeeed <d eeeffd�Zy)� InterfaceInfou 接口信息�nameN� description� ip_address� mac_addressr7�status�protocol�speed�duplex�vlan�returnc ���|j|j|j|j|j|j |j |j|jd� S)N� rIrJrKrLrMrNrOrPrQrT�rs r�to_dictzInterfaceInfo.to_dictEsO���I�I��+�+��/�/��+�+��k�k�� � ��Z�Z��k�k��I�I�  � r)r%r&r'r8�str�__annotations__rJrrKrLrMrNrOrPrQrrrVr<rrrHrH8s���� �I�!%�K��#��%� $�J��� �$�!%�K��#��%��F�C���H�c���E�8�C�=�� �F�H�S�M� ��D�(�3�-��  ��c�3�h��  rrHc���eZdZUdZeed<eed<eed<eed<ejZeed<e jZ e ed<e e j��Ze ed <e e j��Ze ed <d eeeffd �Zy )� TopologyLinku 拓扑链路�source_device_id�source_interface�target_device_id�target_interfacerN�connection_type��default_factory� discovered_at� last_seenrRc ��|j|j|j|j|jj |j j |jj�|jj�d�S)N�r[r\r]r^rNr_rbrc) r[r\r]r^rN�valuer_rb� isoformatrcrUs rrVzTopologyLink.to_dict^sn�� $� 5� 5� $� 5� 5� $� 5� 5� $� 5� 5�� � �+�+�#�3�3�9�9�!�/�/�9�9�;����1�1�3�  � rN)r%r&r'r8rWrXr4r;rNr>r_r r �nowrbrcrrrVr<rrrZrZRsx�����������!1�!9�!9�H��9�&4�&<�&<�O�^�<�#�H�L�L�A�M�8�A��� � �=�I�x�=�  ��c�3�h��  rrZc���eZdZUdZeed<eed<eed<eed<eed<ee��Ze e ed<d Z e e eefed <eej ��Zeed <eej ��Zeed <d e eeffd�Zy )� TopologyNodeu 拓扑节点� device_id� device_name� device_type�vendorrKr`� interfacesN�positionrbrcrRc �J�|j|j|j|j|jd|j D�cgc]}|j ���c}|j|jj�|jj�d� Scc}w)Nr7) rkrIrKrnrmrMrorprbrc) rkrlrKrnrmrorVrprbrgrc)r�ifaces rrVzTopologyNode.to_dictws�������$�$��/�/��k�k��+�+��8<���H��u�5�=�=�?��H�� � �!�/�/�9�9�;����1�1�3�  � ��Is�B )r%r&r'r8rWrXr �listrorrHrprr�floatr rhrbrcrrVr<rrrjrjjs�����N����� �K��O�&+�D�&A�J��]�#�A�+/�H�h�t�C��J�'�(�/�#�H�L�L�A�M�8�A��� � �=�I�x�=�  ��c�3�h��  rrjc���eZdZUdZee��Zeee fe d<ee ��Z e ee d<dZeee d<ee ��Ze ee d<de fd �Zd efd �Zd ed e efd�Zd eeeffd�Zy)�NetworkTopologyu 网络拓扑r`�nodes�linksN�last_discovery�discovery_scope�nodec�6�||j|j<y)u 添加节点N)rwrk)rr{s r�add_nodezNetworkTopology.add_node�s��%)�� � �4�>�>�"r�linkc �p�|jD]�}|j|jk(s�|j|jk(s�7|j|jk(s�Q|j|jk(s�k|j |_t jd|j�d|j���y|jj|�t jd|j�d|j�d|j�d|j�d|jj�d� �y) u添加链路(避免重复)u更新现有链路: � -> Nu添加新链路: �[z] -> z] (�)) rxr[r\r]r^rc�logger�debug�append�inforNrf)rr~� existing_links r�add_linkzNetworkTopology.add_link�s=��"�Z�Z�M��.�.�$�2G�2G�G��.�.�$�2G�2G�G��.�.�$�2G�2G�G��.�.�$�2G�2G�G�*.�.�.� �'�� � �3�D�4I�4I�3J�$�t�Od�Od�Ne�f�g��(� � � ���$��� � �'��(=�(=�'>�a��@U�@U�?V�V[�\`�\q�\q�[r�rs�tx�uJ�uJ�tK�KN�OS�O\�O\�Ob�Ob�Nc�cd�e� frrkrRc���t�}|jD]X}|j|k(r|j|j��.|j|k(s�>|j|j��Zt |�S)u#获取设备的邻居设备ID列表)�setrxr[�addr]rs)rrk� neighborsr~s r�get_device_neighborsz$NetworkTopology.get_device_neighbors�sc���E� ��J�J�D��$�$� �1�� � �d�3�3�4��&�&�)�3�� � �d�3�3�4� � �I��rc�F�|jj�D��cic]\}}||j���c}}|jD�cgc]}|j���c}|jr|jj �nd|j d�Scc}}wcc}w)N)rwrxryrz)rw�itemsrVrxryrgrz)r�node_idr{r~s rrVzNetworkTopology.to_dict�s���CG�:�:�CS�CS�CU�V�CU�-�'�4�g�t�|�|�~�-�CU�V�15���<���d�l�l�n��<�AE�AT�AT�d�1�1�;�;�=�Z^�#�3�3�  � ��V��<s �B� B)r%r&r'r8r �dictrwrrWrjrXrsrxrrZryrr rzr}r�r�rrVr<rrrvrv�s����%*�4�%@�E�4��\�!� "�@� %�d� ;�E�4� � �;�)-�N�H�X�&�-�!&�t�!<�O�T�#�Y�<�*�\�*�f�\�f�"�c��d�3�i�� ��c�3�h�� rrvc ��eZdZdZdedefd�Zd�Zd�Zde e de fd �Z d e dee ee efe effd �Zd e de ee effd �Zd e de ee effd�Zde de deee effd�Zde defd�Zd e de ee effd�Zd e de ee effd�Zdee efde dee fd�Zdee efdefd�Zdee efde fd�Zdee efdefd�Z de de fd�Z!d e de efd�Z"d e dede efd�Z#de defd �Z$d e de ee effd!�Z%d e de ee effd"�Z&d e de ee effd#�Z'd e de ee effd$�Z(d e de ee effd%�Z)de fd&�Z*d'�Z+y())�ImprovedTopologyDiscoveryu改进的拓扑发现引擎�device_manager�connection_managerc� �||_||_t�|_d|_t j j|jd�|_t j|jd��|j�y)N�dataz topology.jsonT)�exist_ok) r�r�rv�topology�data_dir�os�path�join� topology_file�makedirs� load_topology)rr�r�s rrz"ImprovedTopologyDiscovery.__init__�s`��,���"4���'�)�� ��� ��W�W�\�\�$�-�-��I��� � � �D�M�M�D�1� ���rc ��� t|jdd��5}tj|jj �|dd��ddd�t jd|j�d t|jj��d t|jj��d ��y#1swY�mxYw#t$r"}t jd |���Yd}~yd}~wwxYw) u保存拓扑数据到文件�wr��encodingF�)� ensure_ascii�indentNu拓扑数据已保存到: � (� 个节点,u 条链路)u保存拓扑数据失败: ) �openr��json�dumpr�rVr�r��lenrwrx� Exception�error)r�f�es r� save_topologyz'ImprovedTopologyDiscovery.save_topology�s��� ;��d�(�(�#��@�A�� � �$�-�-�/�/�1�1�5�QR�S�A� �K�K�4�T�5G�5G�4H��3�t�}�}�Ob�Ob�Kc�Jd�dp�qt�uy�vC�vC�vI�vI�rJ�qK�KU�V� W�A�@��� ;� �L�L�5�a�S�9� :� :�� ;�s/�C�2B8� A+C�8C�=C� C/� C*�*C/c��tjj|j�stj d�y t |jdd��5}tj|�}ddd�t�|_ jdi�j�D]�\}}g}|jdg�D]}|jtd"i|����t|d|jd |jd d ��|d |d |d||jd�t!j"|d�t!j"|d��� }|jj%|���|jdg�D]�}t'|d|d|d|dt)|d�t+|jdd��t!j"|d�t!j"|d���} |jj-| ���|jd�r't!j"|d�|j_|jdg�|j_tj dt3|jj4��dt3|jj6��d ��y#1swY��\xYw#t8$r"} tj;d!| ���Yd} ~ yd} ~ wwxYw)#u从文件加载拓扑数据u3拓扑数据文件不存在,将创建新的拓扑N�rrr�rwrorkrIrl�UnknownrmrnrKrprbrc) rkrlrmrnrKrorprbrcrxr[r\r]r^rNr_r7reryrzu已加载拓扑数据:r�u 条链路u加载拓扑数据失败: r<)r�r��existsr�r�r�r�r��loadrvr��getr�r�rHrjr � fromisoformatr}rZr4r>r�ryrzr�rwrxr�r�) rr�r�r�� node_dataro� iface_datar{� link_datar~r�s rr�z'ImprovedTopologyDiscovery.load_topology�s����w�w�~�~�d�0�0�1� �K�K�M� N� �/ ;��d�(�(�#��@�A��y�y��|��A�,�-�D�M�'+�h�h�w��&;�&A�&A�&C�"���� �"+�-�-� �b�"A�J��%�%�m�&A�j�&A�B�#B�$�'� �4� )� � �f�i�m�m�M�S\�6]� ^� )�-� 8�$�X�.�(��6�)�&�]�]�:�6�"*�"8�"8��?�9S�"T�&�4�4�Y�{�5K�L� ��� � �&�&�t�,�!'D�&"�X�X�g�r�2� �#�%.�/A�%B�%.�/A�%B�%.�/A�%B�%.�/A�%B�-�i� �.C�D�$2�9�=�=�AR�T]�3^�$_�"*�"8�"8��?�9S�"T�&�4�4�Y�{�5K�L� ��� � �&�&�t�,�3��x�x�(�)�/7�/E�/E�d�K[�F\�/]�� � �,�,0�H�H�5F��,K�D�M�M� )� �K�K�2�3�t�}�}�7J�7J�3K�2L�L�Y\�]a�]j�]j�]p�]p�Yq�Xr�r{�|� }�YA�@��Z� ;� �L�L�5�a�S�9� :� :�� ;�s1�K�K �/IK� K�K� L�K<�<L� device_idsrRc ��K�tjd|���tjd�t�|_t �}t |�}d}||j_|�r*|j �}||vr�tjd|���|jj|�}|s*tjd|���|j|��w |j|��d{���\}}t|j|j|jj |j"j |j$|��} |jj'| �|D]�} |j)| |��d{���} | s� t+|| j-dd �| j| j-d d �t/| j-d d ��� �} |jj1| �|dz }| j|vs��|j| j�tjd| j�����|j|�tjd|j�dt3|��d��|r��*t9j:�|j_|j?�tjdt3|jj@��dt3|jjB��d|�d��|jS7��97���#t4$r@} tj7d|j�d| ���|j|�Yd} ~ ��d} ~ wwxYw�w)uB从指定设备开始发现拓扑(用户期望的工作流程)u.🚀 开始网络拓扑发现,种子设备: u2🧹 清空现有拓扑数据,重新开始发现ru📡 正在发现设备拓扑: u⚠️ 设备不存在: N)rkrlrmrnrKro�local_interface��remote_interfacerNr7)r[r\r]r^rN�u.📋 发现新设备,添加到发现队列: � ✅ 设备 u 发现完成,找到 � 个邻居�❌ 发现设备 u 拓扑失败: u🎉 拓扑发现完成:r�u条链路,发现u个邻居连接)"r�r�rvr�r�rz�popr�� get_device�warningr��discover_device_neighborsrj�idrIrmrfrnrKr}�find_or_create_neighbor_devicerZr�r4r�r�r�r�r rhryr�rwrx)rr��discovered_devices�pending_devices�total_neighbors_found�current_device_id�devicer�ror{� neighbor_info�neighbor_devicer~r�s r�discover_topology_from_devicesz8ImprovedTopologyDiscovery.discover_topology_from_devicess1����� � �D�Z�L�Q�R� � � �H�J�'�)�� � �U���j�/�� !��)3�� � �%�� /� 3� 3� 5� � �$6�6�� �K�K�9�:K�9L�M� N��(�(�3�3�4E�F�F�����!9�:K�9L�M�N�"�&�&�'8�9��) :�.2�.L�.L�V�.T�(T�%� �:�$�$�i�i� &� � � &� 2� 2� 8� 8�!�=�=�.�.�%�0�0�)� ��� � �&�&�t�,�&/�M�,0�,O�,O�P]�_e�,f�&f�O�&�+�->�-:�->�->�?P�RT�-U�-<�-?�-?�-:�->�->�?Q�SU�-V�%5�m�6G�6G� �T]�6^�%_�  ��� � �.�.�t�4�-��2�-�+�-�-�5G�G�+�/�/��0B�0B�C�"�K�K�*X�Yh�Ym�Ym�Xn�(o�p�%&/�(#�&�&�'8�9�� � �k�&�+�+��6M�c�R[�n�M]�]g�h�i�i�v(0�|�|�~�� � �$� ����� � �0��T�]�]�5H�5H�1I�0J�,�WZ�[_�[h�[h�[n�[n�Wo�Vp�qC�DY�CZ�Zi�j� k��}�}��])U�� 'g��*� :�� � �0���� �_�Q�C�P�Q�"�&�&�'8�9�9�� :�sj�CM>�L2�3L,�4BL2�L/�L2�BL2�A?L2�M>�BM>�,L2�/L2�2 M;�;6M6�1M>�6M;�;M>r�c ��� K�g}g}d}|jr%|jj|j�}|s'tj d|j �d��||fS tj d|j �d|j�d��|jj||��d{���\}}|s�tj d|j �d|���||f |jj|j|j��d{���tjd |j ���S|j||��d{���}|jt j"k(rztj d |j ���|j%||��d{���}|j'||��d{���} |j)|�|j)| ��n#|jt j*k(rNtj d |j ���|j-||��d{���} |j)| �n�|jt j.k(rNtj d |j ���|j1||��d{���} |j)| �nMtj d|j ���|j3||��d{���} |j)| �tj d|j �dt5|��dt5|��d�� |jj|j|j��d{���tjd |j ���||fS7���7���#t$r"}tj d |���Yd}~Sd}~wwxYw7���7��77�� 7���7��>7��#t$r/}tj d|j �d|���Yd}~��d}~wwxYw7��#t$r%}tj d |���Yd}~||fSd}~wwxYw# |jj|j|j��d{���7tjd |j ���w#t$r"}tj d |���Yd}~wd}~wwxYwxYw�w)uJ发现单个设备的邻居信息(支持华为 dis lldp nei 等命令)Nu ❌ 设备 u1 没有关联的凭据,无法执行邻居发现u🔗 连接设备: r�r�u❌ 连接设备 u 失败: u🔌 断开设备连接: u❌ 断开设备连接失败: u$🔍 执行Cisco设备邻居发现: u%🔍 执行华为设备邻居发现: u"🔍 执行H3C设备邻居发现: u#🔍 执行通用LLDP邻居发现: u 📊 设备 u 邻居发现结果: u 个邻居, u 个接口r�u 邻居失败: )� credential_idr��get_credentialr�r�rIr�rKr��connect_device�disconnect_devicer�r�r��get_device_interfacesrnr/�CISCO�discover_cisco_neighbors�discover_cisco_lldp_neighbors�extend�HUAWEI�discover_huawei_neighbors�H3C�discover_h3c_neighbors�discover_generic_lldp_neighborsr�) rr�r�ro� credential�successr�r�� cdp_neighbors�lldp_neighborss rr�z3ImprovedTopologyDiscovery.discover_device_neighborsTs7����� �� �� � � � ��,�,�;�;�F�<P�<P�Q�J�� �L�L�;�v�{�{�m�3d�e� f��j�(� (�) C� �K�K�-�f�k�k�]�"�V�=N�=N�<O�q�Q� R�#'�#:�#:�#I�#I�&�R\�#]�]�N�G�U��� � �0���� �Y�u�g�N�O� �*�,�> C��-�-�?�?�� � �:�=�=�Y�Y�Y�� � �8���� �F�G�= $�9�9�&�*�M�M�J��}�}� � 2� 2�2�� � �B�6�;�;�-�P�Q�&*�&C�&C�F�J�&W� W� �'+�'I�'I�&�R\�']�!]��� � ��/�� � ��0����,�"5�"5�5�� � �C�F�K�K�=�Q�R�'+�'E�'E�f�j�'Y�!Y��� � ��0����,�"2�"2�2�� � �@���� �N�O�'+�'B�'B�6�:�'V�!V��� � ��0�� � �A�&�+�+��O�P�'+�'K�'K�F�T^�'_�!_��� � ��0� �K�K�,�v�{�{�m�3H��Y��HX�Xc�dg�hr�ds�ct�t}�~� �  C��-�-�?�?�� � �:�=�=�Y�Y�Y�� � �8���� �F�G��*�$�$�Q^��FZ��� C�� � �=�a�S�A�B�B�� C��?N�� !X��!]�� "Z��"W��"`�� � N� �L�L�,�V�[�[�M����L� M� M�� N�� Z��� C�� � �=�a�S�A�B�B��*�$�$�� C�� C��-�-�?�?�� � �:�=�=�Y�Y�Y�� � �8���� �F�G��� C�� � �=�a�S�A�B�B�� C�sn�A!S1�$AO4�3N/�41O4�&3N5�N2�&N5�S1�O4�O#�AO4�/O&�0O4� O)� A<O4�O,�A*O4�1O/�2A O4�?O2�AO4�3P1�P/�&P1�+S1�/O4�2N5�5 O �>O�S1�O � S1�#O4�&O4�)O4�,O4�/O4�2O4�4 P,�=%P'�"Q"�'P,�,Q"�/P1�1 Q�:Q�S1�Q�S1�"S.�$3S�R�'S�?S.� S+� S&�!S.�&S+�+S.�.S1c ��nK�g}gd�}|D]�} tjd|���|jj|j|j|d���d{���\}}|r{|j ro|j rc|j|j �}|ra|j|�tjd|j�d|�dt|��d ��|Stjd |�d |�����|S7��#t$r&} tjd |�d | ���Yd} ~ ��"d} ~ wwxYw�w)u8发现华为设备邻居(支持 dis lldp nei 命令))z dis lldp neizdisplay lldp neighborzdisplay lldp neighbor briefu🔍 执行华为命令: �<��timeoutNu✅ 华为设备 u 通过命令 'u ' 发现 r�u❌ 华为命令 'u' 执行失败或无输出: u❌ 执行华为命令 'u ' 异常: )r�r�r�� send_commandr�r��output�parse_huawei_lldp_neighborsr�rIr�r�r�r�) rr�r�r��huawei_commands�command�resultr��parsed_neighborsr�s rr�z3ImprovedTopologyDiscovery.discover_huawei_neighbors�sJ����� � �� '�G� P�� � �7��y�A�B�&*�&=�&=�&J�&J��I�I�z�}�}�g�r�'K�'�!� ����f�n�n����'+�'G�'G�� � �'V�$�'�!�(�(�)9�:�� � �&7�� � �}�O�T[�S\�\e�fi�jz�f{�e|�}G�%H�I���� �L�L�#5�g�Y�>Z�[`�Za�!b�c��'�&��!!��� P�� � �7��y� �1�#�N�O�O�� P�sN� D5�AD�D�BD�D5�"D�=D5�D� D2� D-�'D5�-D2�2D5r�c �&�g} tjdt|��d��tjd|���g}d}g}|j�j d�}|D]�}|j�}|s�t j d|�}|rw|r$|r"|j|dj|�f�|jd�}t|jd��} g}tjd |�d | ���| d k(s��d}��|s��|j|���|r$|r"|j|dj|�f�|D]]\} } |j| | �} | s�|j| �tjd | �d | d�d| jdd��d���_tjdt|��d��|S#t$r;} tjd| ���tjd|���Yd} ~ |Sd} ~ wwxYw)u4解析华为设备LLDP邻居信息(详细格式)u&🔍 解析华为LLDP输出,长度: u 字符u📄 LLDP输出内容: N� z%^([\w/]+)\s+has\s+(\d+)\s+neighbors?:r�r�u📍 发现接口: u, 邻居数量: ru✅ 解析华为邻居: r�rkr�r�r7�]u%🎯 华为LLDP解析完成,发现 u 个有效邻居u(❌ 解析华为LLDP邻居信息失败: u输出内容: )r�r�r��strip�split�re�matchr�r��group�int�_parse_huawei_neighbor_detailr�r�r�r�)rr�r��interface_sections�current_interface�current_content�lines�line�interface_match�neighbor_count�interface_name�interface_content�neighborr�s rr�z5ImprovedTopologyDiscovery.parse_huawei_lldp_neighbors�sF��� �8 4� �L�L�A�#�f�+��g�V� W� �L�L�3�F�8�<� =� "$� � $� � �O��L�L�N�(�(��.�E����z�z�|����#%�(�(�+S�UY�"Z��"�(�_�*�1�1�3D�d�i�i�P_�F`�2a�b�)8�(=�(=�a�(@�%�%(��)>�)>�q�)A�%B�N�&(�O��L�L�#6�7H�6I�IY�Zh�Yi�!j�k�&��*�,0�)� �)�'�.�.�t�4�5�:!�_�"�)�)�+<�d�i�i��>X�*Y�Z�6H�1�� 1��=�=�n�N_�`����$�$�X�.��L�L�#;�N�;K�4�PX�Yd�Pe�Of�fg�hp�ht�ht�vH�JS�iT�hU�UV�"W�X� 6H� �K�K�?��I��?O�O_�`� a� ��� � 4� �L�L�C�A�3�G� H� �L�L�>�&��2� 3� 3����  4�s,�DG �G � AG �#A'G � H�0H � Hr�contentc�j� d|d�}tjd|�}|rP|jd�j�}|j |�r||d<n0t j d|�d��yt j d �ytjd |�}|r"|jd�j�|d <tjd |�}|r"|jd�j�|d <tjd|�}|r"|jd�j�|d<tjd|�} | r"| jd�j�|d<t j d|���|S#t$r"} t jd| ���Yd} ~ yd} ~ wwxYw)u+解析单个华为LLDP邻居的详细信息r6)rNr�zSystem name\s*:\s*([^\r\n]+)r�rku🚫 无效的系统名称: '�'Nu.⚠️ 未找到系统名称,跳过此邻居zPort ID\s*:\s*([^\r\n]+)r�z-Management address\s*:\s*(\d+\.\d+\.\d+\.\d+)rKzChassis ID\s*:\s*([^\r\n]+)� chassis_idz2System description\s*:\s*([^\r\n]+(?:\n[^\r\n]+)*)�platformu📋 解析邻居详细信息: u$❌ 解析邻居详细信息失败: ) r��searchr�r��_is_valid_device_namer�r�r�r�) rrrr�sys_name_match�sys_name� port_id_match�mgmt_addr_match�chassis_id_match�sys_desc_matchr�s rr�z7ImprovedTopologyDiscovery._parse_huawei_neighbor_detail�s���, �"�#1��H�  �Y�Y�'F��P�N��)�/�/��2�8�8�:���-�-�h�7�,4�H�[�)��L�L�#@�� �!�!L�M��� � �M�O���I�I�&A�7�K�M��/<�/B�/B�1�/E�/K�/K�/M��+�,�!�i�i�(X�Za�b�O��)8�)>�)>�q�)A�)G�)G�)I���&� "�y�y�)G��Q� ��)9�)?�)?��)B�)H�)H�)J���&� �Y�Y�'\�^e�f�N��'5�';�';�A�'>�'D�'D�'F���$� �L�L�:�8�*�E� F��O��� � �L�L�?��s�C� D��� �s%�A,F�/F�DF� F2�F-�-F2rIc�V�|rt|�dkrygd�}|j�}|D]6}tj||�s�tj d|�d|�d��ytj d|�stj d|�d��ytj d |�d ��y ) u$验证是否为有效的设备名称r�F)z^\d+$z^[^\w]z0^(yes|no|true|false|enabled?|disabled?|up|down)$z"^(unknown|n/a|na|null|none|empty)$z&^(local|remote|interface?|port|intf?)$z%^(chassis|system|management|address)$z,^(information|description|version|software)$z(^(ethernet|gigabit|fastethernet|serial)$z'^(vlan|trunk|access|routing|switching)$z(^(supported|unsupported|classification)$z$^(priority|capability|capabilities)$z'^(endpoint|id|type|class|size|network)$z%^(time|timer|timeout|interval|delay)$z^\d+\.\d+\.\d+\.\d+$z'^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$z ^[a-zA-Z]$z^.{1,2}$z'^[+\-*/:;.,<>?|\\[\]{}()~`!@#$%^&*_=]+$u🚫 排除无效设备名: 'u' (匹配模式: r�z[a-zA-Z]u' (不包含字母)u✅ 验证有效设备名: 'rT)r��lowerr�r�r�r�r )rrI�invalid_patterns� name_lower�patterns rr z/ImprovedTopologyDiscovery._is_valid_device_names����s�4�y�1�}�� ��6�Z�Z�\� �'�G��x�x���,�� � �<�T�F�BS�T[�S\�\]�^�_��(� �y�y��d�+� �L�L�8���>Q�R� S��� � �3�D�6��;�<�rc��K�g} tjd�|jj|j|jdd���d{���\}}|rX|j rL|j |j�}tjd|j�dt|��d��|Stjd |��� |S7�|#t$r#}tjd |���Yd}~|Sd}~wwxYw�w) u发现Cisco CDP邻居u🔍 执行Cisco CDP发现zshow cdp neighbors detailr�r�Nu✅ Cisco设备 u 通过CDP发现 r�u!❌ 获取Cisco CDP邻居失败: u!❌ 发现Cisco CDP邻居异常: ) r�r�r�r�r�r��parse_cisco_cdp_neighborsr�rIr�r�r�r��rr�r�r�r�r�r�s rr�z2ImprovedTopologyDiscovery.discover_cisco_neighborsNs������ � B� �K�K�4� 6�"&�"9�"9�"F�"F�� � �:�=�=�*E�r�#G�#��M�F�E��&�.�.� �:�:�6�=�=�I� �� � �.�v�{�{�m�;L�S�QZ�^�L\�\f�g�h��� ���!B�5�'�J�K� ����� B� �L�L�<�Q�C�@� A� A���� B�sN�C?�A C�C�AC�1C?�3C� C?�C� C<�C7�1C?�7C<�<C?c��g} tjd|�}|D�]:}d|vs� ddi}tjd|�}|r|jd�|d<tjd|�}|r|jd�|d <tjd |�}|r"|jd�j �|d <tjd |�} | r| jd�|d <tjd|�} | r| jd�|d<d|vs��|j |�t jd|jd d��d|d�����= |S#t$r#} t jd| ���Yd} ~ |Sd} ~ wwxYw)u解析Cisco CDP邻居信息z-{20,}z Device ID:rNr5zDevice ID:\s*(\S+)r�rkz"IP address:\s*(\d+\.\d+\.\d+\.\d+)rKzPlatform:\s*([^,\n]+)r zInterface:\s*(\S+)r�z"Port ID \(outgoing port\):\s*(\S+)r�u✅ 解析Cisco CDP邻居: r7r�u'❌ 解析Cisco CDP邻居信息失败: N) r�r�r r�r�r�r�r�r�r�r�) rr�r��entries�entryr�device_id_match�ip_match�platform_match�local_int_match�remote_int_matchr�s rrz3ImprovedTopologyDiscovery.parse_cisco_cdp_neighborscs���� �& H��h�h�y�&�1�G� ���5�(� *�E�2�H�')�i�i�0E�u�&M�O�&�0?�0E�0E�a�0H���-� "�y�y�)N�PU�V�H��19����1B���.�&(�Y�Y�/G��%O�N�%�/=�/C�/C�A�/F�/L�/L�/N���,�')�i�i�0E�u�&M�O�&�6E�6K�6K�A�6N��!2�3�(*�y�y�1V�X]�'^�$�'�7G�7M�7M�a�7P��!3�4�"�h�.�!�(�(��2�� � �'B�8�<�<�Pa�cl�Cm�Bn�nr�s{�}H�tI�sJ�&K�L�?!�H���� H� �L�L�B�1�#�F� G� G���� H�s$� E�C2E�AE� F �&F�F r�� source_devicec��K�tjd|���|jd�re|jj �D]H}|j |dk(s�tjd|j �d|j �d��|cS|jdd�}|rT|jj �D]7}|j |k(s�tjd|j ���|cS|�r0|j|��rtjd |���|j|�}|j|�}|j|�}|jd�}|s|j|�}tttj��|||||t j"d |j �d |jd d ��d���} |jj%| �} tjd| j �d| j �d| �d|���| Stj'd|���y�w)uB查找或自动创建邻居设备(改进的自动创建逻辑)u"🔍 查找或创建邻居设备: rKu&✅ 通过IP地址找到现有设备: r�r�rkr�u*✅ 通过设备名称找到现有设备: u%🆕 自动创建新的邻居设备: u#通过拓扑发现自动创建 (从u发现,协议:rNr7)r�rIrKrmrnr rMrJu$✅ 自动创建邻居设备成功: z) [ID: u ], 平台: uH⚠️ 无法创建邻居设备,设备名无效或缺少必要信息: N)r�r�r�r�� list_devicesrKrIr �_infer_device_vendor�_infer_device_type�_standardize_platform_info�_generate_placeholder_ipr.rW�uuid�uuid4r1r;� add_devicer�) rr�r#r�rkrnrmr rK� new_device�created_device_ids rr�z8ImprovedTopologyDiscovery.find_or_create_neighbor_device�s]����� � �8���H�I� � � �\� *��-�-�:�:�<���$�$� �l�(C�C��K�K�"H���� �UW�X^�Xi�Xi�Wj�jk� l�m�!�M�=� "�%�%�k�2�6� � ��-�-�:�:�<���;�;�)�+��K�K�"L�V�[�[�M� Z�[�!�M�=� ��3�3�I�>� �K�K�?� �{�K� L��.�.�}�=�F��1�1�-�@�K��6�6�}�E�H�'�*�*�<�8�J��!�:�:�=�I� �'��t�z�z�|�$��%�'��!�#�+�+�A�-�BT�BT�AU�Ue�fs�fw�fw�yC�EN�gO�fP�PQ�R� �J�!%� 3� 3� >� >�z� J� � �K�K�>�z���>O�r�R\�Rg�Rg�Qh�ho�qB�pC�CN�OW�NX�Y� Z�� ����a�bo�ap�q�r��s�AI�A5I�E3Ic�>���|jdd�j��|jdd�j��t�fd�dD��st�fd�dD��rtjSt�fd�d D��st�fd �d D��rtj St�fd �d D��st�fd�dD��rtj St�fd�dD��rtjStjS)u推断设备厂商r r�rkc3�&�K�|]}|�v��� y�wrr<��.0�keywordr s �r� <genexpr>zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����X�2W�w�w�(�"�2W���)�cisco�catalyst�nexus�asrc3�&�K�|]}|�v��� y�wrr<�r2r3rks �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����K�3J��w�)�#�3J�r5)r6�catr9c3�&�K�|]}|�v��� y�wrr<r1s �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����F�4E���H�$�4E�r5)�huawei�vrpc3�&�K�|]}|�v��� y�wrr<r;s �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����X�5W�'��I�%�5W�r5)r>�ce�s5700�s6720c3�&�K�|]}|�v��� y�wrr<r1s �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����G�4F���H�$�4F�r5)�h3c�comwarec3�&�K�|]}|�v��� y�wrr<r;s �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����O�5N�'��I�%�5N�r5)rE�s5120�s5130c3�&�K�|]}|�v��� y�wrr<r1s �rr4zAImprovedTopologyDiscovery._infer_device_vendor.<locals>.<genexpr>�s�����I�4H���H�$�4H�r5)�juniper�junos) r�r�anyr/r�r�r��JUNIPER�OTHER�rr�rkr s @@rr&z.ImprovedTopologyDiscovery._infer_device_vendor�s���� �$�$�Z��4�:�:�<��!�%�%�k�2�6�<�<�>� � �X�2W�X� X� �K�3J�K� K��%�%� %� �F�4E�F� F� �X�5W�X� X��&�&� &� �G�4F�G� G� �O�5N�O� O��#�#� #� �I�4H�I� I��'�'� '��%�%� %rc��|jdd�j�}|jdd�j�}d|vsd|vr!d|vsd|vryd|vsd|vry d |vsd |vry d |vry yd|vrd|vryd|vryd|vryd|vryyd|vsd|vr d|vryd|vryyd |vsd!|vry"|r-d#d$l}|jd%|�}|rd&|j d'���Sy())u-标准化平台信息为简洁的平台代码r r�rkr>r?rB� huawei_s5700rC� huawei_s6720�s3700� huawei_s3700rA� huawei_ce� huawei_vrpr6r7�cisco_catalystr8� cisco_nexusr9� cisco_asr�isr� cisco_isr� cisco_iosrErFrH� h3c_s5120rI� h3c_s5130� h3c_comwarerKrL� juniper_junosrNz(s\d+[a-z]*-?\d*[a-z]*)�unknown_r�r7)r�rr�r r�)rr�r rkr�� model_matchs rr(z4ImprovedTopologyDiscovery._standardize_platform_info�s>�� �$�$�Z��4�:�:�<��!�%�%�k�2�6�<�<�>� � �x� �5�H�#4��(�"�g��&:�%��H�$��9�(<�%��H�$��9�(<�%���"�"�#��� ��X�%�'��H�$�$��(�"�"��(�"�"�"��h� �)�x�"7��(�"�"��H�$�"�$��(� "�g��&9�"� ��'�b�i�i�(B�H�M� ��%�k�&7�&7��&:�%;�<�<�rc����|jdd�j��|jdd�j��t�fd�dD��st�fd�dD��rtjSt�fd�d D��st�fd �d D��rtj St�fd �d D��rtj St�fd�dD��rtjStjS)u推断设备类型r r�rkc3�&�K�|]}|�v��� y�wrr<r1s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>s�����d�2c�w�w�(�"�2c�r5)�switchr7rBrCrHc3�&�K�|]}|�v��� y�wrr<r;s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>s�����D�3C��w�)�#�3C�r5)�swrfc3�&�K�|]}|�v��� y�wrr<r1s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>s�����S�4R���H�$�4R�r5)�routerr9r[�nec3�&�K�|]}|�v��� y�wrr<r;s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>s�����F�5E�'��I�%�5E�r5)�rtrjc3�&�K�|]}|�v��� y�wrr<r1s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>s�����O�4N���H�$�4N�r5)�firewall�asa�usgc3�&�K�|]}|�v��� y�wrr<r1s �rr4z?ImprovedTopologyDiscovery._infer_device_type.<locals>.<genexpr>!s�����Q�4P���H�$�4P�r5)�aprB�wireless) r�rrMr0�SWITCH�ROUTER�FIREWALL� ACCESS_POINTrOrPs @@rr'z,ImprovedTopologyDiscovery._infer_device_types���� �$�$�Z��4�:�:�<��!�%�%�k�2�6�<�<�>� � �d�2c�d� d� �D�3C�D� D��$�$� $� �S�4R�S� S� �F�5E�F� F��$�$� $� �O�4N�O� O��&�&� &� �Q�4P�Q� Q��*�*� *��#�#� #rc��� tj|j�}tj|�d�d��}t t |j ��d�S#YyxYw)u&为邻居设备生成占位符IP地址z/24F)�strict�����z 192.168.1.254)� ipaddress� IPv4AddressrK� IPv4NetworkrWrs�hosts)rr#� source_ip�networks rr)z2ImprovedTopologyDiscovery._generate_placeholder_ip&s[�� #�!�-�-�m�.F�.F�G�I��+�+�y�k��,=�e�L�G��t�G�M�M�O�,�R�0�1� 1�� #�"�s �AA � A$c���K�g} |jtjk(rd}nB|jtjk(rd}n"|jtjk(rd}nd}|j j |j|j|d���d{���\}}|rc|jrW|j|j|j�}tjd|j�dt|��d��|Stjd |j�d |��� |S7��#t $r0}tj#d |j�d |���Yd}~|Sd}~wwxYw�w) u-获取设备接口信息(支持多厂商)zshow ip interface briefzdisplay ip interface briefr�r�Nr�u 发现 u 个接口u⚠️ 获取设备 u 接口信息失败: u❌ 获取设备 u 接口信息异常: )rnr/r�r�r�r�r�r�r��parse_interface_infor�r�r�rIr�r�r�r�)rr�r�ror�r�r�r�s rr�z/ImprovedTopologyDiscovery.get_device_interfaces3sM����� � T��}�}� � 2� 2�2�3�����,�"5�"5�5�6�����,�"2�"2�2�6��3��"&�"9�"9�"F�"F�� � �:�=�=�'�2�#G�#��M�F�E��&�.�.�!�6�6�v�}�}�f�m�m�T� �� � �k�&�+�+��h�s�:��>O�z�Z�[��� ���!5�f�k�k�]�BW�X]�W^�_�`� ����� T� �L�L�,�V�[�[�M�9N�q�c�R� S� S���� T�sN�E1�BD5�D3�A*D5� E1� %D5�1E1�3D5�5 E.�>%E)�#E1�)E.�.E1rnc ���g} tjd|j���tjd|���|j�j d�}|t j k(r�|ddD]z}|j�s�|jd�r�&|j �}t|�dk\s�Et|d|dd k7r|dnd|d |d � �}|j|��|�n5|t jt jfv�rd }|D�] }|j�}|s�d|vr d|vsd|vrd}�&d|vsd|vr�/|s�2|j|j �r|j �dnd�s�g|j �}t|�dk\s��t|dt|�dkDr |ddvr|dndt|�dkDr|dndt|�dkDr|dnd� �}|j|�tjd|j����� tj#dt|��d��|S#t$r"} tj!d| ���Yd} ~ �Jd} ~ wwxYw)u-解析接口信息输出(多厂商支持)u(🔍 解析接口信息输出,厂商: u📄 接口信息输出内容: r�r�N�-�r� unassigned��)rIrKrMrNF� Interface�IP�StatusTz----z====r��)z--r��down�upr�r7u✅ 解析接口: u❌ 解析接口信息失败: u!📊 解析接口完成,发现 u 个有效接口)r�r�rfr�r�r/r�� startswithr�rHr�r�r��_is_valid_huawei_interface_namerIr�r�r�) rr�rnror�r�parts� interface�in_interface_tabler�s rr�z.ImprovedTopologyDiscovery.parse_interface_infoQse��� �4 ?� �L�L�C�F�L�L�>�R� S� �L�L�;�F�8�D� E��L�L�N�(�(��.�E���+�+�+�!�!�"�I�D��z�z�|�D�O�O�C�,@� $� � � ���u�:��?�(5�%*�1�X�7<�Q�x�<�7O�5��8�UY�',�Q�x�).�q�� )�I� '�-�-�i�8�&��L�/�/��1A�1A�B�B�%*�"�!�D��:�:�<�D�� �#�d�*��� ��D�@P�-1�*� ���~��4�� �*��?�?�SW�S]�S]�S_�� � � �Q��eg�h�$(�J�J�L�E�"�5�z�Q��,9�).�q��;>�u�:��>�e�TU�h�_A�OA�u�Q�x�GK�7:�5�z�A�~�5��8�9�9<�U��a��U�1�X�Y� -"� � !+� 1� 1�)� <� &� � �/A�)�.�.�AQ�-R� S�7"�@ � � �7��J��7H�HX�Y�Z���� � ?� �L�L�9�!��=� >� >�� ?�s>�BI � I �I �:BI � 4I �I �!BI � I8�I3�3I8c��|sygd�}|D]2}tj||�s�tjd|���ytjd|���y)u*验证是否为有效的华为接口名称F) z^GigabitEthernet\d+/\d+(/\d+)?$z#^Ten-GigabitEthernet\d+/\d+(/\d+)?$z^Ethernet\d+/\d+(/\d+)?$z^GE\d+/\d+(/\d+)?$z^XGE\d+/\d+(/\d+)?$z^FE\d+/\d+(/\d+)?$z^Eth-Trunk\d+$z ^Vlanif\d+$z ^LoopBack\d+$z^NULL0$z^MEth\d+/\d+(/\d+)?$u✅ 有效接口名: Tu🚫 无效接口名: )r�r�r�r�)rrI�valid_patternsrs rr�z9ImprovedTopologyDiscovery._is_valid_huawei_interface_name�sY����  ��&�G��x�x���&�� � �4�T�F�;�<��&� � � �-�d�V�4�5�rc��DK�g} |jj|j|jdd���d{���\}}|r'|jr|j |j �}|S7�2#t $r#}tjd|���Yd}~|Sd}~wwxYw�w)u发现Cisco LLDP邻居zshow lldp neighbors detailr�r�Nu"❌ 发现Cisco LLDP邻居异常: ) r�r�r�r��parse_cisco_lldp_neighborsr�r�r�r�rs rr�z7ImprovedTopologyDiscovery.discover_cisco_lldp_neighbors�s������ � C�"&�"9�"9�"F�"F�� � �:�=�=�*F�PR�#G�#��M�F�E��&�.�.� �;�;�F�M�M�J� ����� � C� �L�L�=�a�S�A� B� B���� C��>�B �6A1�A/�0A1�-B �/A1�1 B�:B�B �B�B c��gS)u解析Cisco LLDP邻居r<�rr�s rr�z4ImprovedTopologyDiscovery.parse_cisco_lldp_neighbors�� ��� rc��BK�|j||��d{���S7��w)u发现H3C设备邻居N)r�)rr�r�s rr�z0ImprovedTopologyDiscovery.discover_h3c_neighbors�s!�����3�3�F�J�G�G�G�G�s ���c��DK�g} |jj|j|jdd���d{���\}}|r'|jr|j |j �}|S7�2#t $r#}tjd|���Yd}~|Sd}~wwxYw�w)u通用LLDP邻居发现zshow lldp neighborsr�r�Nu"❌ 通用LLDP邻居发现异常: ) r�r�r�r��parse_generic_lldp_neighborsr�r�r�r�rs rr�z9ImprovedTopologyDiscovery.discover_generic_lldp_neighbors�s������ � C�"&�"9�"9�"F�"F�� � �:�=�=�*?��#G�#��M�F�E��&�.�.� �=�=�f�m�m�L� ����� � C� �L�L�=�a�S�A� B� B���� C�r�c��gS)u解析通用LLDP邻居r<r�s rr�z6ImprovedTopologyDiscovery.parse_generic_lldp_neighbors�r�rc��|jS)u获取当前拓扑)r�rUs r� get_topologyz&ImprovedTopologyDiscovery.get_topology�s ���}�}�rc�l�t�|_|j�tj d�y)u清空拓扑数据u🗑️ 拓扑数据已清空N)rvr�r�r�r�rUs r�clear_topologyz(ImprovedTopologyDiscovery.clear_topology�s%��'�)�� � ����� � �3�4rN),r%r&r'r8r-r2rr�r�rrWrvr�r.rrrrHr�r�r�rr��boolr r�rr�r/r&r(r0r'r)r�r�r�r�r�r�r�r�r�r�r<rrr�r��s���%� �}� �J[� �;�5;�nN�t�C�y�N�_�N�`9%�m�9%��d�SW�X[�]`�X`�Sa�Nb�dh�iv�dw�Nw�Hx�9%�v�m��TX�Y]�^a�cf�^f�Yg�Th��@>�#�>�$�t�C��H�~�:N�>�@.�C�.�#�.�RZ�[_�`c�eh�`h�[i�Rj�.�`-�#�-�$�-�^�]��SW�X\�]`�be�]e�Xf�Sg��*,��,��T�#�s�(�^�8L�,�\6�$�s�C�x�.�6�an�6�s{�}J�tK�6�p&�$�s�C�x�.�&�\�&�&6��S�#�X��6�3�6�p$��S�#�X��$�:�$�$ #�m� #�� #��-��PT�Ub�Pc��<;�3�;� �;��m�I\�;�z�C��D��: �-� �X\�]a�be�gj�bj�]k�Xl� �����d�3��8�n�9M�� H�=�H�QU�VZ�[^�`c�[c�Vd�Qe�H� �M� �Z^�_c�dg�il�dl�_m�Zn� ��3��4��S�#�X��;O�� �o��5rr�r�r�rRc��t||�S)u'创建改进的拓扑发现引擎实例)r�)r�r�s r�"create_improved_topology_discoveryr��s�� $�^�5G� H�Hr)3�typingrrrrrr� dataclassesr r �enumr �logging�sysr�r�r��asyncior r r|r*� Formatterr� basicConfig�INFO� StreamHandler�stdout�rootr+�handler� isinstance� setFormatter� getLoggerr��network_devicesr-r.r/r0r1�device_connectorr2r4r>rHrZrjrvr�r�r<rr�<module>r�s{��8�8�(��� � � � ��(�� �L�G�%�%�L����� �,�,� A�����S�Z�Z�0����|�|�$�$�G��'�7�0�0�1����]�+a�b�c�%� �� � �8� 9��`�`�.��t�� �T�� � � � � �2 � � � � �. � � � � �4 �, �, � �, �\h 5�h 5�VI�}�I�Zk�I�qJ�Ir

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