Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
app.cpython-312.pyc46.6 kB
� ��1hٗ� ���UddlmZmZmZmZmZmZmZddlm Z m Z ddl m Z ddl mZddlmZddlZddlZddlZddlZddlZddlZddlZddlmZmZmZmZddlmZej>jAdej>jCej>jCej>jEe#����dd l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+dd l,m-Z-dd l.m/Z/dd l0m1Z1ejdejf� �ejhd�Z5Gd�de�Z6Gd�de�Z7Gd�de�Z8Gd�de�Z9edd��Z:e:jwedgdgd�dg��e:jyde d� �d!�"�ed#� �Z=e/e%e-�Z>e1e%�Z0iZ?ee@efeAd$<e:j�d%�d&��ZCe:j�d'�d(e@fd)��ZDe:j�d%�d*e6fd+��ZFe:j�d'�d(e@fd,��ZHe:j�d'�ed-�fd(e@d*e7fd.��ZJe:j�d/�d0��ZKe:j�d1�d2e@fd3��ZLe:j�d/�d4e8fd5��ZMe:j�d1�d2e@fd6��ZNe:j�d1�ed-�fd2e@d4e9fd7��ZOe:j�d8�d9ed(e@d2e@fd:��ZQe:j�d;e �<�ddd=ed>e@fd?��ZRe:j�d@�dA��ZSe:j�dB�dCee@fdD��ZTe:j�d@�dE��ZUe:j�dF�dG��ZVe:j�dH�d(e@fdI��ZWe:j�dJ�d(e@fdK��ZXe:j�dL�d=eYfdM��ZZe:j�dN�d=eYfdO��Z[e:j�dP�dedQee@dRe\fdS��Z]e:j�dT�dU��Z^e:j�dV�d=eYfdW��Z_e:j�dP�dX��Z`dddYe@dZe@d[e@fd\�Zae:j�d]�d^��Zbecd_k(rej�d`dadbd�c�yy)f�)�FastAPI�Request� WebSocket�WebSocketDisconnect�Depends� HTTPException�Body)� HTMLResponse� JSONResponse)� StaticFiles)�Jinja2Templates)�CORSMiddlewareN)�Dict�List�Optional�Any)� BaseModel)�device_manager� DeviceType� DeviceVendor� DeviceStatus�ConnectionProtocol� NetworkDevice�DeviceCredential)�connection_manager)�"create_improved_topology_discovery)�create_network_scanner)�level� web_serverc��eZdZUeed<eed<eed<eed<dZeed<dZeed<dZeed<dZeed <dZ eed <gZ e eed <d Z e eed <y )� DeviceCreate�name� ip_address� device_type�vendor��platform�model� os_version�location� description�tagsN� credential_id)�__name__� __module__� __qualname__�str�__annotations__r'r(r)r*r+r,rr-r���F:\NetBrainMCP\web\app.pyr!r!sd�� �I��O��� �K��H�c���E�3�O��J����H�c���K����D�$�s�)��#'�M�8�C�=�'r4r!c��eZdZUdZeeed<dZeeed<dZeeed<dZ eeed<dZ eeed<dZ eeed<dZ eeed<dZ eeed <dZeeed <dZeeed <dZeeed <dZeeeed <y)� DeviceUpdateNr"r#r$r%r'r(r)�statusr*r-r+r,)r.r/r0r"rr1r2r#r$r%r'r(r)r8r*r-r+r,rr3r4r5r7r7,s����D�(�3�-�� $�J��� �$�!%�K��#��%� �F�H�S�M� �"�H�h�s�m�"��E�8�C�=�� $�J��� �$� �F�H�S�M� �"�H�h�s�m�"�#'�M�8�C�=�'�!%�K��#��%� $�D�(�4��9� �$r4r7c�v�eZdZUeed<eed<eed<dZeed<dZeeed<dZ eeed<dZ eeed <y) �CredentialCreater"�username�password�ssh�protocolN�port�enable_password� ssh_key_file) r.r/r0r1r2r>r?r�intr@rAr3r4r5r:r::sE�� �I��M��M��H�c���D�(�3�-��%)�O�X�c�]�)�"&�L�(�3�-�&r4r:c��eZdZUdZeeed<dZeeed<dZeeed<dZ eeed<dZ ee ed<dZ eeed<dZ eeed<y) �CredentialUpdateNr"r;r<r>r?r@rA)r.r/r0r"rr1r2r;r<r>r?rBr@rAr3r4r5rDrDCsd���D�(�3�-��"�H�h�s�m�"�"�H�h�s�m�"�"�H�h�s�m�"��D�(�3�-��%)�O�X�c�]�)�"&�L�(�3�-�&r4rDz NetBrain MCPu$网络设备管理与MCP协议平台)�titler+�*T)�GET�POST�PUT�DELETE�OPTIONS)� allow_origins�allow_credentials� allow_methods� allow_headersz/staticz web/static)� directory�static)r"z web/templates�active_terminalsz /api/devicesc��xK�tj�}|D�cgc]}|j���c}Scc}w�w)u获取所有设备列表)r� list_devices�to_dict)�devices�devices r5rTrThs5�����)�)�+�G�+2� 3�7��F�N�N� �7� 3�3�� 3�s �:�5�:z/api/devices/{device_id}� device_idc��rK�tj|�}|s tdd���|j�S�w)u获取指定设备详情��设备未找到�� status_code�detail)r� get_devicerrU)rXrWs r5r_r_ns6����� &� &�y� 1�F� ���4E�F�F� �>�>� ��s�57� device_datac���K� tjd|��� t|j�} t|j�}tjd|j�d|j���t|j|j|||j|j|jtj |j"|j$|j&|j(�� }t+j,|�}tj/d |j�d |j�d ��|j1�}tjd |���|S#t$r=tj d|j���t dd|j�����wxYw#t$r=tj d|j���t dd|j�����wxYw#t $r�t2$rf}tj d t5|����tj t7j8��t dd t5|������d}~wwxYw�w)u创建新设备u收到添加设备请求:�无效的设备类型: �r\�无效的厂商: u创建设备对象: �, ) r"r#r$r%r'r(r)r8r*r-r+r,u!通过Web API添加设备成功: � (�)�返回结果: u添加设备失败: ��N)�logger�debugrr$� ValueError�errorrrr%r"r#rr'r(r)r�UNKNOWNr*r-r+r,r� add_device�inforU� Exceptionr1� traceback� format_exc)r`r$r%� new_devicerX�result�es r5� create_devicerwvs;����0U�� � �2�;�-�@�A� m�$�[�%<�%<�=�K�  b�!�+�"4�"4�5�F� � � �+�K�,<�,<�+=�R� �@V�@V�?W�X�Y�"��!�!�"�-�-�#�� �)�)��#�#�"�-�-��'�'� �)�)�%�3�3�#�/�/��!�!�  � � #�-�-�j�9� �� � �7� ���7H��:�K`�K`�Ja�ab�c�d��#�#�%��� � �~�f�X�.�/�� ��E� m� �L�L�2�;�3J�3J�2K�L� M��C�:Q�R]�Ri�Ri�Qj�8k�l� l� m�� � b� �L�L�,�[�-?�-?�,@�A� B��C�:K�K�L^�L^�K_�8`�a� a� b��< �� � �U�� � �+�C��F�8�4�5�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�sT�I2�G7�E%�F.�DG7�$I2�%AF+�+G7�.AG4�4G7�7I/� A!I*�*I/�/I2c��ZK�tj|�}|s tdd���ddiS�w)u 删除设备rZr[r\�successT)r� delete_devicer)rXrys r5rzrz�s4�����*�*�9�5�G� ���4E�F�F� �t� ����)+.c��K� tjd|���tjd|j����tj|�}|s t dd���i}|j �|j |d<|j�|j|d<|j� t|j�|d <|j� t|j�|d <|j� t|j�|d<dD]}t||d�}|��|||<�tj |fi|��}|s t dd���tj#d|j �d|j�d��|j%�S#t$rt d d |j�����wxYw#t$rt d d |j�����wxYw#t$rt d d|j�����wxYw#t $r�t&$rf}tj)dt+|����tj)t-j.��t ddt+|������d}~wwxYw�w)u更新设备信息u收到更新设备请求:�请求体内容: rZr[r\Nr"r#r$rcrbr%rdr8u无效的状态: )r'r(r)r*r-r+r,u设备更新失败u设备更新成功: rfrgu更新设备失败: ri)rjrk�dictrr_rr"r#r$rrlr%rr8r�getattr� update_devicerprUrqrmr1rrrs)rXr`rW� update_data�field�value�updated_devicervs r5r�r��s�����=U�� � �2�;�-�@�A�� � �(��)9�)9�);�(<�=�>� �*�*�9�5����C�8I�J� J�� � � � � '�"-�"2�"2�K�� � � !� !� -�(3�(>�(>�K� � %� � "� "� .� q�-7� �8O�8O�-P� �M�*� � � � )� f�(4�[�5G�5G�(H� �H�%� � � � )� f�(4�[�5G�5G�(H� �H�%� m�E��K���5�E�� �%*� �E�"�m� (�5�5�i�O�;�O����C�8L�M� M�� � �*�>�+>�+>�*?�r�.�B[�B[�A\�\]�^�_��%�%�'�'��;� q�#��>U�Va�Vm�Vm�Un�<o�p�p� q��� f�#��>O�P[�Pb�Pb�Oc�<d�e�e� f��� f�#��>O�P[�Pb�Pb�Oc�<d�e�e� f��" �� � �U�� � �+�C��F�8�4�5�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�sy�I>�B&H�+F� H�F5�( H�5G� H�"A+H� I>�$F2�2H�5$G�H�$H�H�I;�A!I6�6I;�;I>z/api/credentialsc ���K�tj�}|D�cgc]F}|j|j|j|j j |jd���Hc}Scc}w�w)u获取所有凭据列表)�idr"r;r>r?)r�list_credentialsr�r"r;r>r�r?)� credentials�creds r5r�r��sl����!�1�1�3�K� � � �D� �'�'��I�I�� � �� � �+�+��I�I�  � � � �� �s�A.�A A)�&A.z /api/credentials/{credential_id}r-c���K�tj|�}|s tdd���|j|j|j |j j|j|jd�S�w)u获取指定凭据详情rZ�凭据未找到r\)r�r"r;r>r?rA) r�get_credentialrr�r"r;r>r�r?rA)r-� credentials r5r�r�sk���� �.�.�}�=�J� ���4E�F�F��m�m�����'�'��'�'�-�-����"�/�/�  ��s�A4A6�credential_datac ��HK� tjd|��� t|j�}|j}|�/|tjk(rdnd}tjd|���tjd |j�d |j���t|j|j|j|||j|j� �}tj |�}tj#d |j�d |j�d|j$�d��|j'�}tjd|���|S#t$r=tj d|j���t dd|j�����wxYw#t $r�t($rf}tj dt+|����tj t-j.��t ddt+|������d}~wwxYw�w)u创建新凭据u收到添加凭据请求:�无效的协议类型: rcr\N��u使用默认端口: u创建凭据对象: re)r"r;r<r>r?r@rAu!通过Web API添加凭据成功: rf�@rgrhu添加凭据失败: ri)rjrkrr>rlrmrr?�SSHr"r;rr<r@rAr�add_credentialrpr�rUrqr1rrrs)r�r>r?�new_credentialr-rurvs r5�create_credentialr�s�����+U�� � �2�?�2C�D�E� n�)�/�*B�*B�C�H� �#�#�� �<�!�%7�%;�%;�;�2��D� �L�L�/��v�6� 7� � � �+�O�,@�,@�+A��O�D\�D\�C]�^�_�)� �%�%�$�-�-�$�-�-���+�;�;�(�5�5� ��'�5�5�n�E� �� � �7��8K�8K�7L�B�~�Of�Of�Ng�gh�iq�iw�iw�hx�xy�z�{� �'�'�)��� � �~�f�X�.�/�� ��;� n� �L�L�2�?�3K�3K�2L�M� N��C�:Q�Ra�Rj�Rj�Qk�8l�m� m� n��> �� � �U�� � �+�C��F�8�4�5�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�sA�H"�F'�E�D+F'�H"�AF$�$F'�'H�9A!H�H�H"c��ZK�tj|�}|s tdd���ddiS�w)u 删除凭据rZr�r\ryT)r�delete_credentialr)r-rys r5r�r�Es4�����.�.�}�=�G� ���4E�F�F� �t� ��r{c ��K� tjd|���tjd|j����tj|�}|s t dd���d}|j r t|j �}|j�|j|_ |j�|j|_ |j�|j|_ |�||_|j�|j|_ |j�|j|_ |j�|j|_tj�tj!d |j�d |j�d |j j"�d ��|j%�S#t$rt dd|j �����wxYw#t $r�t&$rf}tj)d t+|����tj)t-j.��t dd t+|������d}~wwxYw�w)u更新凭据信息u收到更新凭据请求:r}rZr�r\Nrcr�u凭据更新成功: rfr�rgu更新凭据失败: ri)rjrkr~rr�rr>rrlr"r;r<r?r@rA� save_datarpr�rUrqrmr1rrrs)r-r�r�r>rvs r5�update_credentialr�Ms"����.U�� � �2�?�2C�D�E�� � �(��)=�)=�)?�(@�A�B�$�2�2�=�A� ���C�8I�J� J��� � #� #� r�-�o�.F�.F�G�� � � � +�-�2�2�J�O� � #� #� /�"1�":�":�J� � � #� #� /�"1�":�":�J� � � �"*�J� � � � � +�-�2�2�J�O� � *� *� 6�)8�)H�)H�J� &� � '� '� 3�&5�&B�&B�J� #� � � �"�� � �*�:�?�?�*;�2�j�>Q�>Q�=R�RS�T^�Tg�Tg�Tm�Tm�Sn�no�p�q��!�!�#�#��1� r�#��>U�Ve�Vn�Vn�Uo�<p�q�q� r��4 �� � �U�� � �+�C��F�8�4�5�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�sC�I�A0G�5F,� D!G�+I�,$G�G�I �%A!I�I � Iz(/ws/terminal/{device_id}/{credential_id}� websocketc ��.K�|j��d{���|�d|��}|�dt|���} |t|<tj d|���t j |�}|sL|jddd���d{��� |tvrt|= tj||��d{���yt j|�}|sL|jddd���d{��� |tvrt|= tj||��d{���y|jd d d |j �d |j"�d �d���d{���tj$||��d{���\}} |sO|jdd| ��d���d{��� |tvrt|= tj||��d{���y|jd d|j |j"|j&j(d���d{��� |j+��d{���} t-j.| �} | j1d�dk(�r�| j1dd�} tj3d|j �d| j5����| �rU | dk(rDtj d|j ���tj6||d���d{����n | dk(rCtj d|j ���tj6||d���d{���n�tj8||| j5d�d �!��d{���\} } | rW| j:r�| j:}|j=dd"�j=d#d"�}|jd$|d%���d{���n7tjd&| ���|jdd&| ��d���d{������7���7��o7��C#t$rR}tjdt|����tjtj��Yd}~yd}~wwxYw7��p7��D#t$rR}tjdt|����tjtj��Yd}~yd}~wwxYw7��l7��Q7��07��#t$rR}tjdt|����tjtj��Yd}~yd}~wwxYw7��7��7��O7�� 7���7���7��N#t$r|}tjd't|����tjtj��|jdd't|���d���d{���7Yd}~���d}~wwxYw#t,j>$rtjAd(| ���Y���t$r|}tjd)t|����tjtj��|jdd)t|���d���d{���7Yd}~���d}~wwxYw#tB$rtj d*|���Yn]t$rR}tjd+t|����tjtj��Yd}~nd}~wwxYw|tvrt|= tj||��d{���7y#t$rR}tjdt|����tjtj��Yd}~yd}~wwxYw#|tvrt|= tj||��d{���7w#t$rR}tjdt|����tjtj��Yd}~wd}~wwxYwxYw�w),u处理终端WebSocket连接N�_u新的终端WebSocket连接: rmr[)�type�messageu断开设备连接错误: r�r8Fu正在连接设备: rfz)...)r�� connectedr�u连接失败: T)r�r�� device_name� device_ipr%r��input�contentr&u执行设备命令: [z] �u,收到CTRL+C,发送中断信号到设备: �C)rXr-� control_code�u)收到CTRL+D,发送EOF信号到设备: �Dz �)rXr-�command�timeout� � �output)r�r�u命令执行错误: u命令执行异常: u收到非JSON格式消息: u消息处理错误: uWebSocket断开连接: u终端WebSocket错误: )"�acceptr�rRrjrprr_� send_jsonr�disconnect_devicerqrmr1rrrsr�r"r#�connect_devicer%r�� receive_text�json�loads�getrk�strip�send_control_command� send_commandr��replace�JSONDecodeError�warningr)r�rXr-�connection_key� terminal_keyrWrvr�ryrm�datar�r�ru�normalized_output� cmd_error� loop_errors r5�terminal_websocketr��s����� � � � ���!�{�!�M�?�3�N�$�%�Q�r�)�}�o�6�L�O1�)2���&�� � �3�L�>�B�C� �*�*�9�5����%�%��,�'�� � � �v �+� +� ��.� 1�$�6�6�y�-�P� P� P�}$�2�2�=�A� ���%�%��,�'�� � � �f �+� +� ��.� 1�$�6�6�y�-�P� P� P�k�!�!���-�f�k�k�]�"�V�=N�=N�<O�t�T�# � � � � 2�@�@���T�T������%�%��+�E�7�3�'�� � � �F �+� +� ��.� 1�$�6�6�y�-�P� P� P�K�!�!���!�;�;��*�*��m�m�)�)� # � � � ��"�/�/�1�1�D�L ��*�*�T�*���;�;�v�&�'�1�%�k�k�)�R�8�G��L�L�#8���� �R�� � ��GX�!Y�Z��6�&�&�0� &� � �.Z�[a�[f�[f�Zg�,h� i�&8�&M�&M�.7�2?�14�'"�!"�!"� ")�F�!2� &� � �.W�X^�Xc�Xc�Wd�,e� f�&8�&M�&M�.7�2?�14�'"�!"�!"�7I�6U�6U�.7�2?�,3�M�M�&�,A�,.� 7"�1"� ���$*�'-�}�}�<B�M�M�(9�=N�<U�<U�V\�^b�<c�<k�<k�lp�rv�<w�(9�/8�.A�.A�4<�7H�C*�/+�)+�)+� %+�L�L�3G��w�1O�$P�*3�*=�*=�07�5I�%��3Q�?&�+'�%'�%'�s�i�� ��H Q��� 1� �L�L�5�c�!�f�X�>� ?� �L�L��-�-�/� 0� 0�� 1��{ ��x Q��� 1� �L�L�5�c�!�f�X�>� ?� �L�L��-�-�/� 0� 0�� 1��m �� U�� ��X Q��� 1� �L�L�5�c�!�f�X�>� ?� �L�L��-�-�/� 0� 0�� 1��M ��2��"!"��!"��1"��$)+�� %'�� )��"�L�L�+?��I��?O�)P�Q�"�L�L��)=�)=�)?�@�"+�"5�"5�(/�-A�#�i�.�AQ�+R�7�#�������'�'� ����!<�T�F�C�D��� �� � �3�C� �O�3D�E�F�� � �Y�1�1�3�4��)�)�#�!5�c�*�o�5F�G�+����� �� �>�� � �-�l�^�<�=� �-�� � �.�s�1�v�h�7�8�� � �Y�)�)�+�,�,��-�� �+� +� ��.� 1�$�6�6�y�-�P� P� P��� 1� �L�L�5�c�!�f�X�>� ?� �L�L��-�-�/� 0� 0�� 1�� �+� +� ��.� 1�$�6�6�y�-�P� P� P��� 1� �L�L�5�c�!�f�X�>� ?� �L�L��-�-�/� 0� 0�� 1�s��`�O.�`�AY5�O1�Y5�`�O7�1O4�2O7�6`�7.Y5�%Q�&Y5�+`�;Q�Q�Q�`�3Y5� R9�Y5�+R<�,#Y5�R?�Y5�`�%S�>S�?S�`�AY5�T#�Y5�T&� Y5�%A2W�AT8�T)�AT8�#T,�$0T8�T/�AT8�/T2�07T8�'T5�(T8�,Y5�.`�1Y5�4O7�7 Q�AQ �`� Q�`�Y5�Q� R6�$AR1�,`�1R6�6`�9Y5�<Y5�?Y5�S� T �AT�`�T � `�#Y5�&Y5�)T8�,T8�/T8�2T8�5T8�8 V=�A+V8�,V/�-V8�2W�8V=�=W�+Y2�+Y5�.Y2�6A+Y-�!Y$�"Y-�'Y5�-Y2�2Y5�5![2�^�[2� A[-�(^�-[2�2^�5`�\%�\!�\%�$`�% ^�.A];�6`�;^�`�`�^4�-^0�.^4�3`�4 `�=A` �`� `�`�`z /{path:path})�response_class�request�pathc��<K�tjd|dd��S�w)u提供单页应用入口点z index.htmlu3NetBrain MCP - 网络设备管理与MCP协议平台)r�rE)� templates�TemplateResponse)r�r�s r5� spa_handlerr�s'���� � %� %���&[�\� ��s�z /api/topologyc���K� tj�}d|j�d�S#t$r6}tj d|���t ddt|������d}~wwxYw�w)u获取当前网络拓扑T)ry�topologyu获取拓扑失败: rir\N)�topology_discovery� get_topologyrUrqrjrmrr1)r�rvs r5r�r�$ss����U�%�2�2�4��� �(�(�*� � �� �U�� � �+�A�3�/�0���6J�3�q�6�(�4S�T�T��U�s$�A-�&+�A-� A*�1A%�%A*�*A-z/api/topology/discover� device_idsc��K� |s tdd���tjd|���g}|D]C}tj|�}|r|j |��,tj d|����E|s tdd���tj|��d{���}dd t|j��d t|j��d �|j�d �S7�E#t$r�t$r]}tjd |���tjtj ��tdd t#|������d}~wwxYw�w)u'从指定设备开始发现网络拓扑rcu请提供至少一个设备IDr\u$Web API拓扑发现,设备列表: u设备不存在: u没有找到有效的设备NTu拓扑发现完成,发现u 个节点,u 条链路)ryr�r�u拓扑发现失败: ri)rrjrprr_�appendr�r��discover_topology_from_devices�len�nodes�linksrUrqrmrrrsr1)r�� valid_devicesrXrWr�rvs r5�discover_topologyr�1sK����U���C�8W�X� X�� � �:�:�,�G�H�� �#�I�#�.�.�y�9�F���$�$�Y�/����!2�9�+�>�?� $���C�8U�V� V�,�J�J�=�Y�Y���4�S����5H�4I��VY�Zb�Zh�Zh�Vi�Uj�js�t� �(�(�*� � �Z�� �� � �U�� � �+�A�3�/�0�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�s=�E�BC$�C"�AC$�!E�"C$�$E�6AE�E�Ec���K� tj�ddd�S#t$r6}tj d|���t ddt |������d}~wwxYw�w)u清空拓扑数据Tu拓扑数据已清空�ryr�u清空拓扑失败: rir\N)r��clear_topologyrqrjrmrr1�rvs r5r�r�Usb����U��)�)�+��,C�D�D�� �U�� � �+�A�3�/�0���6J�3�q�6�(�4S�T�T��U��$�A��A� A�1A�A�Az/api/topology/statisticsc��K� tj�}i}|jD]0}|jj}|j |d�dz||<�2i}|j j�D]&}|j}|j |d�dz||<�(dt|j �t|j�|||jr|jj�nd|jd�S#t$r6}tjd|���t!ddt#|������d}~wwxYw�w) u获取拓扑统计信息r�TN)ry� total_nodes� total_links�protocol_distribution�vendor_distribution�last_discovery�discovery_scopeu获取拓扑统计失败: rir\)r�r�r�r>r�r�r��valuesr%r�r�� isoformatr�rqrjrmrr1)r��protocol_stats�linkr>� vendor_stats�noder%rvs r5�get_topology_statisticsr�_s4����[�%�2�2�4�����N�N�D��}�}�*�*�H�'5�'9�'9�(�A�'F��'J�N�8� $�#� � ��N�N�)�)�+�D��[�[�F�#/�#3�#3�F�A�#>��#B�L�� �,� ��x�~�~�.��x�~�~�.�%3�#/�EM�E\�E\�h�5�5�?�?�A�bf�'�7�7� � �� �[�� � �1�!��5�6���6P�QT�UV�QW�PX�4Y�Z�Z��[�s)�E�C9C>�=E�> D=�1D8�8D=�=Ez"/api/devices/{device_id}/neighborsc��fK� tj�}|j|�}g}|D]9}tj|�}|s�|j |j ���;d||d�S#t$r6}tjd|���tddt|������d}~wwxYw�w)u!获取指定设备的邻居设备T)ryrX� neighborsu获取设备邻居失败: rir\N) r�r��get_device_neighborsrr_r�rUrqrjrmrr1)rXr�r��neighbor_details� neighbor_idrWrvs r5r�r�~s�����[�%�2�2�4���1�1�)�<� ���$�K�#�.�.�{�;�F�� �'�'����(8�9�%� �"�)� � �� �[�� � �1�!��5�6���6P�QT�UV�QW�PX�4Y�Z�Z��[�s/�B1�AA/�&A/�.B1�/ B.�81B)�)B.�.B1z+/api/devices/{device_id}/discover-neighborsc ��PK� tj|�}|s tdd���tj d|j �d��t j|��d{���\}}d||j ||D�cgc]}|j���c}t|�t|�d�S7�Icc}w#t$r�t$r]}tjd |���tjtj��td d t|������d}~wwxYw�w) u-发现单个设备的邻居(实时发现)rZr[r\uWeb API开始发现设备 u 的邻居NT)ryrXr�r�� interfaces�neighbor_count�interface_countu发现设备邻居失败: ri)rr_rrjrpr"r��discover_device_neighborsrUr�rqrmrrrsr1)rXrWr�r��ifacervs r5r�r��s����[��*�*�9�5����C�8I�J� J�� � �0���� �Z�H�I�'9�&R�&R�SY�&Z� Z�� �:��"�!�;�;�"�8B�C� �u�5�=�=�?� �C�!�)�n�"�:�� � �![��D�� �� � �[�� � �1�!��5�6�� � �Y�)�)�+�,���6P�QT�UV�QW�PX�4Y�Z�Z��[�sN�D&�AB4�#B-�$B4�=B/ �B4�,D&�-B4�/B4�4D#�AD�D#�#D&z/api/scan/networkc ��K� |jd�}|s tdd���|jdd�}|jdd�}|jd d �}|jd d �}|jd d �}|jd d�}tjd|���ddlm}||||||��} tj || ��d{���} g} |rtj| d ���d{���} d dt| ��d�|t| �| D� cgc]} | j���c} t| �| D� cgc]} | j���c} d�S7��7�gcc} wcc} w#t$r�t$r]}tjd|���tjtj��tddt|������d}~wwxYw�w)u扫描网络范围�networkrcu请提供网络范围参数r\r��@�max_concurrent�2� ping_enabledT�port_scan_enabled� snmp_enabled�auto_create_devicesFu$Web API网络扫描,网络范围: r��ScanConfiguration)r�r�r�rrN�� auto_createu网络扫描完成,发现 u 个活跃主机)ryr�� network_range� alive_hosts� scan_results�auto_created_devices�discovered_devicesu网络扫描失败: ri)r�rrjrp�network_scannerr�scan_network_range�discover_devices_from_scanr�rUrqrmrrrsr1)r�r�r�r�r�rrrr�configr r rurWrvs r5�scan_network_range_apir�s�����0U��+�+�i�(����C�8U�V� V��+�+�i��-�� ���%5�r�:���{�{�>�4�8� �#�K�K�(;�T�B���{�{�>�4�8� �%�k�k�*?��G��� � �:�7�)�D�E�5�#��)�%�/�%�  ��-�?�?���P�P� � �� �'6�'Q�'Q�R^�lp�'Q�'q�!q� ��5�c�,�6G�5H�HX�Y�$��|�,�<H�I�L�&�V�^�^�-�L�I�$'�(:�$;�BT�"U�BT��6�>�>�#3�BT�"U� � �Q�� "r��J��"U�� �� � �U�� � �+�A�3�/�0�� � �Y�)�)�+�,���6J�3�q�6�(�4S�T�T��U�sl�G�CE+�E�"E+�7E�8"E+�E! �1E+�E&�E+�G�E+�E+�! E+�+G�=AG�G�Gz/api/scan/hostc���K� |jd�}|s tdd���|jdd�}|jdd�}|jd d�}tjd |���d d lm}||||� �}tj ||��d{���}|tj|<tj�dd|��|j|j�d�S7�M#t$r�t$r]}tjd|���tjtj��tddt|������d}~wwxYw�w)u扫描单个主机r#rcu请提供IP地址参数r\r�r�rTruWeb API扫描单个主机: rr)r�rrNu主机扫描完成: )ryr��is_alive� scan_resultu扫描单个主机失败: ri)r�rrjrpr r�scan_single_hostr �save_scan_resultsrrUrqrmrrrsr1) r�r#r�rrrrrrvs r5�scan_single_host_apir�sX����'[��[�[��.� ���C�8Q�R� R��+�+�i��-��#�K�K�(;�T�B���{�{�>�4�8� �� � �1�*��>�?�5�#��/�%� ��,�<�<�Z��P�P� �4?��$�$�Z�0��)�)�+��-�j�\�:�#�,�,�&�.�.�0�  � � Q�� �� � �[�� � �1�!��5�6�� � �Y�)�)�+�,���6P�QT�UV�QW�PX�4Y�Z�Z��[�s=�E�BC,�C*�A C,�)E�*C,�,E�>AE�E�Ez/api/scan/resultsr#� alive_onlyc��$K� |rEtjj|�}|rd|j�d�St dd|�d����t tjj ��}|r|D�cgc]}|js�|��}}dt|�|D�cgc]}|j���c}d�Scc}wcc}w#t$r�t$r6}tjd|���t d dt|������d }~wwxYw�w) u获取扫描结果T)ryrrZu 未找到IP u 的扫描结果r\)ry� total_resultsr u获取扫描结果失败: riN) r r r�rUr�listr�rr�rqrjrmr1)r#rru�results�rrvs r5�get_scan_results_apirs����[� �$�1�1�5�5�j�A�F��#�#)�>�>�#3��� $��l�:�,�Vf�<g�h�h��?�7�7�>�>�@�A�G��&-�<�g�����1�g��<� �!$�W��@G� H��f����!1�� H�� ��=�� !I�� �� � �[�� � �1�!��5�6���6P�QT�UV�QW�PX�4Y�Z�Z��[�sV�D�5C�D�>C�8B;� B;�C�C�6C�:D�; C�D �1D�D � Dz/api/scan/statisticsc���K� tj�}d|d�S#t$r6}tj d|���t ddt |������d}~wwxYw�w)u获取扫描统计信息T)ry� statisticsu获取扫描统计失败: rir\N)r �get_scan_statisticsrqrjrmrr1)�statsrvs r5�get_scan_statistics_apir"3sn����[��3�3�5���� � �� �[�� � �1�!��5�6���6P�QT�UV�QW�PX�4Y�Z�Z��[�r�z/api/scan/discover-devicesc ��� K� |jd�}|jdd�}|jd�}|jd�}tjj�D�cgc]}|js�|��}}g}|D�]� |r� j r� j |kDr�"|ri|j d�D�cgc]:}|j�j�s�"t|j����<} }t� fd�| D��s��|r7� jr+|j�� jj�vr��|r7� jr+|j�� jj�vr��|j� ���tj|d� ��d {���} dd t!|��d t!| ��d �t!|�t!| �| D� cgc]} | j#���c} d�Scc}wcc}w7�]cc} w#t$$r]} t&j)d| ���t&j)t+j,��t/ddt1| ������d } ~ wwxYw�w)u'从扫描结果中发现并创建设备�min_response_time�required_portsr&� vendor_filter�device_type_filter�,c3�:�K�|]}|�jv���y�w�N)� open_ports)�.0r?rus �r5� <genexpr>z1discover_devices_from_scan_api.<locals>.<genexpr>Ws�����T�AS��4�6�#4�#4�4�AS�s�TrNu从 u 个扫描结果中创建了 u 个设备)ryr��filtered_results_count�created_devices_count�created_devicesu#从扫描结果创建设备失败: rir\)r�r r r�r� response_time�splitr��isdigitrB�allr%�lowerr$r�rr�rUrqrjrmrrrsrr1)r�r$r%r&r'r� all_results�filtered_results�p�required_port_listr rWrvrus @r5�discover_devices_from_scan_apir:@sU�����0d�#�K�K�(;�<�� ���%5�r�:��� � �O�4� �$�[�[�)=�>��#2�">�">�"E�"E�"G�V�"G�Q�1�:�:�q�"G� �V���!�F� �V�%9�%9�f�>R�>R�Uf�>f���>L�>R�>R�SV�>W�%o�>W��[\�[b�[b�[d�[l�[l�[n�c�!�'�'�)�n�>W�"�%o��T�AS�T�T������ �&�&�(�� � �0C�0C�0E�E��"�f�&8�&8�%�+�+�-�V�5G�5G�5M�5M�5O�O�� � #� #�F� +�+"�0$3�#M�#M�N^�lp�#M�#q�q����c�"2�3�4�4Q�RU�Vh�Ri�Qj�jt�u�&)�*:�&;�%(�);�%<�?Q�R�?Q�V���� 0�?Q�R�  � ��=W��&p�"r�� S�� �d�� � �:�1�#�>�?�� � �Y�)�)�+�,���6Y�Z]�^_�Z`�Ya�4b�c�c��d�ss�J�A%H�*H�<H�=H�=#H �!H �<B7H�3H�47H�+H �H�J� H�H� I>�!AI9�9I>�>Jc���K� tj�ddd�S#t$r6}tj d|���t ddt |������d}~wwxYw�w)u清空扫描结果Tu扫描结果已清空r�u清空扫描结果失败: rir\N)r �clear_scan_resultsrqrjrmrr1r�s r5�clear_scan_results_apir=usf����[��*�*�,��,C�D�D�� �[�� � �1�!��5�6���6P�QT�UV�QW�PX�4Y�Z�Z��[�r�r'r��returnc�^�|sy|j�}|j�}d|vsd|vr!d|vsd|vryd|vsd|vryd|vsd|vry d |vry y d |vrd|vryd|vryd|vryd|vryyd|vsd|vr d|vryd|vryyd|vsd|vry d!d"l}|jd#|�}|rd$|jd%���Sy)&u-标准化平台信息为简洁的平台代码�unknown�huawei�vrp�s5700� huawei_s5700�s6720� huawei_s6720�s3700� huawei_s3700�ce� huawei_ce� huawei_vrp�cisco�catalyst�cisco_catalyst�nexus� cisco_nexus�asr� cisco_asr�isr� cisco_isr� cisco_ios�h3c�comware�s5120� h3c_s5120�s5130� h3c_s5130� h3c_comware�juniper�junos� juniper_junosrNz(s\d+[a-z]*-?\d*[a-z]*)�unknown_r�)r5�re�search�group)r'r��platform_lower�device_name_lowerra� model_matchs r5�standardize_platform_inforg�s(�� ���^�^�%�N�#�)�)�+���>�!�U�n�%<� �n� $��3D�(D�!� �� &�'�5F�*F�!� �� &�'�5F�*F�!� �&� &��� �N� "� �� '�#� �� &� � �n� $�� �n� $��� �.� �I��$?� �n� $�� �� &�� � �n� $��>�(A�� ��i�i� :�N�K� � ��k�/�/��2�3�4� 4�r4z/api/devices/fix-platformsc���K� tj�}g}|D]�}|j�t��dkDst �fd�dD��s�2t �|j �}|�k7s�Ntj|j|��}|s�r|j|j �|d����ddt|��d�|d �S#t$r6}tjd |���td d t|���� ��d }~wwxYw�w)u!修复所有设备的平台信息r�c3�B�K�|]}|�j�v���y�wr*)r5)r,�keyword�original_platforms �r5r-z'fix_device_platforms.<locals>.<genexpr>�s)�����2s�Aq�g�3:�=N�=T�=T�=V�2V�Aq�s�)�software�version� copyrightr')r')r�rk� new_platformTu 修复了 u 个设备的平台信息)ryr��updated_devicesu 修复设备平台信息失败: rir\N)rrTr'r��anyrgr"r�r�r�rqrjrmrr1)rVrprWror�rvrks @r5�fix_device_platformsrr�s�����a� �-�-�/�����F� &��� ��$�%��*�c�2s�Aq�2s�/s�8�9J�F�K�K�X� ��#4�4�%3�%A�%A�&�)�)�Vb�%c�N�%�'�.�.�+1�;�;�1B�,8�0���&�#�C��$8�#9�9R�S�.� � �� �a�� � �7��s�;�<���6V�WZ�[\�W]�V^�4_�`�`��a�s;�D�A C�C�+#C�3C�D� D� 1C=�=D�D�__main__z web.app:appz0.0.0.0i�)�hostr?�reload)r&)NT)e�fastapirrrrrrr �fastapi.responsesr r �fastapi.staticfilesr �fastapi.templatingr �fastapi.middleware.corsr�uvicorn�os�sysr��asyncio�loggingrr�typingrrrr�pydanticrr��insert�dirname�abspath�__file__�network_devicesrrrrrrr�device_connectorr�topology_discovery_improvedrr r� basicConfig�DEBUG� getLoggerrjr!r7r:rD�app�add_middleware�mountr�r�rRr1r2r�rTr_�postrw�deleterz�putr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r~rr�boolrr"r:r=rgrrr.�runr3r4r5�<module>r�s���b�b�b�8�+�.�2�� � � ����,�,��������2�7�7�?�?�2�7�7�?�?�2�7�7�?�?�8�3L�#M�N�O�H�H�H�/�J�2�����'�-�-�(� �� � �<� (�� (�9� (� %�9� %�'�y�'�'�y�'��N�0V�W�������%��=��%� ��� � �)�[�<�8�x� �H� �o� 6� �8��HZ�[��)��8��*,��$�s�I�~�&�+������4��4� ��� #�$����%�����.��2U�\�2U��2U�h��� &�'��3��(����� #�$�DH��I�?U�3�?U�\�?U�%�?U�D��� �� �� ���� +�,� �� �-� ���� ��-U�-=�-U��-U�^��� .�/��3��0����� +�,�TX�Y\�T]�0U�3�0U�AQ�0U�-�0U�f���9�:�U1� �U1�c�U1�RU�U1�;�U1�p���� ��5��w��c��6������� U�� U���� "�#�!U��S� �!U�$�!U�F���O��U��U���� #�$�[�%�[�<��� -�.�[�#�[�/�[�,��� 7�8�[�s�[�9�[�:��� ��2U�$�2U��2U�h��� ��)[��)[��)[�V��� ��[�8�C�=�[�T�[��[�<��� � � [�!� [���� &�'�2d�$�2d�(�2d�h��� � �[�!�[�7��7�#�7�s�7�r��� &�'�a�(�a�D �z���G�K�K� �I�D��F�r4

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