Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
device_connector.cpython-313.pyc28.2 kB
� &�#hE^� ��SSKJrJrJrJrJrJr SSKrSSKrSSK r SSK r SSK r SSK J r Jr SSKJr \ R "SSS9 \R""\R$S\R&"\R(S 9\R*"S S S S 9/S9 \R,"S5rSrSrSSKJr SSKJrJrJr SSK J!r! Sr\RES5 \RES\%"\SS535 SSK&r\ROS5 \("\RR5Hr*S\*;dM \ROS\*35 M! SrSSK.J/r/J0r0J1r1J2r2 "SS 5r3"S!S"\ 5r4"S#S$\45r5"S%S&5r6"S'S(5r7\7"5r8g!\#a Sr\RIS5 N�f=f!\#a'r+\RYS\-"\+5S35 SrSr+C+N�Sr+C+ff=f))�)�Dict�List�Optional�Any�Union�TupleN)�ABC�abstractmethod)�datetime�logsT)�exist_okz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�streamzlogs/device_connector.logzutf-8�w)�filename�encoding�mode)�level�format�handlers�device_connectorF)�Scrapli)�AsyncIOSXEDriver�AsyncNXOSDriver�AsyncJunosDriver)� huawei_vrpu成功加载华为设备驱动u3未找到华为设备驱动,将使用通用驱动u成功导入scrapli, 版本: � __version__u未知zAvailable scrapli exceptions:�Errorz - u导入scrapli失败: u8,请确保已经安装: pip install scrapli>=2025.1.30)� NetworkDevice�DeviceCredential�ConnectionProtocol� DeviceStatusc �f�\rSrSrSrS S\S\S\S\\4SjjrS \4S jr S \ \\ 44S jr S r g)� CommandResult�Bu命令执行结果类N�command�output�success� error_messagec�h�XlX lX0lX@l[R "5Ulg)N)r%r&r'r(r �now�execution_time)�selfr%r&r'r(s �"F:\NetBrainMCP\device_connector.py�__init__�CommandResult.__init__Es'�� � �� �� �*��&�l�l�n����returnc�~�UR(aSOSnSURSUS[UR5S3$)Nu成功u失败�命令 'u' 执行�: u字节)r'r%�lenr&)r,�statuss r-�__str__�CommandResult.__str__Ps8��!�\�\��x���$�,�,��x��x�r�#�d�k�k�:J�9K�6�R�Rr0c��URURURURURR 5S.$)u转换为字典表示)r%r&r'r(r+)r%r&r'r(r+� isoformat�r,s r-�to_dict�CommandResult.to_dictTs>���|�|��k�k��|�|�!�/�/�"�1�1�;�;�=�  � r0)r%r(r+r&r'�TN)�__name__� __module__� __qualname__�__firstlineno__�__doc__�str�boolrr.r7rrr<�__static_attributes__�r0r-r#r#Bs\��� "&�04� -�� -�� -�� -�!)�� � -�S��S� ��c�3�h�� r0r#c ��\rSrSrSrS\S\4Sjr\S\ 4Sj5r \S\ 4Sj5r \SS \ S \ S\4S jj5r\SS \\ S \ S\\4S jj5rSrg)�DeviceConnector�^u设备连接器抽象基类�device� credentialc�F�XlX lSUlSUlSUlg)NF)rKrL� connection� connected� last_activity)r,rKrLs r-r.�DeviceConnector.__init__as"��� �$��������!��r0r1c�� # �g7f)u2 连接到设备 Returns: 是否连接成功 NrGr;s r-�connect�DeviceConnector.connecth� ��� ���c�� # �g7f)u; 断开与设备的连接 Returns: 是否断开成功 NrGr;s r-� disconnect�DeviceConnector.disconnectrrUrVr%�timeoutc�� # �g7f)u� 发送命令到设备 Args: command: 要执行的命令 timeout: 命令超时时间(秒) Returns: 命令执行结果 NrG)r,r%rZs r-� send_command�DeviceConnector.send_command|� ��� �rV�commandsc�� # �g7f)u� 发送多个命令到设备 Args: commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: 命令执行结果列表 NrG)r,r_rZs r-� send_commands�DeviceConnector.send_commands�r^rV)rOrNrLrKrPN��)r?r@rArBrCrrr.r rErSrXrD�intr#r\rrarFrGr0r-rIrI^s���%�"�}�"�:J�"�� �t� �� �� �$� �� ��  �#�  ��  �]�  ��  ��  �D��I�  ��  �T�R_�M`�  ��  r0rIc�t�\rSrSrSrS\4SjrS\4SjrS S\S\ S\ 4Sjjr S S \ \S\ S\ \ 4S jjr S rg )�ScrapliConnector�uScrapli连接器实现r1c ��2# �[(d.[RSURRS35 g[R SURRSURR S35 [URS5(aJURR(a/URRn[RSU35 O�URR(a.URRRR5OS nURR(a.URRRR5OS nS U;a$S U;aS nO8S U;aS nO/SU;dSU;aSnO S nOSU;aSnOSU;aSnO SU;aSnOS n[RSU35 [R SUS35 URR URRSSSUURR =(d SSS.nURR"(anURR$[&R(:XaF[R SURR"35 URR"US 'O`URR*(a/[R S!5 URR*US"'O[RS#5 gURR$[&R(:XGa�US :Xa[,nGOUS:Xa[.nGOUS:Xa[0nO�[R S$US%35 [3S60UD6n[4R6"UR85IS&hv�N X`lS'Ul[>R@"5Ul![R S(URRSURR S35 [4R6"URD5IS&hv�N n[R S)U35 g'[RS+URL35 U"S60UD6n[RS,URR S-35 UR95IS&hv�N X`lO�URR$[&RN:Xa`S.US/'URR =(d S0US1'[3S60UD6n[4R6"UR85IS&hv�N X`lS'Ul[>R@"5Ul![R S(URRSURR S35 [UR:S25(a�[4RP"UR:RD5(a#UR:RE5IS&hv�N nO2[4R6"UR:RD5IS&hv�N n[R S)U35 g'GN�GN=![Fa+n[RIS*[KU535 S&nAg'S&nAff=fGN�GNjN�Nc![Fa+n[RIS*[KU535 S&nAg'S&nAff=f![Favn[RS3URRSURR S4[SU5RLS5[KU535 SUlS&nAgS&nAff=f7f)7u? 通过Scrapli连接到设备 Returns: 是否连接成功 u无法连接到设备 u,Scrapli库导入失败Fu$正在通过Scrapli连接到设备: � (�)�platformu#使用设备指定的平台类型: ��cisco�switch� cisco_iosxe�router�nexus�nxos� cisco_nxos�huaweir�juniper� juniper_junos�arista� arista_eosu 根据vendor推断平台类型: u使用平台类型: u 连接设备�rd��paramiko)�host� auth_username�auth_strict_key�timeout_socket�timeout_transportrl�port� transportu使用SSH密钥文件认证: �auth_private_keyu使用密码认证� auth_passwordu6没有提供认证方式(密码或SSH密钥文件)u没有u+的专用异步驱动,使用同步ScrapliNTu已成功连接到设备: u设备提示符: u获取设备提示符失败: u使用异步驱动: u正在打开连接到 z...�telnetr��r�� get_promptu连接设备失败: �) - r4rG)*�SCRAPLI_IMPORT_SUCCESS�logger�errorrK�name�info� ip_address�hasattrrl�debug�vendor�value�lower� device_typerL�usernamer�� ssh_key_file�protocolr �SSH�passwordrrrr�asyncio� to_thread�openrNrOr r*rPr�� Exception�warningrDr?�TELNET�iscoroutinefunction�type) r,rlr�r�� device_params�driver�conn�prompt�es r-rS�ScrapliConnector.connect�s����&�%� �L�L�1�$�+�+�2B�2B�1C�C\�]� ^��� � �:�4�;�;�;K�;K�:L�B�t�{�{�Oe�Oe�Nf�fg�h�i� ��t�{�{�J�/�/�D�K�K�4H�4H��;�;�/�/��� � �B�8�*�M�N�>B�[�[�=O�=O����+�+�1�1�7�7�9�UW��GK�{�{�G^�G^�d�k�k�5�5�;�;�A�A�C�df� ��f�$��;�.�#0��!�[�0�#0�� �K�/�6�V�3C�#/��#0����'�+�H��&�(�.�H���'�+�H�,�H�� � �?��z�J�K� �K�K�.�x�j� �F� G�� � �.�.�!%���!9�!9�#(�"$�%'�$����,�,�2��'� �M����+�+����0H�0H�L^�Lb�Lb�0b�� � �;�D�O�O�<X�<X�;Y�Z�[�48�O�O�4P�4P� �0�1����)�)�� � �0�1�15���1I�1I� �o�.�� � �U�V�����'�'�+=�+A�+A�A��}�,�-�F���-�,�F���0�-�F��K�K�&�� �2]� ^�_�#�3�]�3�D�"�+�+�D�I�I�6�6�6�&*�O�%)�D�N�)1����D�&��K�K�"<�T�[�[�=M�=M�<N�b�QU�Q\�Q\�Qg�Qg�Ph�hi� j�k�Q�'.�'8�'8����'I�!I��� � �&7��x�$@�A� �� � �3�F�O�O�3D�E�F��.� �.��� � �5�d�k�k�6L�6L�5M�S�Q�R��i�i�k�!�!�"&�����)�)�-?�-F�-F�F�-5� �k�*�(,���(<�(<�(B�� �f�%��/��/���'�'�� � �2�2�2�"&��!�D�N�!)����D� � �K�K�4�T�[�[�5E�5E�4F�b����I_�I_�H`�`a�b� c� I��4�?�?�L�9�9��2�2�4�?�?�3M�3M�N�N�'+���'A�'A�'C�!C��'.�'8�'8����9S�9S�'T�!T���K�K�"3�F�8� <�=��e7�"J��$�Q����)F�s�1�v�h�'O�P�P���Q��"�3�"D�!T��� I����!>�s�1�v�h�G�H�H��� I��� � �L�L�/�� � �0@�0@�/A��D�K�K�DZ�DZ�C[�[_�`d�ef�`g�`p�`p�_q�qs�tw�xy�tz�s{�|� }�"�D�N��� �s �A>^�J+\�,^�-B\�Z�A/\�7#Z�Z�Z�7^�8A*\�"[�#B\�+[�,A/\�A'[�[�2[�6[�7[�^�\�Z� [�$![ �\� ^� [�\�\�[�[� \�&!\ �\� ^� \�\� ^�A,^� ^�^�^c ��# �UR(dE[RSURRSURR S35 gUR (a"UR R5IShv�N SUl[RSURRSURR S35 gNP![aYn[RSURRSURR S [U535 SnAgSnAff=f7f) u6 断开Scrapli连接 Returns: 是否断开成功 �设备未连接: rjrkTNFu已断开与设备的连接: u断开连接失败: r�) rOr�r�rKr�r�rN�closer�r�r�rD)r,r�s r-rX�ScrapliConnector.disconnect)s�����~�~� �N�N�.�t�{�{�/?�/?�.@��4�;�;�CY�CY�BZ�Z[�\� ]�� �����o�o�+�+�-�-�-�"�D�N� �K�K�7�� � �8H�8H�7I��D�K�K�Lb�Lb�Kc�cd�e� f�� .�� � � �L�L�/�� � �0@�0@�/A��D�K�K�DZ�DZ�C[�[_�`c�de�`f�_g�h� i��� �sD�AE�.C�C� AC�E�C� D>�%AD9�4E�9D>�>Er%rZc ��&# �UR(dP[RSURRSURR S35 [ USSSS9$[RSURRS U35 [R"URR5(a8[RS 5 URRUUS 9IS hv�N nOG[RS 5 [R"URRUUS 9IS hv�N n[R"5UlSnSn[#US5(a*UR$n[#US5(a UR&nO [)U5nU(a>[R+SUSURRSU35 [ UUSSS9$[RSUSURRS35 [ UUSS9$GN1N�![R,a? [R+SUSURRS35 [ USSSS9s$[.a�n[R+SUSURRS[1U5R2S[)U535 [ USS[1U5R2S[)U53S9sS nA$S nAff=f7f)u� 通过Scrapli发送命令 Args: command: 要执行的命令 timeout: 命令超时时间(秒) Returns: 命令执行结果 r�rjrkrmFu设备未连接)r%r&r'r(� 向设备 � 发送命令: u使用异步方式发送命令)r%� timeout_opsNu*使用同步方式在线程中发送命令�result�failedr3u ' 在设备 u 上执行失败: u命令执行失败u 上执行成功T)r%r&r'u 上执行超时u命令执行超时r4)rOr�r�rKr�r�r#r�r�r�rNr\r�r�r r*rPr�r�r�rDr�� TimeoutErrorr�r�r?)r,r%rZ�responser�� is_failedr�s r-r\�ScrapliConnector.send_command?s�����~�~� �N�N�.�t�{�{�/?�/?�.@��4�;�;�CY�CY�BZ�Z[�\� ]� ����/� � � � � �j����!1�!1� 2�/�'��K�L�? ��*�*�4�?�?�+G�+G�H�H�� � �=�>�!%���!=�!=�#� '�">�"��� � � �I�J�!(�!2�!2��O�O�0�0�#� '�"��� "*����D� ��F��I��x��*�*�!�����8�X�.�.� (���I���X����� � �x��y� �T�[�[�=M�=M�<N�N`�ag�`h�i�j�$�#�!�!�"6� �� �K�K�(�7�)�<�� � �8H�8H�7I�IY�Z� [� ����� �M���H�#�#� � �L�L�8�G�9�L����9I�9I�8J�JZ�[� \� ����2� � � � � �L�L�8�G�9�L����9I�9I�8J�J\�]a�bc�]d�]m�]m�\n�np�qt�uv�qw�px�y� z� ����!%�a��!1�!1� 2�"�S��V�H�=� � �� �sw�BL�A!H+�5H&�6AH+�=H)�>B,H+�*L�+:H+�%L�&H+�)H+�+AL�;L�= L�A=L �L�L� L�Lr_c ��# �[RSURRS[ U5S35 /n[ U5H�upE[R SUS-S[ U5SU35 URXR5IShv�N nURU5 UR(d[RS US 35 U$U[ U5S- :dM�[R"S 5IShv�N M� U$NzN 7f) u� 通过Scrapli发送多个命令 Args: commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: 命令执行结果列表 r�u 发送多个命令,共 u 条u 执行第 ��/u 条命令: Nr3u)' 执行失败,中断后续命令执行g�?) r�r�rKr�r5� enumerater�r\�appendr'r�r��sleep)r,r_rZ�results�ir%r�s r-ra�ScrapliConnector.send_commands�s���� � � �j����!1�!1� 2�2L�S�QY�]�O�[_�`�a���#�H�-�J�A� �L�L�:�a��c�U�!�C��M�?�,�w�i�P� Q��,�,�W�>�>�F� �N�N�6� "��>�>�����'��2[�\�]�� ���3�x�=�1�$�$��m�m�C�(�(�(�.���?�)�s+�B D � D� AD �#D �<D �= D � D )rOrNrPNrc)r?r@rArBrCrErSrXrDrer#r\rrarFrGr0r-rgrg�sh�� �L�t�L�\�$��,U�#�U��U�]�U�n�D��I����T�R_�M`��r0rgc�8�\rSrSrSr\S\S\S\4Sj5r Sr g) �ConnectorFactoryi�u?连接器工厂,根据设备和凭据创建适当的连接器rKrLr1c��UR[R[R4;a [ X5$[ SURR 35e)u� 创建设备连接器 Args: device: 网络设备 credential: 设备凭据 Returns: 设备连接器 Raises: ValueError: 如果不支持的协议 u不支持的协议: )r�r r�r�rg� ValueErrorr�)rKrLs r-�create_connector�!ConnectorFactory.create_connector�sP��" � � �#5�#9�#9�;M�;T�;T�"U� U�#�F�7� 7��3�J�4G�4G�4M�4M�3N�O�P� Pr0rGN) r?r@rArBrC� staticmethodrrrIr�rFrGr0r-r�r��s3��I��Q��Q�<L�Q�Q`�Q��Qr0r�c��\rSrSrSrSrS\S\S\\ \ \ 44Sjr S\ S \ S\\ \ \ 44S jr SS\ S \ S \ S \S\\ \\ \ 44 S jjrSS\ S \ S\\ S \S\\ \\\ \ 44 SjjrS\\\ \44SjrSrg)�ConnectionManageri�u-连接管理器,管理设备连接和会话c�<�0Ul[RS5 g)Nu连接管理器初始化完成)�active_connectionsr�r�r;s r-r.�ConnectionManager.__init__�s��>@���� � �4�5r0rKrLr1c ��# �URSUR3nX0R;a1[RSURSUR S35 g[RSURSUR SUR SURRS UR3 5 [RX5nUR5IS hv�N nU(aX@RU'gg N![a8n[RS [U535 S [U54sS nA$S nAff=f7f)u} 连接到设备 Args: device: 网络设备 credential: 设备凭据 Returns: (是否成功, 错误消息) �_u设备已连接: rjrkr>u尝试连接设备: u ), 凭据: �@�:N)Fu 连接失败u连接设备时发生错误: F)�idr�r�r�r�r�r�r�r�r�r�r�rSr�r�rD)r,rKrL�connection_key� connectorr'r�s r-�connect_device� ConnectionManager.connect_device�sX���#�I�I�;�a� � � ��7�� �4�4� 4� �K�K�+�F�K�K�=��6�;L�;L�:M�Q�O� P�� !� �K�K�.�v�{�{�m�2�f�>O�>O�=P�P[�\f�\o�\o�[p�pq�r|�sF�sF�sL�sL�rM�MN�OY�O^�O^�N_�`� a�)�9�9�&�M�I�&�-�-�/�/�G��:C�'�'��7�!�,�0��� !� �L�L�8��Q���A� B��#�a�&�=� �� !�sI�AE �BD�'D�(D�E �D� E�-E�<E�=E �E�E � device_id� credential_idc��~# �USU3nURRU5nU(d[RSU35 gUR 5IShv�N nU(a URU US4$N![ a8n[R S[U535 S[U54sSnA$SnAff=f7f)u� 断开与设备的连接 Args: device_id: 设备ID credential_id: 凭据ID Returns: (是否成功, 错误消息) r�r�r>Nu断开连接时发生错误: F)r��getr�r�rXr�r�rD)r,r�r�r�r�r'r�s r-�disconnect_device�#ConnectionManager.disconnect_device�s����&�;�a� ��7���+�+�/�/��?� �� �N�N�.�y�k�:� ;�� !�%�0�0�2�2�G���+�+�N�;��D�=� � 3��� !� �L�L�8��Q���A� B��#�a�&�=� �� !�sH�AB=�A8�A6�A8�5B=�6A8�8 B:�-B5�/B:�0B=�5B:�:B=r%rZc��F# �USU3nURRU5nU(d[RSUS35 g[R SUSU35 UR X45IShv�N nUR (a;URR5(d[R S5 S UlUS4$NT![aGnS [U5RS [U53n [RU 5 SU 4sSnA$SnAff=f7f) u� 向设备发送命令 Args: device_id: 设备ID credential_id: 凭据ID command: 要执行的命令 timeout: 命令超时时间(秒) Returns: (命令结果, 错误消息) r�r��#,请先调用connect_device连接�Nu$设备未连接,请先连接设备�通过连接管理器向设备 r�Nu*命令执行成功,但返回内容为空u,[命令执行成功,但没有返回内容]�发送命令时发生错误: r4)r�r�r�r�r�r\r'r&�stripr�r�r?rDr�) r,r�r�r%rZr�r�r�r�� error_msgs r-r\�ConnectionManager.send_commands���"&�;�a� ��7���+�+�/�/��?� �� �N�N�.�y�k�9\�]� ^�?� #� �K�K�9�)��O�T[�S\�]� ^�$�1�1�'�C�C�F��~�~�f�m�m�&9�&9�&;�&;�� � �H�I� N�� ��4�<� �D��� #�7��Q��8H�8H�7I��C�PQ�F�8�T�I� �L�L�� #���?� "�� #�sI�AD!�/C �6C �7AC � D!� C � D�<D�D�D!�D�D!r_c���# �USU3nURRU5nU(d[RSUS35 g[R SUS[ U5S35 UR X45IShv�N nUS4$N![aGnS [U5RS [U53n [RU 5 SU 4sSnA$SnAff=f7f) u� 向设备发送多个命令 Args: device_id: 设备ID credential_id: 凭据ID commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: (命令结果列表, 错误消息) r�r�r�r�r�u 发送 u 条命令Nr�r4) r�r�r�r�r�r5rar�r�r?rDr�) r,r�r�r_rZr�r�r�r�r�s r-ra�ConnectionManager.send_commandsCs����"&�;�a� ��7���+�+�/�/��?� �� �N�N�.�y�k�9\�]� ^�?� #� �K�K�9�)��H�S�QY�]�O�[e�f� g�%�3�3�H�F�F�G��D�=� �G��� #�7��Q��8H�8H�7I��C�PQ�F�8�T�I� �L�L�� #���?� "�� #�sH�AC�9B �B �B �C� B � C�<C�C�C�C�Cc ��/nURR5H�up#URS5upEURUURR URR UURRRUR(aURR5OSS.5 M� U$)uA 获取活动连接列表 Returns: 活动连接信息列表 r�N)r�� device_name� device_ipr�r�rP) r��items�splitr�rKr�r�rLr�r�rPr:)r,r�r�r�r�r�s r-�get_active_connections�(ConnectionManager.get_active_connectionses�����)-�)@�)@�)F�)F�)H� %�N�'5�';�';�C�'@� $�I� �M�M�&�(�/�/�4�4�&�-�-�8�8�!.�%�0�0�9�9�?�?�HQ�H_�H_��!8�!8�!B�!B�!D�ei� � �*I�� r0)r�Nrc)r?r@rArBrCr.rrrrErrDr�r�rer#r\rrarrr�rFrGr0r-r�r��s"��7�6�%!�$1�%!�(8�%!�=B�4��RU��CV�=W�%!�N!��!�S�!�U�SW�Ya�be�Yf�Sf�Mg�!�F*,� &#�%(�&#�),�&#�$'�&#�$'� &#�16�h�}�6M�x�X[�}�6\�0]� &#�X+-� #�&)� #�*-� #�&*�#�Y� #�%(� #�27�x��]�@S�7T�V^�_b�Vc�7c�1d� #�D��T�#�s�(�^�(<�r0r�)9�typingrrrrrr�logging�sysr��re�os�abcr r r �makedirs� basicConfig�DEBUG� StreamHandler�stdout� FileHandler� getLoggerr��HAS_HUAWEI_SUPPORTr��scraplir�scrapli.driver.corerrr�scrapli_communityrr�� ImportErrorr��getattr�scrapli.exceptionsr��dir� exceptions� attr_namer�r�rD�network_devicesrrr r!r#rIrgr�r��connection_managerrGr0r-�<module>rs���:�:�� �� � �#��� � �F�T�"���� �-�-� A����S�Z�Z�0����%@�7�Y\�]��� � � �-� .������#��W�W�N�0�!��� � �4�5�  �K�K�/����PX�0Y�/Z�[�\�� �L�L�0�1���+�+�,� � �i� � �L�L�4� �{�+� ,�-�"�� �� � �88 �c�8 �tZ��Z�xQ�Q�4k�k�\'�(���i �N�"�����L�M�N���#� �L�L�(��Q���0h�i�j�"���#�sC�!F�2E;� A F�F�;F�F�F�F�G� G�G

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