Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
device_connector.cpython-312.pyc37.9 kB
� w�-h���,�ddlmZmZmZmZmZmZddlZddlZddl Z ddl Z ddl Z ddl m Z mZddlmZe j dd��Gd�d ej"�Zej&ej(d ej*ej,� �g� �ej.j0D]-Zeeej*�s�ej7ed ���/ej8d �ZdZdZ ddl m!Z!ddl"m#Z#m$Z$m%Z% ddl&m'Z'dZejQd�ejQde+e!dd����ddl,Z ej[d�e.e j^�D]Z0de0vs�ej[de0����dZddl4m5Z5m6Z6m7Z7m8Z8Gd�d�Z9Gd�d e �Z:Gd!�d"e:�Z;Gd#�d$�Z<Gd%�d&�Z=e=�Z>y#e)$rdZejUd�Y��wxYw#e)$r'Z1ejede3e1��d��dZYdZ1[1��dZ1[1wwxYw)'�)�Dict�List�Optional�Any�Union�TupleN)�ABC�abstractmethod)�datetime�logsT)�exist_okc�*��eZdZd�fd� Z�fd�Z�xZS)� JsonFormatterc�(��t�|�|||�y�N)�super�__init__)�self�fmt�datefmt�style� __class__s ��"F:\NetBrainMCP\device_connector.pyrzJsonFormatter.__init__s��� ����g�u�-�c�f��t�|�|�}|jdd��jd�S)Nzutf-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�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 �V�eZdZdZ d dedededeefd�Zdefd �Zde ee ffd �Z y) � CommandResultu命令执行结果类N�command�output�success� error_messagec�n�||_||_||_||_t j �|_yr)r9r:r;r<r �now�execution_time)rr9r:r;r<s rrzCommandResult.__init__Ss/�� �� ��� ��� �*���&�l�l�n��r�returnc�t�|jrdnd}d|j�d|�dt|j��d�S)Nu成功u失败�命令 'u' 执行�: u字节)r;r9�lenr:)r�statuss r�__str__zCommandResult.__str__^s8��!�\�\��x���$�,�,��x��x�r�#�d�k�k�:J�9K�6�R�Rrc��|j|j|j|j|jj �d�S)u转换为字典表示)r9r:r;r<r?)r9r:r;r<r?� isoformat�rs r�to_dictzCommandResult.to_dictbs>���|�|��k�k��|�|�!�/�/�"�1�1�;�;�=�  � r�TN) r$r%r&�__doc__�str�boolrrrFrrrJ�rrr8r8Ps\��� "&�04� -�� -�� -�� -�!)�� � -�S��S� ��c�3�h�� rr8c ��eZdZdZdedefd�Zedefd��Z edefd��Z edde d e de fd ��Zedd ee d e dee fd ��Zy )�DeviceConnectoru设备连接器抽象基类�device� credentialc�J�||_||_d|_d|_d|_y)NF)rRrS� connection� connected� last_activity)rrRrSs rrzDeviceConnector.__init__os&���� �$���������!��rr@c�� K�y�w)uZ 连接到设备 Returns: 是否连接成功 NrOrIs r�connectzDeviceConnector.connectv� ���� ���c�� K�y�w)uc 断开与设备的连接 Returns: 是否断开成功 NrOrIs r� disconnectzDeviceConnector.disconnect�rZr[r9�timeoutc�� K�y�w)u� 发送命令到设备 Args: command: 要执行的命令 timeout: 命令超时时间(秒) Returns: 命令执行结果 NrO)rr9r^s r� send_commandzDeviceConnector.send_command�� ���� �r[�commandsc�� K�y�w)u� 发送多个命令到设备 Args: commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: 命令执行结果列表 NrO)rrbr^s r� send_commandszDeviceConnector.send_commands�rar[N��)r$r%r&rLr3r4rr rNrYr]rM�intr8r`rrdrOrrrQrQls���%�"�}�"�:J�"�� �t� �� �� �$� �� ��  �#�  ��  �]�  ��  ��  �D��I�  ��  �T�R_�M`�  ��  rrQc�p�eZdZdZdefd�Zdefd�Zd dedede fd�Z d de edede e fd �Z d ede fd �Z y )�ScrapliConnectoruScrapli连接器实现r@c ��K�ts.tjd|jj�d��ytj d|jj�d|jj �d�� t|jd�rE|jjr/|jj}tjd|���n�|jjr.|jjjj�nd }|jjr.|jjjj�nd }d |vrd |vrd }n,d |vrd }n%d|vsd|vrd}nd }nd|vrd}nd|vrd}n d|vrd}nd }tjd|���tj d|�d��|jj |jjddd||jj xsddd�}|jj"rm|jj$t&j(k(rFtj d|jj"���|jj"|d <n[|jj*r/tj d!�|jj*|d"<ntjd#�y|jj$t&j(k(�r�|d k(rt,}�n|dk(rt.}�n|dk(rt0}n�tj d$|�d%��t3d6i|��}t5j6|j8��d&{���||_d'|_t?j@�|_!tj d(|jj�d|jj �d�� t5j6|jD��d&{���}tj d)|���y'tjd+|jL���|d6i|��}tjd,|jj �d-��|j9��d&{���||_n�|jj$t&jNk(r[d.|d/<|jj xsd0|d1<t3d6i|��}t5j6|j8��d&{���||_d'|_t?j@�|_!tj d(|jj�d|jj �d�� t|j:d2�r�t5jP|j:jD�r#|j:jE��d&{���}n1t5j6|j:jD��d&{���}tj d)|���y'7���7��+#tF$r+}tjId*tK|����Yd&}~y'd&}~wwxYw7���7��]7��7�b#tF$r+}tjId*tK|����Yd&}~y'd&}~wwxYw#tF$rv}tjd3|jj�d|jj �d4tS|�jL�d5tK|����d|_Yd&}~yd&}~wwxYw�w)7ug 通过Scrapli连接到设备 Returns: 是否连接成功 u无法连接到设备 u,Scrapli库导入失败Fu$正在通过Scrapli连接到设备: � (�)�platformu#使用设备指定的平台类型: ��cisco�switch� cisco_iosxe�router�nexus�nxos� cisco_nxos�huaweir0�juniper� juniper_junos�arista� arista_eosu 根据vendor推断平台类型: u使用平台类型: u 连接设备�rf��paramiko)�host� auth_username�auth_strict_key�timeout_socket�timeout_transportrm�port� transportu使用SSH密钥文件认证: �auth_private_keyu使用密码认证� auth_passwordu6没有提供认证方式(密码或SSH密钥文件)u没有u+的专用异步驱动,使用同步ScrapliNTu已成功连接到设备: u设备提示符: u获取设备提示符失败: u使用异步驱动: u正在打开连接到 z...�telnetr��r�� get_promptu连接设备失败: �) - rCrO)*�SCRAPLI_IMPORT_SUCCESS�logger�errorrR�name�info� ip_address�hasattrrm�debug�vendor�value�lower� device_typerS�usernamer�� ssh_key_file�protocolr5�SSH�passwordr-r.r/r,�asyncio� to_thread�openrUrVr r>rWr�� Exception�warningrMr$�TELNET�iscoroutinefunction�type) rrmr�r�� device_params�driver�conn�prompt�es rrYzScrapliConnector.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�&*�D�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��2�2�4�?�?�3M�3M�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 �A9]�<I7[�3]�4B[�Y� A/[�9"Y �Y�Y �8]�9A*[�#Z�$B[�&Z�'A/[�AZ �3Z�41Z �%Z�&Z �]�[�Y � Y=�!Y8�3[�7]�8Y=�=[�[�Z �Z � Z>�!Z9�4[�8]�9Z>�>[� ]� A,\;�6]�;]�]c ��pK�|jsEtjd|jj�d|jj �d��y |j r"|j j��d{���d|_tjd|jj�d|jj �d��y7�P#t$rY}tjd|jj�d|jj �d t|����Yd}~yd}~wwxYw�w) u^ 断开Scrapli连接 Returns: 是否断开成功 �设备未连接: rkrlTNFu已断开与设备的连接: u断开连接失败: r�) rVr�r�rRr�r�rU�closer�r�r�rM)rr�s rr]zScrapliConnector.disconnect7s������~�~� �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�AD6�)C�>C�?AC�D6�C� D3�AD.�)D6�.D3�3D6r9r^c ��� K�|jsStjd|jj�d|jj �d��t |ddd��Stjd|jj�d |��� tj|jj�r;tjd �|jj||� ��d {���}nItjd �tj|jj||� ��d {���}tj�|_d}d}t#|d�r%|j$}t#|d�r|j&}n t)|�}t+|t(�r!|j-�}dj/|�} t#|jd�r�tj|jj0�r#|jj1��d {���}n1tj|jj0��d {���}|r2|j3|�s!|dz|z}tjd|�d��|rAtj7d|�d|jj�d|���t ||dd��Stjd|�d|jj�d��t ||d��S7��"7���7��7��#t4$r+}tjdt)|����Yd }~��d }~wwxYw#tj8$rBtj7d|�d|jj�d��t |ddd��cYSt4$�r2}t;|�j<} t)|�} d| vsd| v�r�tjd |jj�d|jj �d�� |jr#|jj?��d {���7n7#t4$r+} tjd!t)| ����Yd } ~ nd } ~ wwxYwd|_|jA��d {���7} | r8tjd"|���|j||��d {���7cYd }~Stj7d#|jj�d|jj �d��t |ddd$��cYd }~S#t4$rK} tj7d%t)| ����t |ddd&t)| �����cYd } ~ cYd }~Sd } ~ wwxYwtj7d|�d|jj�d| �d'| ���t |dd| �d'| ����cYd }~Sd }~wwxYw�w)(u� 通过Scrapli发送命令 Args: command: 要执行的命令 timeout: 命令超时时间(秒) Returns: 命令执行结果 r�rkrlrnF�设备未连接�r9r:r;r<� 向设备 � 发送命令: u使用异步方式发送命令)r9� timeout_opsNu*使用同步方式在线程中发送命令�result�failed� r�u添加提示符到输出: '�'u获取提示符失败: rBu ' 在设备 u 上执行失败: u命令执行失败u 上执行成功T�r9r:r;u 上执行超时u命令执行超时�ScrapliConnectionNotOpened�connection not openedu&连接已断开,尝试重新连接: �关闭旧连接失败: u#重新连接成功,重试命令: �重新连接失败: �连接断开且重连失败�#重新连接过程中发生错误: �重连过程错误: rC)!rVr�r�rRr�r�r8r�r�r�rUr`r�r�r r>rWr�r�r�rM� isinstance� splitlines�joinr��endswithr�r�� TimeoutErrorr�r$r�rY)rr9r^�responser�� is_failed�linesr�r�� error_name� error_msg� close_error�reconnect_success�reconnect_errors rr`zScrapliConnector.send_commandMsL�����~�~� �N�N�.�t�{�{�/?�/?�.@��4�;�;�CY�CY�BZ�Z[�\� ]� ����/� � � � � �j����!1�!1� 2�/�'��K�L�C ��*�*�4�?�?�+G�+G�H�� � �=�>�!%���!=�!=�#� '�">�"��� � � �I�J�!(�!2�!2��O�O�0�0�#� '�"��� "*����D� ��F��I��x��*�!�����8�X�.� (���I��X����&�#�&��)�)�+�����5�)�� C��4�?�?�L�9��2�2�4�?�?�3M�3M�N�'+���'A�'A�'C�!C��'.�'8�'8����9S�9S�'T�!T���f�o�o�f�&=�!'�$���!7��� � �'B�6�(�!�%L�M��� � �x��y� �T�[�[�=M�=M�<N�N`�ag�`h�i�j�$�#�!�!�"6� �� �K�K�(�7�)�<�� � �8H�8H�7I�IY�Z� [� ����� �}����D"D��!T�� � C����!8��Q���A�B�B�� C��$�#�#� � �L�L�8�G�9�L����9I�9I�8J�JZ�[� \� ����2� � � �3 ��a��)�)�J��A��I�,�z�9�=T�Xa�=a����!G�� � �HX�HX�GY�Y[�\`�\g�\g�\r�\r�[s�st�u�v�!�U��?�?�"&�/�/�"7�"7�"9�9�9��$�U����)@��[�AQ�@R�'S�T�T��U��&+�D�N�/3�l�l�n�(<�(<�%�(�� � �&I�'��$S�T�%)�%6�%6�w��%H�H�H�H�� � �';�D�K�K�<L�<L�;M�R�PT�P[�P[�Pf�Pf�Og�gh�%i�j�,�$+�#%�$)�*G�  ��� !���L�L�#F�s�?�G[�F\�!]�^�(� '�!� %�(<�S��=Q�<R�&S� ������ �L�L�8�G�9�L����9I�9I�8J�J\�]g�\h�hj�kt�ju�v� w� ����!+� �B�y�k�:� � ��]3 �se�BW%�AM�0L�1A M�:L�;BM� AL�&L�'1L�L�8L�AM�W%�=M�W%�M�M�L�L� M�%!M �M� M�M�AW"�%W%�' W"�0A-W�)Q�Q � Q�T8� R�!Q>�9T8�>R�T8� R#�!4T8�S�T8�W"�W%� AT8�2W"�3W%�8 V �;V�<V �=W�W"�W%�V � A W�W"�W%�W"�"W%rbc �� K�tjd|jj�dt |��d��g}t |�D]�\}}tj d|dz�dt |��d|���|j||��d{���}|j|�|jstjd |�d ��|S|t |�dz ks��tjd ��d{�����|S7�p7� �w) u� 通过Scrapli发送多个命令 Args: commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: 命令执行结果列表 r�u 发送多个命令,共 u 条u 执行第 ��/u 条命令: NrBu)' 执行失败,中断后续命令执行g�?) r�r�rRr�rD� enumerater�r`�appendr;r�r��sleep)rrbr^�results�ir9r�s rrdzScrapliConnector.send_commands�s����� � � �j����!1�!1� 2�2L�S�QY�]�O�[_�`�a���#�H�-�J�A�w� �L�L�:�a��c�U�!�C��M�?�,�w�i�P� Q��,�,�W�g�>�>�F� �N�N�6� "��>�>�����'��2[�\�]�� ���3�x�=�1�$�$��m�m�C�(�(�(�.���?��)�s+�B D�C?�AD�D�6D�7 D�D� control_codec ���K�|jr |js*tjd|���t d|��ddd��S tj d|�d|j j���|d k(rd }d }nA|d k(rd }d}n7|dk(rd}d}n-tjd|���t d|��ddd|����St|jd�r�|jjj|��d{���tjd|�d|j j���tjd��d{���|jjj��d{���}nDtjd�|jj|��d{���}|j }t#j$�|_t d|��|d��S7��7��7�w7�@#t($�r�}t+|�j,}t/|�}d|vsd|v�r�tjd|j j��� |jr#|jj1��d{���7n7#t($r+} tjdt/| ����Yd} ~ nd} ~ wwxYwd|_|j3��d{���7} | r7tj d|���|j5|��d{���7cYd}~Stj7d |j j���t d|��ddd!��cYd}~S#t($rN} tj7d"t/| ����t d|��ddd#t/| �����cYd} ~ cYd}~Sd} ~ wwxYwd$|�d%|��}tj7|�t d|��dd|��cYd}~Sd}~wwxYw�w)&u� 发送控制字符到设备 Args: control_code: 控制字符代码,例如'C'表示Ctrl+C Returns: 命令执行结果 u/未连接到设备,无法发送控制命令: zCTRL+rnFr�r�u发送控制字符 CTRL+u 到设备: �C�u中断�D��EOF�Z�u挂起u不支持的控制字符: CTRL+�channelNu 已发送u信号到设备: r�u*尝试通过send_command发送控制命令Tr�r�r�uD发送控制字符时检测到连接已断开,尝试重新连接: r�u4重新连接成功,重试发送控制字符: CTRL+r�r�r�r��发送控制字符失败: rC)rUrVr�r�r8r�rRr�r�r��writer�r�r��readr`r�r r>rWr�r�r$rMr�rY�send_control_commandr�) rr�� special_char� descriptionr:�respr�r�r�r�r�r�s rr�z%ScrapliConnector.send_control_commands��������d�n�n� �N�N�L�\�N�[� \� �� �~�.���/� � �^ � �K�K�2�<�.� �T�[�[�M]�M]�L^�_� `��s�"�%� �&� ���$�%� �#� ���$�%� �&� ����!@���O�P�$�#�L�>�2��!�$C�L�>�"R� ���t��� �2��o�o�-�-�3�3�L�A�A�A�� � �y�� �5F�t�{�{�GW�GW�FX�Y�Z��m�m�A�&�&�&�#���6�6�;�;�=�=��� � �I�K�!�_�_�9�9�,�G�G������!)����D� � �� �~�.���� �B��'��=��H���3 ��a��)�)�J��A��I�,�z�9�=T�Xa�=a����!e�fj�fq�fq�fv�fv�ew�x�y�!�U��?�?�"&�/�/�"7�"7�"9�9�9��$�U����)@��[�AQ�@R�'S�T�T��U��&+�D�N�/3�l�l�n�(<�(<�%�(�� � �&Z�[g�Zh�$i�j�%)�%>�%>�|�%L�L�L�L�� � �';�D�K�K�<L�<L�;M�%N�O�,�&+�L�>�$:�#%�$)�*G�  ��� !���L�L�#F�s�?�G[�F\�!]�^�(�"'� �~� 6�!� %�(<�S��=Q�<R�&S� ������5�Z�L��9�+�N�I� �L�L�� #� �� �~�.���'� � ��]3 �s)�AO,�A9G2�?O,�>G2�>G*�?A G2� G,� +G2�6G.�78G2�/G0�09G2�)O,�*G2�,G2�.G2�0G2�2 O)�<AO$�)J�<I?�=J�M� J7� !J2�-M�2J7�7M�K�3M�L � M� O)�O,�=M�O)�O,� N-�>N(�N-�O$�"O)�#O,�(N-�-1O$�O)�O,�$O)�)O,Nre)r$r%r&rLrNrYr]rMrgr8r`rrdr�rOrrriri�sy�� �L�t�L�\�$��,Y�#�Y��Y�]�Y�v�D��I����T�R_�M`��<q�s�q�}�qrric�.�eZdZdZedededefd��Zy)�ConnectorFactoryu?连接器工厂,根据设备和凭据创建适当的连接器rRrSr@c��|jtjtjfvr t ||�St d|jj ����)u  创建设备连接器 Args: device: 网络设备 credential: 设备凭据 Returns: 设备连接器 Raises: ValueError: 如果不支持的协议 u不支持的协议: )r�r5r�r�ri� ValueErrorr�)rRrSs r�create_connectorz!ConnectorFactory.create_connector|sR��" � � �#5�#9�#9�;M�;T�;T�"U� U�#�F�J�7� 7��3�J�4G�4G�4M�4M�3N�O�P� PrN) r$r%r&rL� staticmethodr3r4rQr�rOrrr�r�ys3��I��Q��Q�<L�Q�Q`�Q��Qrr�c� �eZdZdZd�Zdededeee e ffd�Z de de deee e ffd �Z dde de d e d e dee ee e ff d �Z dde de d ee d e dee eee e ff d�Zdeee effd�Zde de de dee ee e ffd�Zy)�ConnectionManageru-连接管理器,管理设备连接和会话c�<�i|_tjd�y)Nu连接管理器初始化完成)�active_connectionsr�r�rIs rrzConnectionManager.__init__�s��>@���� � �4�5rrRrSr@c ��K�|j�d|j��}||jvr1tjd|j�d|j �d��y tjd|j�d|j �d|j �d|jj�d |j�� �tj||�}|j��d {���}|r||j|<yy 7�#t$r8}tjd t|����d t|�fcYd }~Sd }~wwxYw�w)u� 连接到设备 Args: device: 网络设备 credential: 设备凭据 Returns: (是否成功, 错误消息) �_u设备已连接: rkrlrKu尝试连接设备: u ), 凭据: �@�:N)Fu 连接失败u连接设备时发生错误: F)�idr�r�r�r�r�r�r�r�r�r�r�rYr�r�rM)rrRrS�connection_key� connectorr;r�s r�connect_devicez ConnectionManager.connect_device�s_����#�I�I�;�a� � � ��7�� �T�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�B D�'C?�(D�=E�?D� E� -D=�7E�8E�=E�E� device_id� credential_idc��hK�|�d|��}|jj|�}|stjd|���y |j ��d{���}|r |j|=|dfS7�#t $r8}tj dt|����dt|�fcYd}~Sd}~wwxYw�w)u� 断开与设备的连接 Args: device_id: 设备ID credential_id: 凭据ID Returns: (是否成功, 错误消息) r�r�rKNu断开连接时发生错误: F)r��getr�r�r]r�r�rM)rr�r�r�r�r;r�s r�disconnect_devicez#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�&�=� �� !�sG�>B2�A.�A,�A.�+B2�,A.�. B/�7-B*�$B/�%B2�*B/�/B2r9r^c��(K�|�d|��}|jj|�}|stjd|�d��y tj d|�d|���|j ||��d{���}|j r6|jj�stj d�d |_|dfS7�J#t$rG}d t|�j�d t|���} tj| �d| fcYd}~Sd}~wwxYw�w) u" 向设备发送命令 Args: device_id: 设备ID credential_id: 凭据ID command: 要执行的命令 timeout: 命令超时时间(秒) Returns: (命令结果, 错误消息) r�r��#,请先调用connect_device连接�Nu$设备未连接,请先连接设备�通过连接管理器向设备 r�Nu*命令执行成功,但返回内容为空u,[命令执行成功,但没有返回内容]�发送命令时发生错误: rC)r�r�r�r�r�r`r;r:�stripr�r�r$rMr�) rr�r�r9r^r�r�r�r�r�s rr`zConnectionManager.send_command�s����"&�;�a� ��7���+�+�/�/��?� �� �N�N�.�y�k�9\�]� ^�?� #� �K�K�9�)��O�T[�S\�]� ^�$�1�1�'�7�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�� #���?� "�� #�sH�?D�0B?�2B=�3A B?�<D�=B?�? D�<D �D�D� D�Drbc��K�|�d|��}|jj|�}|stjd|�d��y tj d|�dt |��d��|j ||��d{���}|dfS7�#t$rG}d t|�j�d t|���} tj| �d| fcYd}~Sd}~wwxYw�w) u> 向设备发送多个命令 Args: device_id: 设备ID credential_id: 凭据ID commands: 要执行的命令列表 timeout: 每个命令的超时时间(秒) Returns: (命令结果列表, 错误消息) r�r�r�r�r�u 发送 u 条命令Nr�rC) r�r�r�r�r�rDrdr�r�r$rMr�) rr�r�rbr^r�r�r�r�r�s rrdzConnectionManager.send_commandss�����"&�;�a� ��7���+�+�/�/��?� �� �N�N�.�y�k�9\�]� ^�?� #� �K�K�9�)��H�S�QY�]�O�[e�f� g�%�3�3�H�g�F�F�G��D�=� �G��� #�7��Q��8H�8H�7I��C�PQ�F�8�T�I� �L�L�� #���?� "�� #�sG�?C�:B�<B�=B�C�B� C�<C� C� C�C�Cc �~�g}|jj�D]�\}}|jd�\}}|j||jj |jj ||jjj|jr|jj�ndd����|S)ui 获取活动连接列表 Returns: 活动连接信息列表 r�N)r�� device_name� device_ipr�r�rW) r��items�splitr�rRr�r�rSr�r�rWrH)rr�r�r�r�r�s r�get_active_connectionsz(ConnectionManager.get_active_connections*s�����)-�)@�)@�)F�)F�)H� %�N�I�'5�';�';�C�'@� $�I�}� �M�M�&�(�/�/�4�4�&�-�-�8�8�!.�%�0�0�9�9�?�?�HQ�H_�H_��!8�!8�!B�!B�!D�ei� � �*I�� rr�c��HK�|�d|��}|jj|�}|sd|��}tj|�d|fS |j |��d{���}|dfS7�#t $r1}dt |���}tj|�d|fcYd}~Sd}~wwxYw�w)u 向设备发送控制字符 Args: device_id: 设备ID credential_id: 凭证ID control_code: 控制字符代码,例如'C'表示Ctrl+C Returns: (命令结果, 错误信息) r�u未找到活跃连接: Nr�)r�r�r�r�r�r�rM) rr�r�r�r�r�r�r�r�s rr�z&ConnectionManager.send_control_command@s����� &�;�a� ��7���+�+�/�/��?� ��1�.�1A�B�I� �L�L�� #���?� "� #�$�9�9�,�G�G�F��4�<� �H��� #�4�S��V�H�=�I� �L�L�� #���?� "�� #�sH�AB"�A%�A#�A%�"B"�#A%�% B�.&B�B�B"�B�B"Nre)r$r%r&rLrr3r4rrNrrMr�r�rgr8r`rrdrrrr�rOrrr�r��sa��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�(�^�(<��,#�),�#�-0�#�-0�#�5:�(�=�:Q�S[�\_�S`�:`�4a�#rr�)?�typingrrrrrr�logging�sysr��re�os�abcr r r �makedirs� Formatterr� basicConfig�INFO� StreamHandler�stdout�rootr*�handlerr�� setFormatter� getLoggerr��HAS_HUAWEI_SUPPORTr��scraplir,�scrapli.driver.corer-r.r/�scrapli_communityr0r�� ImportErrorr��getattr�scrapli.exceptionsr��dir� exceptions� attr_namer�r�rM�network_devicesr3r4r5r6r8rQrir�r��connection_managerrOrr�<module>r%s��:�:�� �� � �#�� �� � �F�T�"�L�G�%�%�L����� �,�,� A�����S�Z�Z�0����|�|�$�$�G��'�7�0�0�1����]�+a�b�c�%� �� � �-� .������#��W�W�N�0�!��� � �4�5�  �K�K�/����PX�0Y�/Z�[�\�� �L�L�0�1���+�+�,� � �i� � �L�L�4� �{�+� ,�-�"�� �� � �88 �c�8 �tQ��Q�fQ�Q�4K#�K#�\'�(���W �N�"�����L�M�N���#� �L�L�(��Q���0h�i�j�"���#�sC�4G'�G �A G'�)G'� G$�!G'�#G$�$G'�'H�,H�H

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