HEX
Server: LiteSpeed
System: Linux us-phx-web1284.main-hosting.eu 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: u300739242 (300739242)
PHP: 8.2.30
Disabled: system, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
Upload Files
File: //opt/alt/python311/lib/python3.11/site-packages/pyroute2/ipdb/__pycache__/routes.cpython-311.pyc
�

�;f�����ddlZddlZddlZddlZddlZddlZddlmZddlm	Z	m
Z
mZmZm
Z
ddlmZmZddlmZddlmZddlmZmZmZddlmZmZmZmZmZdd	lm Z m!Z!m"Z"dd
l#m$Z$ddl%m&Z&ddl'm(Z(dd
l)m*Z*ej+e,��Z-ej.ej/zej0zZ1dZ2Gd�de��Z3Gd�de��Z4Gd�de��Z5Gd�de��Z6Gd�de7��Z8Gd�de7��Z9edd��Z:edd��Z;de;_<ed d!��Z=de=_<d"�Z>d#�Z?Gd$�d%e��Z@Gd&�d'e@��ZAGd(�d)e@��ZBGd*�d+eC��ZDGd,�d-eD��ZEGd.�d/eC��ZFd0eFid1�gZGdS)2�N)�
namedtuple)�AF_INET�AF_INET6�	AF_UNSPEC�	inet_ntop�	inet_pton)�AF_MPLS�
basestring)�CommitException)�	LinkedSet)�SYNC_TIMEOUT�
Transactional�with_transaction)�NLM_F_CREATE�NLM_F_MULTI�nlmsg�
nlmsg_base�rtnl)�
encap_type�rt_proto�rt_type)�IFA_F_SECONDARY)�rtmsg)�RequestProcessor)�RouteFieldFilteric�:�eZdZd�ejjD��ZdS)�Metricsc�X�g|]'}tj�|d����(S�r)r�metrics�nla2name��.0�is  �G/opt/alt/python311/lib/python3.11/site-packages/pyroute2/ipdb/routes.py�
<listcomp>zMetrics.<listcomp>!s,��K�K�K��u�}�%�%�a��d�+�+�K�K�K�N)�__name__�
__module__�__qualname__rr �nla_map�_fields�r'r%rr s&������K�K�U�]�5J�K�K�K�G�G�Gr'rc��eZdZddgZdS)�Encap�type�labelsN�r(r)r*r,r-r'r%r/r/$s�������x� �G�G�Gr'r/c��eZdZddgZdS)�Via�family�addrNr2r-r'r%r4r4(s�������� �G�G�Gr'r4c�P��eZdZd
�fd�	Zd�Zd�Zd�Zd�Zd�fd�	Zd�fd	�	Z	�xZ
S)�
NextHopSetNc���tt|�����|pg}|D]}|�|���dS�N)�superr8�__init__�add)�self�prime�v�	__class__s   �r%r<zNextHopSet.__init__-sR���
�j�$���(�(�*�*�*������	�	�A��H�H�Q�K�K�K�K�	�	r'c�(�t|����}t|j�����t|j�����z
}|D]*}|�|||j|����+|S)N��raw)r0�setrD�keysr=)r>�vs�ret�subr@s     r%�__sub__zNextHopSet.__sub__3sx���d�4�j�j�l�l���$�(�-�-�/�/�"�"�S�������%7�%7�7���	.�	.�A��G�G�D��G���!��G�-�-�-�-��
r'c��t|t��r|�|��St|t��rS|�dd��t
krt�|��St�|��St|t��r|Stdt|��z���)Nr5zunknown prime type %s)�
isinstance�	BaseRoute�make_nh_key�dict�getr	�	MPLSRoute�Route�tuple�	TypeErrorr0)r>r?s  r%�	__make_nhzNextHopSet.__make_nh:s����e�Y�'�'�
	C��$�$�U�+�+�+�
��t�
$�
$�	C��y�y��4�(�(�G�3�3� �,�,�U�3�3�3��(�(��/�/�/�
��u�
%�
%�	C��L��3�d�5�k�k�A�B�B�Br'c��|j|Sr:rC�r>�keys  r%�__getitem__zNextHopSet.__getitem__Gs���x��}�r'c�"���fd�}|��S)Nc3�f�K�t�j�����D]}|V��dSr:)rSrD�values)�xr>s �r%�
NHIteratorz'NextHopSet.__iter__.<locals>.NHIteratorKs?������4�8�?�?�,�,�-�-�
�
�������
�
r'r-)r>r^s` r%�__iter__zNextHopSet.__iter__Js*���	�	�	�	�	��z�|�|�r'Fc���|�|��}|j}|j}|d|�dt|��|z
zz}||jvr|j|=tt|���||���S)Nr:rC)�_NextHopSet__make_nh�	_requiredr,�lenrDr;r8r=)	r>r?rD�cascaderX�req�fields�skeyrAs	        �r%r=zNextHopSet.addQs}����n�n�U�#�#���m������4�C�4�y�7�c�&�k�k�C�&7�8�8���4�8��������Z��&�&�*�*�3�E�*�:�:�:r'c���|�|��}	tt|���|��dS#t$r�}|j}|j}|d|�dt|��|z
zz}t|j	�
����D](}	||	d|�dt|��|z
zzkrn�)|�tt|���|	��Yd}~dSd}~wwxYw)Nr:)rar;r8�remove�KeyErrorrbr,rcrSrDrF)r>r?rDrdrX�ererfrg�rkeyrAs          �r%rizNextHopSet.removeZs����n�n�U�#�#��	1��*�d�#�#�*�*�3�/�/�/�/�/���		1�		1�		1��-�C��[�F��t��t�9�w�#�f�+�+��*;�<�<�D��d�h�m�m�o�o�.�.�
�
���4����:��3�v�;�;��3D�(E�E�E�E��E�F����*�d�#�#�*�*�4�0�0�0�0�0�0�0�0�0�����		1���s�(A�
C>�B'C9�9C>r:)NF)r(r)r*r<rJrarYr_r=ri�
__classcell__)rAs@r%r8r8,s�����������������C�C�C�������;�;�;�;�;�;�
1�
1�
1�
1�
1�
1�
1�
1�
1�
1r'r8c��eZdZd�ZdS)�WatchdogMPLSKeyc�r�t�|��|d|d<ddd|dd�g|d<dS)N�oifr��dst)�ttl�bos�tc�label)rOr<�r>�routes  r%r<zWatchdogMPLSKey.__init__ksA���
�
�d�����E�l��U�� ��!�e�E�l�K�K�L��U���r'N)r(r)r*r<r-r'r%rorojs(������M�M�M�M�Mr'roc��eZdZdZd�ZdS)�WatchdogKeyzc
    Construct from a route a dictionary that could be used as
    a match for IPDB watchdogs.
    c	��t�|d�tt��||������D����dS)Nc�6�g|]}|ddv�|d�|��S)r)rs�dst_len�src�src_len�tos�priority�gateway�tablerrr-�r#r]s  r%r&z(WatchdogKey.__init__.<locals>.<listcomp>zsN��
�
�
���Q�4�	�
�
��a�D�
�	�
�
�
r')�contextr?)rOr<rr�itemsrxs  r%r<zWatchdogKey.__init__wsf���
�
��
�
�)�$�&�&��U�����%�'�'�	
�
�
�	
�	
�	
�	
�	
r'N)r(r)r*�__doc__r<r-r'r%r{r{qs-��������

�
�
�
�
r'r{�RouteKey)rsr�r5r�r��IPNHKey)r��encaprq��	MPLSNHKey��newdst�viarqc��t|t��rA|�d��dkr(tttt|����}||kS)N�:���)rLr
�findrrr)r]�ys  r%�_normalize_ipaddrr��sJ���!�Z� � �8�Q�V�V�C�[�[�2�%5�%5��h�	�(�A� 6� 6�7�7����6�Mr'c�6�t|t��r|�d��dkrf|�d��}t	t
t
t
|d����}t|��dkr|�d|d��}n|}||kS)Nr�r��/rrr)rLr
r��splitrrrrc)r]r��s�ips    r%�_normalize_ipnetr��s���
�!�Z� � ��Q�V�V�C�[�[�2�%5�%5�
�G�G�C�L�L��
�x��8�Q�q�T�!:�!:�
;�
;���q�6�6�A�:�:��2�2�q��t�t�$�A�A��A���6�Mr'c�J�eZdZdZd�ejD��ZejD]\ZZ	e�
e���e�
d��ddgZe�e��dgZ
gZdZdZeeeed	�Zdd
�Zed���Zed���Zd
�Z	dd�Zd�Zd�Zd�ZdS)rMz/
    Persistent transactional route object
    c�B�g|]}tj|d����Sr)rr!r"s  r%r&zBaseRoute.<listcomp>�s&��;�;�;��u�~�a��d�#�#�;�;�;r'�removal�
ipdb_scope�
ipdb_priority�	multipathN)�attrs�header�event�	cacheinfo)rrsr��prefsrcc��tj|||||��|j5d|d<ddd��dS#1swxYwYdS)Nrr�)rr<�
_direct_state)r>�ipdb�mode�parent�uids     r%r<zBaseRoute.__init__�s�����t�T�4���=�=�=�
�
�	&�	&�$%�D��!�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&����	&�	&�	&�	&�	&�	&s�3�7�7c���|j5|ds�i}dD]}||r||||<�|r||dr|d|d<dD]A}||r7t||�����r||||<d||<�B|d�|��dD]}d||<�|dtkr
t|d<|d�|��ddd��dS#1swxYwYdS)Nr��rqr�r�r5)r�r�r )�_write_lock�anyr\r=r	)r>r?�firstrXs    r%�add_nhzBaseRoute.add_nh�s���
�
�	)�	)���$�
)���7�/�/�C��C�y�/�%)�#�Y��c�
���
)��H�~�9�*.�x�.��h��:�-�-����9�-��T�#�Y�-=�-=�-?�-?�)@�)@�-�)-�c��E�#�J�(,�D��I����%�)�)�%�0�0�0�;�)�)��$(��S�	�	��H�~��(�(�")��h�����!�!�%�(�(�(�-	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)����	)�	)�	)�	)�	)�	)s�CC,�,C0�3C0c��|j5|dstd���t|��}|dtkr
t|d<|d�|��ddd��dS#1swxYwYdS)Nr�z2attempt to delete nexthop from non-multipath router5)r�rjrOr	ri)r>r?�nhs   r%�del_nhzBaseRoute.del_nh�s���
�
�	)�	)���$�
��K�����e���B��H�~��(�(�&��8�����$�$�R�(�(�(�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)����	)�	)�	)�	)�	)�	)s�AA2�2A6�9A6c
�t
�|j5|ddkr	ddd��dSd|d<|�di���dd��}|�dd��}d}|�d	��p|�d
��}|�d��}|tk�rc|�d���sM|tkr�d
}|j�d|||���}|D]y}t|��|j|���}	|	�	|��|	j5|	d=|	d=|	d=|	d=|	d=ddd��n#1swxYwY|�
|	���zn�|tkr�|�d��r�t|��|j|���}	|	�	|��|	j5|	d=|	d=|	d=|	d=|	d=ddd��n#1swxYwY|�
|	��	ddd��dS|���D]
\}
}|||
<�|r |dD]}	|�
|	���|dD�]C}tj|d��}
|
|jvr�'|d}|
dkr�|dj5t#|d�����D]}|d|=�|dD]/\}}tj�|��}||d|<�0	ddd��n#1swxYwY��|
dkr�|D]}t|��|j|���}	|	�	|��|	j5|	d=|	d=|	d=|	d=|	d=ddd��n#1swxYwY|d�|	������Q|
dkr�|dj5|�d��rbg}|�d��D]*}|�t-|d�����+|rd�|��|dd<ddd��n#1swxYwY���|
dkr,|dj5||d<ddd��n#1swxYwY��'|
dkrd�|D��|d<��>|||
<��E|�dd��t0kr&|�d��}|r|dd}n8|�d��r!|�d���d|d��}nd }||d<|�d!��rD|d"�;|dj5|d"|dd#<ddd��n#1swxYwYd|d"<n7|d�/d|d"<|dj5i|d<ddd��n#1swxYwY|�d$��s2|d�*|dj5i|d<ddd��n#1swxYwY|�d%��s2|d�*|dj5i|d<ddd��n#1swxYwY|�d&��s
|d'�d|d'<d(|vr"|�d)��s
|d(�d|d(<|jD]	}||vr||=�
	ddd��dS#1swxYwYdS)*Nr��locked�systemr��flagsrr5T�	RTA_TABLEr��RTA_DST�
RTA_MULTIPATHF�show)r�rsr5)r�r�rsr�r�r r�rrr��MPLS_IPTUNNEL_DSTrwr�r1r�r�c��g|]
}|d��S�rwr-r�s  r%r&z*BaseRoute.load_netlink.<locals>.<listcomp>fs��%@�%@�%@�Q�a��j�%@�%@�%@r'r~�default�	RTA_ENCAPrr0�RTA_METRICS�RTA_VIA�RTA_GATEWAYr�rq�RTA_OIF)r�rP�get_attrrr�nlryr0r��load_netlinkr�rr�r�rr!�cleanuprSrFr r=�append�str�joinr	)r>�msgr�r5�clean_mpr�rs�msgs�nhmsgr�rX�value�cell�norm�metric�rtax�
rtax_value�	rtax_norm�recordrH�items                     r%r�zBaseRoute.load_netlink�s�
��
�
�]	#�]	#��L�!�X�-�-��]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�
"*�D����G�G�H�b�)�)�-�-�g�q�9�9�E��W�W�X�q�)�)�F��H��L�L��-�-�A�����1A�1A�E��,�,�y�)�)�C���!�!�#�,�,��*G�*G�!��L�(�(� %�H��7�=�=��e��V�)���D�"&�	(�	(��'�T�$�Z�Z�T�Y�t�D�D�D������.�.�.��-�.�.� "�5�	� "�<� 0� "�?� 3� "�;�� "�9�
�.�.�.�.�.�.�.�.�.�.�.����.�.�.�.����B�����	(��k�)�)�d�h�h�u�o�o�)�#��d�����4�@�@�@�B��O�O�C�(�(�(��)�*�*��u�I��|�,���/��{�O��y�M�*�*�*�*�*�*�*�*�*�*�*����*�*�*�*��K�K��O�O�O��s]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�v"�i�i�k�k�
"�
"�
��U�!��S�	�	��
$��{�+�$�$�B��K�K��O�O�O�O��G��*
'�*
'���~�d�1�g�.�.���4�<�'�'���Q����9�$�$��i��6�D�D�&+�D��O�,@�,@�,B�,B�&C�&C�8�8�F� $�Y��� 7� 7�05�g��D�D�,�D�*�(-�
�(>�(>�t�(D�(D�I�9C�D��O�I�6�6�D�D�D�D�D�D�D�D�D�D�D�D����D�D�D�D���[�(�(�"'�	2�	2��'�T�$�Z�Z�T�Y�t�D�D�D������/�/�/��-�.�.� "�5�	� "�<� 0� "�?� 3� "�;�� "�9�
�.�.�.�.�.�.�.�.�.�.�.����.�.�.�.��[�)�-�-�b�1�1�1�1�	2��W�_�_��g��4�H�H� �>�>�*=�>�>�H�"$�C�',�~�~�6I�'J�'J�>�>�� #�
�
�3�s�7�|�+<�+<� =� =� =� =�"�H�:=�(�(�3�-�-��W�
�h� 7�H�H�H�H�H�H�H�H�H�H�H����H�H�H�H���U�]�]��e��2�,�,�&+��U��,�,�,�,�,�,�,�,�,�,�,����,�,�,�,���X�%�%�%@�%@�%�%@�%@�%@�D��N�N�!&�D��J�J��w�w�x��#�#�w�.�.��l�l�9�-�-���*��a�&��/�C���<�<�	�*�*�$�%(�\�\�)�%<�%<�%<�%<�c�)�n�n�M�C�C�#�C��D��K��|�|�K�(�(�	
'���%�1��g��4�C�C�04�\�0B��W�
�f�-�C�C�C�C�C�C�C�C�C�C�C����C�C�C�C�)-�D��&���g��*�%)��\�"��'�]�0�'�'�$&�D��M�'�'�'�'�'�'�'�'�'�'�'����'�'�'�'��<�<�
�.�.�
)�4�	�?�3N��)�_�2�)�)�&(�D��O�)�)�)�)�)�)�)�)�)�)�)����)�)�)�)��<�<�	�*�*�
%�t�E�{�/F��%�[�.�%�%�"$�D��K�%�%�%�%�%�%�%�%�%�%�%����%�%�%�%��<�<�
�.�.�
'�4�	�?�3N�"&��Y���S� � ����Y�/�/�!���K�+�"��U����
#�
#���4�<�<��T�
��
#�w]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#�]	#����]	#�]	#�]	#�]	#�]	#�]	#s��Z-�DZ-�5E�Z-�E�Z-�E�A5Z-�G*�Z-�*G.	�.Z-�1G.	�2Z-�BZ-�#A,L�Z-�L � Z-�#L �$A	Z-�-N		�=Z-�	N

�
Z-�N

�4Z-�A8Q	�=Z-�	Q
�
Z-�Q
�Z-�)Q;�/Z-�;Q?�?Z-�Q?�CZ-�U0�$Z-�0U4	�4Z-�7U4	�8#Z-�V-�!Z-�-V1	�1Z-�4V1	�5-Z-�"W4�(Z-�4W8	�8Z-�;W8	�<-Z-�)X;�/Z-�;X?	�?Z-�X?	�AZ-�-Z1�4Z1rr�c����||zs|Sd}|jj}d}g}ddd�}	d}
|s|rd}
|r|j|}n	|p|j}|ddkr|dkrdS|ddkrd	}|���}||z\}}
|�dd��|
�dd��	|d
tkr�t|d�����o5t|�	di�������t|d�����o5t|�	di�������g}t|�����s,t|��s|
�	d
d��s|d	k�rng}|d
r�t|d
����dkrZ|d
D]N}dD]I}|�	|d��r1|�|||��|�|���J�Od}n$�fd�}|d
�|d��}nd}|�
|��}|�
|��}||krt|d
tkr|jjjdj}n$|jjj|dpdj}||vrt#d���||d�||<||vr||=|jj|fi|��||krR|dkrLt)|�����}|�	dd��|d<|jjd$i|��|���dD]1}||r'||jr||����2|�X|�t2��|���st#d���|d
�|��|D]}|�|���|ddvs|ddkr�|dkr�|ddkr$|j5d|d<ddd��n#1swxYwY|jj	d%i|�|����}|jjd&i|��D]!}|jj� |���"|���|ddkr$|j5d|d<ddd��n#1swxYwYd}n�#tB$rv}|}tEj#��|	d <g|	d!<d|	d"<|dkrD	|�$|d|�#��n*#tB$r}||	d"<tK��}Yd}~nd}~wwxYwYd}~nd}~wwxYw|r|
r|�&|j'��|�	|	|_(|�|jj�)��|S)'NrE)�	traceback�
next_stageTFr��createrrr�r=r5r r�r�r�c�*��t|���kSr:)rc)�mpset�mplens �r%�mpcheckz!BaseRoute.commit.<locals>.mpcheck�s���#&�u�:�:��#6�6r'�mplsr��zroute idx conflict)rXry�scoper�del)r r�zmultipath target is not set)�shadowrir�r�r��RTM_DELROUTE�deleter��error_stackr�)�transaction�commit_phase�commit_mask)r�)r�)r�)*r��txdrop�	global_tx�
current_tx�pick�popr	r�r\rPrc�
set_targetr��make_key�routes�tables�idxrr�ryrO�_asdict�wait_all_targets�_targets�waitr
�is_set�clear_target�wait_targetr��watchdog�wd_keyr��	Exceptionr��
format_exc�commit�RuntimeError�dropr��debug�gc)r>�tidr�r�r��errorr�devopr�r�notx�snapshot�added�removed�wlistr�rX�mptr��old_key�new_key�route_indexre�wdryrk�i_er�s                           @r%rzBaseRoute.commit�s�����k�)�	��K����y�������"�$�7�7�����	�+�	��D��	9��.��-�K�K�%�8���K�����)�)�l�Q�.>�.>��F�����)�)��E��9�9�;�;��$��0���w�
�	�	�,��%�%�%����L�$�'�'�'�r	+��H�~��(�(����+�2�2�4�4�5�5�C���	�	�)�R� 8� 8� ?� ?� A� A�B�B�B����)�0�0�2�2�3�3�A���	�	�'�2� 6� 6� =� =� ?� ?�@�@�@�	���E�L�L�N�N�#�#�C
*��w�<�<�C
*��;�;�{�D�1�1�C
*��E�>�>����{�+����K� 8�9�9�E���z�z�"-�k�":�6�6�B�'C�6�6��#%�6�6�#�t�#4�#4�!6�$(�O�O�C��C��$A�$A�$A�$)�L�L��$5�$5�$5��6�#���7�7�7�7�7�#�;�/�:�:�7�D�I�I����C��-�-��-�-���-�-��4�4���g�%�%��H�~��0�0�&*�i�&6�&=�f�&E�&I���&*�i�&6�&=� ��M�0�S�'��$��+�-�-�-�.B�C�C�C�7>��/N�/N��G�,��+�-�-�'��0����
�e�3�3�{�3�3�3��w�&�&�U�e�^�^��w���0�0�1�1�C�$(�8�8�G�Q�#7�#7�C��L�!�D�G�M�/�/�3�/�/�/��,�,�.�.�.�-�<�<�C�"�3�'�<�K��,<�,E�<�#�C�(�9�9�;�;�;���?��H�H�\�*�*�*��:�:�<�<�M�-�.K�L�L�L���%�2�2�3�7�7�7� �*�*�C��$�$�S�)�)�)�)��L�)�-A�A�A��\�*�h�6�6�L�A�<M�<M��|�,��8�8��+�6�6�-5��\�*�6�6�6�6�6�6�6�6�6�6�6����6�6�6�6�(�T�Y�'�"���&*�k�k�(�&;�&;����+�T�W�]�@�@�x�@�@�9�9�E��I�$�1�1�%�8�8�8�8����	�	�	��|�,��8�8��+�6�6�-5��\�*�6�6�6�6�6�6�6�6�6�6�6����6�6�6�6��D�D���	+�	+�	+��E�!*�!5�!7�!7�E�+��#%�E�-� �"&�E�,���q� � �+��K�K�$,�%&�$/� ������
!�+�+�+�*-�E�,�'�(�N�N�E�E�E�E�E�E�����+�������������	+����$�	'�D�	'��I�I�k�o�&�&�&����E�K��K��	��������s��,N5T�!Q3�'T�3Q7�7T�:Q7�;BT�?T�T�T�T�T�T�
V�)(V�U+�*V�+
V�5V
�V�
V�V�Vc��d|d<|S)Nrir�r-�r>s r%rizBaseRoute.remove<���%��\���r'c��d|d<|S)Nr�r�r-rs r%r�zBaseRoute.shadow@rr'c���|�d��tkrd}n|�dd��}|jjj||�|��=dS)Nr5r�r�r�)rPr	r�r�r�r��r>r�s  r%�detachzBaseRoute.detachDsZ���8�8�H����(�(��E�E��H�H�W�c�*�*�E��I��#�E�*�4�=�=��+>�+>�?�?�?r')NNN)NNrrr�)r(r)r*r�rr+r,rfrX�_r��_virtual_fields�extend�_linked_sets�_nested�_gctimer�r�r��_fields_cmpr<rr�r�r�rrir�rr-r'r%rMrM�sl��������<�;�U�]�;�;�;�G��,�����Q����s������N�N�9����#�_�5�O��N�N�?�#�#�#��=�L��G��G�7�G���$�$�	��K�&�&�&�&�
�)�)���)�2�	)�	)���	)�^#�^#�^#�BGK�`�`�`�`�D������@�@�@�@�@r'rMc�h�eZdZddgZeZed���Zed���Zed���Z	d�Z
d�ZdS)	rRr�r c�4�|�dd��}t|tttf��r$d�t
d�|����}t|t��std���|�dd��|d�S)	z(
        Normalize encap object
        r1Nr�c�t�t|t��rt|d��nt|��S�Nrw�rLrOr��r]s r%�<lambda>z"Route.make_encap.<locals>.<lambda>Ys-��+5�a��+>�+>�J��A�g�J����C��F�F�r'zlabels struct not supportedr0r�)r0r1)	rPrL�listrSrEr��mapr
rT)�clsr�r1s   r%�
make_encapzRoute.make_encapPs���
���8�T�*�*���f�t�U�C�0�1�1�	��X�X�����	����F��&�*�-�-�	;��9�:�:�:��	�	�&�&�1�1�V�D�D�Dr'c��g}t|t��r�tjD]�}|�|�|����}|dkrb|�d��dkr|�d���_d�d�|�d��D����}n|�|�|d��}|�|�����n�t|t���r�tjD�]�}|�|d��}|dkr|r|dr
|d}�n
|dkr�t|�d	g��pg��dkr[t|d	j�
����d
�di���dd��}n�|dkrd}nw|dkrqt|�d	g��pg��dkrH|sFt|d	j�
����d
�dd��}|dkrFt|tttf��r$d�t!d�|����}|�|�����nt#d
t%|��z���t|�S)�J
        Construct from a netlink message a multipath nexthop key
        r��RTA_ENCAP_TYPErrNr�c�8�g|]}t|d����Sr�)r�r�s  r%r&z%Route.make_nh_key.<locals>.<listcomp>ss2����� !� ��'�
�O�O���r'r�r1r�rr�c�t�t|t��rt|d��nt|��Sr)r*r+s r%r,z#Route.make_nh_key.<locals>.<lambda>�s0��#-�a��#6�#6�!,��A�g�J����%(��V�V�r'�prime not supported: %s)rLrr�r,r��name2nlar�r�rPrOrcrSrDr\r-rEr.rTr0)r/r�r\�fieldr@s     r%rNzRoute.make_nh_keycs���
���c�:�&�&�7	C� ��
!�
!���L�L����e�!4�!4�5�5���G�#�#��|�|�$4�5�5��:�:��
�
�d�+�+�+� ������%&�Z�Z�0C�%D�%D������A�A��Y�����t�,�,�A��
�
�a� � � � �!
!�"��T�
"�
"�%	C� ��"
!�"
!���G�G�E�4�(�(���G�#�#��#�a��k�#��(��A�A��w�&�&������R�0�0�6�B�7�7�1�<�<��c�+�.�2�9�9�;�;�<�<�Q�?���W�b�)�)���X�t�,�,��A�
�g�%�%��A�A��i�'�'��S�W�W�[�"�5�5�;��<�<��A�A��B��c�+�.�2�9�9�;�;�<�<�Q�?�C�C�!�4���A��G�#�#�
�1�t�U�C�6H�(I�(I�#�������
�
��	�	�A��
�
�a� � � � �E"
!�H�5��S�	�	�A�B�B�B����r'c	���g}t|t��r�tjD]�}|�|�|����}|dkr|�|�d|d��}nBd}n?|dkr!|�d��tkrd}n|�|�|d��}|�|�����n0t|t��r�tjD]�}|�|d��}|dkr�t|t��r�|�d��d	krg|�d��}tttt|d
����}t!|��dkr|�d|d��}n)|}n&|dkr |�d��tkrd}|�|����nt#dt%|��z���t|�S)
�r
        Construct from a netlink message a key that can be used
        to locate the route in the table
        rsNr�r~r�r�r5r�r�rrrr6)rLrr�r,r�r7rPrr�rOr
r�r�rrrrcrTr0)r/r�r\r8r@r�s      r%r�zRoute.make_key�s������c�:�&�&�#	C�!�)�

!�

!���L�L����e�!4�!4�5�5���E�>�>��}�'(�q�q�#�i�.�.�9���%����e�^�^�����(9�(9�W�(D�(D��A�A��Y�����t�,�,�A��
�
�a� � � � �

!���T�
"�
"�	C�!�)�
!�
!���G�G�E�4�(�(���U�N�N�"�1�j�1�1�#����s���b�(�(�������A�"�8�Y�x��1��-F�-F�G�G�B��1�v�v��z�z�')�r�r�1�Q�4�4�0�������e�^�^�����(9�(9�W�(D�(D��A��
�
�a� � � � �#
!�&�5��S�	�	�A�B�B�B��� � r'c����|�|dv�r�t|t���rkt|��ttfvr5|j5t
j|||��cddd��S#1swxYwYt
j||���t�t��s�s�|dkrt|����n|dkrt	|����|j5t
j||���ddd��n#1swxYwYt|�
����rI|jdvr ��|j
j����fd�|���D��n�D]}|�|d���|<�dS|dkr�t
j||��}t|t"��rJt#|��}||z
D]}|�|���||z
D]}|�|���n#t
j||t#|����dS|d	kr+t|t(��st+j||���n�|d
kr+t|t(��st-j||���nR|dkr+t|t(��st/j||���n!|dkrt|t0��r|d
vrd�t
j||���dS)N)r�r r��r�r ��implicit�explicit�r
c�F��g|]\}}|���||����Sr:��__setitem__�r#�kr@rHs   �r%r&z%Route.__setitem__.<locals>.<listcomp>��8������ �A�q��=�����1�-�-�(�=�=r'r�rr0�protors)z	0.0.0.0/0z::/0r�)rLrOr0r/rr�rrCrYr�r\�_mode�_beginr�r�r�rPr8r=ri�intrrrr
�r>rXr�rE�currGrHs      @r%rCzRoute.__setitem__�s�������'�'�'�Z��t�-D�-D�'��E�{�{�u�g�.�.�.��'�G�G�(�4�T�3��F�F�G�G�G�G�G�G�G�G�G�G�G�G����G�G�G�G� �+�D�#�6�6�C��#�t�$�$�
0�C�
0��'�>�>��t�,�,�,�C�C��I�%�%�!��.�.�.�C��'�>�>�!�-�d�C��=�=�=�>�>�>�>�>�>�>�>�>�>�>����>�>�>�>��u�|�|�~�~�&�&���z�%=�=�=��
�
�t��':�
�;�;�;�����$)�K�K�M�M�������0�0�A�"�Y�Y�q�$�/�/�C��F�F��F�
�K�
�
��+�D�#�6�6�C��#�z�*�*�	
H���&�&����8�!�!�C��G�G�C�L�L�L�L���8�$�$�C��J�J�s�O�O�O�O�$��)�$��Z��5F�5F�G�G�G��F�
�L�
 �
 ��E�3�)?�)?�
 ��.���.�.�C�C�
�F�]�]�:�e�S�#9�#9�]��+�e�U�+�+�C�C�
�G�^�^�J�u�c�$:�$:�^��,�u�e�,�,�C�C��5�L�L��5�*�-�-�
��.�.�.��C��!�$��S�1�1�1�1�1s$�A&�&A*�-A*�C4�4C8�;C8c��tj||��}|dvr6|�4|j5|dkrgni||<||}ddd��n#1swxYwY|S)N)r�r r�r�)rrYr��r>rXrHs   r%rYzRoute.__getitem__s����'��c�2�2���4�4�4�3�;��#�
 �
 �"%��"4�"4�B�B�"��S�	��3�i��
 �
 �
 �
 �
 �
 �
 �
 �
 �
 �
 ����
 �
 �
 �
 ��
s�A�A	�A	N)r(r)r*r#r{r�classmethodr0rNr�rCrYr-r'r%rRrRLs��������	�"�G�
�F��E�E��[�E�$�= �= ��[�= �~�*!�*!��[�*!�X=2�=2�=2�~����r'rRc�P�eZdZeZdgZed���Zed���Zd�Z	d�Z
dS)rQr�c���tt|d��|�di���dd��|�dd�����S)r2r�r�r6Nrqr�)r�rSrP)r/r�s  r%rNzMPLSRoute.make_nh_keys\��
���X��'�'�����r�"�"�&�&�v�t�4�4�����t�$�$�
�
�
�	
r'c��d}t|t��r|�d��}n;t|t��r|�dd��}ntd���t|t��r|dd}|S)r:Nr�rszprime not supportedrrw)rLrr�rOrPrTr-)r/r�rHs   r%r�zMPLSRoute.make_key's������c�5�!�!�	3��,�,�y�)�)�C�C�
��T�
"�
"�	3��'�'�%��&�&�C�C��1�2�2�2��c�4� � �	"��a�&��/�C��
r'c�~��|dk�rlt|t���rVt|t��r;|j5t�|||��cddd��S#1swxYwYt�||���t�t��s�t|����|j5t�||���ddd��n#1swxYwYt|�����rI|j	dvr ��
|jj����fd�|�
��D��n�D]}|�|d���|<�dS|dkr�t�||��}t|t��rKt|��}||z
D]}|�|���||z
D]}|�|���dSt�||t|����dSt�|||��dS)Nr�r<r=r@c�F��g|]\}}|���||����Sr:rBrDs   �r%r&z)MPLSRoute.__setitem__.<locals>.<listcomp>JrFr'r�)rLrOr4r�rMrCrYr�r\rHrIr�r�r�rPr8r=rirKs      @r%rCzMPLSRoute.__setitem__8s�����%�<�<�J�u�d�3�3�<��%��%�%�
C��'�C�C�$�0�0��s�E�B�B�C�C�C�C�C�C�C�C�C�C�C�C����C�C�C�C��'�'��c�2�2�C��c�3�'�'�
0���&�&�&���'�:�:��)�)�$��S�9�9�9�:�:�:�:�:�:�:�:�:�:�:����:�:�:�:��u�|�|�~�~�&�&���z�%=�=�=��
�
�t��':�
�;�;�;�����$)�K�K�M�M�������0�0�A�"�Y�Y�q�$�/�/�C��F�F��F�
�K�
�
��'�'��c�2�2�C��#�z�*�*�
D���&�&����8�!�!�C��G�G�C�L�L�L�L���8�$�$�C��J�J�s�O�O�O�O�$�$��%�%�d�C��E�1B�1B�C�C�C�C�C��!�!�$��U�3�3�3�3�3s#�A$�$A(�+A(�6C�C#�&C#c���|j5t�||��}|dkr|�g||<||}n|dkr|�
i||<||}|cddd��S#1swxYwYdS)Nr�r�)r�rMrYrNs   r%rYzMPLSRoute.__getitem__bs���
�
�	�	��'�'��c�2�2�C��k�!�!�c�k���S�	��3�i�������#�+���S�	��3�i���	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	s�AA�A!�$A!N)r(r)r*rorr#rOrNr�rCrYr-r'r%rQrQss������
�F��g�G��
�
��[�
�����[�� (4�(4�(4�T	�	�	�	�	r'rQc�t�eZdZeZdd�Zd�Zd�Zd�Zd�Z	d�Z
dd	�Zd
�Zdd�Z
dd
�Zd�Zd�Zd�Zd�Zd�ZdS)�RoutingTableNc�`�||_tj��|_i|_i|_dSr:)r��	threading�Lock�lockr��kdx)r>r�r?s   r%r<zRoutingTable.__init__qs*����	��N�$�$��	��������r'c�.�|�d���S)Nc�&�|dddkS)Nryr�r	r-r+s r%r,z'RoutingTable.__nogc__.<locals>.<lambda>xs��Q�w�Z��%=��%E�r')�filterrs r%�__nogc__zRoutingTable.__nogc__ws���{�{�E�E�F�F�Fr'c�X�td�|���D����S)Nc��g|]
}|d��S�ryr-r�s  r%r&z)RoutingTable.__repr__.<locals>.<listcomp>{s��9�9�9�A�Q�w�Z�9�9�9r')�reprr`rs r%�__repr__zRoutingTable.__repr__zs'���9�9������9�9�9�:�:�:r'c�D�t|�����Sr:)rcrFrs r%�__len__zRoutingTable.__len__}s���4�9�9�;�;���r'c#�LK�|���D]}|dV��
dS)Nry)r`)r>r�s  r%r_zRoutingTable.__iter__�s:�����m�m�o�o�	"�	"�F���/�!�!�!�!�	"�	"r'c�R�tj��}|�ddi��D]{}||djz
dkr�	|jjjdi|d��s�|dj5d|dd<ddd��n#1swxYwY�g#|j|d=Y�yxYwdS)	Nr�r	ryr��dumpr�rX)rj)�timer_r$r�r�ryr�r�)r>�nowrys   r%r	zRoutingTable.gc�s
���i�k�k���[�[�,��!5�6�6�		+�		+�E��U�7�^�+�+�a�/�/��
+�)�t�y�|�)�C�C�E�'�N�C�C����7�^�1�<�<�3;�E�'�N�<�0�<�<�<�<�<�<�<�<�<�<�<����<�<�<�<���
+��H�U�5�\�*�*�*����		+�		+s0�+B�.B�:B�B
	�
B�
B
	�B�B$rsc���|j5�fd�|���D��cddd��S#1swxYwYdS)Nc�,��g|]}|d���Srcr-)r#r]rXs  �r%r&z%RoutingTable.keys.<locals>.<listcomp>�s!���=�=�=��A�g�J�s�O�=�=�=r')r[r`rWs `r%rFzRoutingTable.keys�s����
�Y�	>�	>�=�=�=�=�T�]�]�_�_�=�=�=�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>����	>�	>�	>�	>�	>�	>s� 6�:�:c#�PK�|���D]}|||fV��dSr:)rFrWs  r%r�zRoutingTable.items�s?�����9�9�;�;�	#�	#�C���S�	�"�"�"�"�"�	#�	#r'Fc�f�t|tj��r>t|d�t	|j�����D����St|t��rd|i}t|t��stdt|��z���g}t	|j�����D]b}t	|�����D]#\}}||dvs||d|krn�$|�|��|r|cS�c|S)Nc��g|]}|��Sr-r-r�s  r%r&z'RoutingTable.filter.<locals>.<listcomp>�s��"G�"G�"G��1�"G�"G�"Gr'rsztarget type not supported: %sry)
rL�types�FunctionTyper_rSr�r\r
rOrTr0r�r�)r>�target�oneshotrHr�rXr�s       r%r_zRoutingTable.filter�s6���f�e�0�1�1�	I��&�"G�"G�e�D�H�O�O�4E�4E�.F�.F�"G�"G�"G�H�H�H��f�j�)�)�	%��V�_�F��&�$�'�'�	L��;�d�6�l�l�J�K�K�K����D�H�O�O�-�-�.�.�		�		�F�#�F�L�L�N�N�3�3�
�
�
��U��v�g��.�.��V�G�_�S�1�1�1��E�2��
�
�6�"�"�"����J�J�J���
r'c�r�t|t��r1d�|���D��}|j||St|tt
f��r|jt
|�St|t��r%|jt�	|��S|�
|d���}|r|dS|std���t|t��std���|�dd���d	��dkr>|d�d	��}|d|d<t|d
��|d<|�dd���d	��dkr>|d�d	��}|d|d<t|d
��|d
<t|j��}|jjjdi|��}|std���|�|d��|dd�S)Nc��g|]
}|d��S)rXr-r�s  r%r&z)RoutingTable.describe.<locals>.<listcomp>�s��6�6�6��A�e�H�6�6�6r'T)rur�record not foundz*lookups can be done only with dict targetsrs�r�rrr~rr��ryrXr-)rLrJr`r�rSr-r�rrRr�r_rjrOrTrPr�r�r�r��
get_routesr�)r>rt�forwardrFrHrsrrys        r%�describezRoutingTable.describe�s$���f�c�"�"�	*�6�6�d�m�m�o�o�6�6�6�D��8�D��L�)�)��f�u�d�m�,�,�	/��8�H�f�-�.�.��f�e�$�$�	4��8�E�N�N�6�2�2�3�3��k�k�&�$�k�/�/���	��q�6�M��	/��-�.�.�.��&�$�'�'�	J��H�I�I�I��:�:�e�R� � �%�%�c�*�*�a�/�/���-�%�%�c�*�*�C���F�F�5�M� #�C��F���F�9���:�:�e�R� � �%�%�c�*�*�a�/�/���-�%�%�c�*�*�C���F�F�5�M� #�C��F���F�9���d�i� � ��%�d�i�l�%�/�/��/�/���	/��-�.�.�.�
���3�q�6�"�"�"��t�,�,�,r'c��|j5|�|d���}|j|j�|d��=ddd��dS#1swxYwYdS�NF�r|ry)r[r}r��route_classr�)r>rXr�s   r%�__delitem__zRoutingTable.__delitem__�s���
�Y�	C�	C��=�=��e�=�4�4�D����)�2�2�4��=�A�A�B�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C����	C�	C�	C�	C�	C�	Cs�>A�A�Ac�D�|j�|��}|||<|Sr:)r�r�)r>r�rXs   r%�loadzRoutingTable.load�s&����'�'��,�,����S�	��
r'c���|j5	|�|d���}n-#t$r |�|j��dd�}YnwxYwt|t��r|d�|��npt||j��r||d<nUt|t��r@|dj	5|d�
|��ddd��n#1swxYwY|j�|d��}|d�|d|d�|j|<n)||j|<|d|kr|j|d=||d<ddd��dS#1swxYwYdS)NFr�rzryrX)
r[r}rjr�r�rLrr�rOr��updater�r�)r>rXr�r�s    r%rCzRoutingTable.__setitem__�s��
�Y�	(�	(�
M����s�E��:�:�����
M�
M�
M�#'�#3�#3�D�I�#>�#>�t�L�L����
M�����%��'�'�
2��w��,�,�U�3�3�3�3��E�4�#3�4�4�
2�"'��w����E�4�(�(�
2��G�_�2�2�2��7�O�*�*�5�1�1�1�2�2�2�2�2�2�2�2�2�2�2����2�2�2�2��"�+�+�F�7�O�<�<�C��e�}�$�*0��/�#� F� F����
�
� &����
��%�=�C�'�'������/�$'�F�5�M�+	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(����	(�	(�	(�	(�	(�	(sW�E"�"�E"�'A�	E"�A�A1E"�=C%�E"�%C)	�)E"�,C)	�-A(E"�"E&�)E&c�~�|j5|�|d���dcddd��S#1swxYwYdSr)r[r}rWs  r%rYzRoutingTable.__getitem__s���
�Y�	>�	>��=�=��e�=�4�4�W�=�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>����	>�	>�	>�	>�	>�	>s�2�6�6c��	|j5|�|d���ddd��n#1swxYwYdS#t$rYdSwxYw)NFr�T)r[r}rjrWs  r%�__contains__zRoutingTable.__contains__s���	���
2�
2��
�
�c�5�
�1�1�1�
2�
2�
2�
2�
2�
2�
2�
2�
2�
2�
2����
2�
2�
2�
2��4���	�	�	��5�5�	���s'�:�-�:�1�:�1�:�
A�Ar:)rs�F)r(r)r*rRr�r<r`rergr_r	rFr�r_r}r�r�rCrYr�r-r'r%rWrWns�������K�����G�G�G�;�;�;� � � �"�"�"�+�+�+�>�>�>�>�#�#�#�����2,-�,-�,-�,-�\C�C�C�
���
(�(�(�0>�>�>�����r'rWc� �eZdZeZd�Zdd�ZdS)�	MPLSTablec�4�|j���Sr:)r�rFrs r%rFzMPLSTable.keyss���x�}�}���r'Fc���t|t��r
|j|St|t��r%|j|j�|��St
d���)Nrx)rLrJr�rr�r�rj)r>rtr|s   r%r}zMPLSTable.describesb���f�c�"�"�	$��8�F�#�#��f�e�$�$�	?��8�D�,�5�5�f�=�=�>�>��)�*�*�*r'Nr�)r(r)r*rQr�rFr}r-r'r%r�r�s<�������K����	+�	+�	+�	+�	+�	+r'r�c��eZdZd�Zd�Zdd�Zd�Zd�Zd�Zd�Z	dd	�Z
d
�Zdd�Zdd
�Z
defd�Zdd�Zd�Zd�Zd�Zd�Zd�ZdS)�RoutingTableSetc���||_tj��|_|jpg|_dt|j��i|_|j|j|j|j|j	d�|_
dS)Nr�)�RTM_NEWROUTEr��RTM_NEWLINK�RTM_DELLINK�RTM_DELADDR)r�rkr$�_ignore_rtables�ignore_rtablesrWr�r��gc_mark_link�gc_mark_addr�
_event_map)r>r�s  r%r<zRoutingTableSet.__init__"sl����	��y�{�{���"�2�8�b����L���3�3�4��� �-� �-��,��,��,�
�
����r'c��|jj�tdti���D]}|�|���|jj�t
dt
i���D]}|�|���|jj�tdti���D]}|�|���dS)Nr5)r5�match)r�r�r{rr�rr	)r>r�s  r%�	_registerzRoutingTableSet._register/s����9�<�*�*��8�W�"5�+�
�
�	#�	#�C�
���c�"�"�"�"��9�<�*�*��H�h�#7�+�
�
�	#�	#�C�
���c�"�"�"�"��9�<�*�*��8�W�"5�+�
�
�	#�	#�C�
���c�"�"�"�"�	#�	#r'Nc���t|p|��}|�d��pd}|�d��pd}d|vrd|d<d|vrd|d<d|vrd|d<d	|vrG|�d
��dks|�d
��dkrt|d	<n
t|d	<|std���t
|t��r;|d
vr7d|vr3|d	tkr	|dz|d<n|d	tkr|dz|d<d|vr!|d	tkrt|d<nd|d<|�	dg��}|�d	d��tkr<d}||jvrt|j
��|j|<t|j
��}nO|�dd��}||jvrt|j
��|j|<t!|j
��}|�|��|j5d|d<|D]I}d|vr|�|d��|d<|dkr
t|d	<|�|���J	ddd��n#1swxYwY|���|���D])\}	}
|	dkr|�|
��||	<�$|
||	<�*||j||�|��<|S)z2
        Create a route from a dictionary
        r�ryrsr�rr�r�r�r5r�r�zdst not specified)ryr�r�z/32z/128r�Nr�r�r�r�r�)rOrPr�rr�
ValueErrorrLr
�IP6_RT_PRIO_USERr�r	r�r�r�rQrWrRr�r�r0r��beginr�r�)r>�spec�kwargr�rsr�r�ryr�rXr�s           r%r=zRoutingTableSet.add=si���D�M�E�"�"���(�(�9�%�%�+����h�h�u�o�o�#��������D��K��$����D��M��$����D��M��4�������
�
��"�"����S�(9�(9�B�(>�(>�!)��X���!(��X���	2��0�1�1�1��s�J�'�'�	+��O�+�+��C����H�~��(�(�!�E�k��U����h��8�+�+�!�F�l��U���T�!�!��H�~��)�)�#3��Z� � �#'��Z� ��H�H�[�"�-�-�	��8�8�H�a� � �G�+�+��E��D�K�'�'�%.�t�y�%9�%9���E�"��d�i�(�(�E�E��H�H�W�c�*�*�E��D�K�'�'�%1�$�)�%<�%<���E�"��$�)�$�$�E�
���T����
�
 �	!�	!�"*�E�,���
!�
!���b�=�=�"'�"2�"2�2�g�;�"?�"?�B�w�K��F�?�?�#*�B�x�L����R� � � � �
!�	!�	!�	!�	!�	!�	!�	!�	!�	!�	!�	!����	!�	!�	!�	!�	���
�
�
��*�*�,�,�	#�	#�J�C���g�~�~�"�-�-�e�4�4��c�
�
�"��c�
�
�49���E��5�>�>�%�0�0�1��s�AI'�'I+�.I+c��t|t��sdS|dtkrd}n|�d|d��}||jvrdStj��}||jz
dkr||_|���|ddkr�	|j||}|d	d
vr2|j||=|j	5d|d	<ddd��n#1swxYwYn2#t$r%}t�d|��Yd}~nd}~wwxYwdS||jvr?|dkrt|j��|j|<nt|j��|j|<|j|�|��dS)
z6
        Loads an existing route from a rtmsg
        Nr5r�r�r��r�r�r�)r�r��detachedzdelroute failed for %s)rLrr	r�r�rkr$r	r�r�r�logrr�r�rWr�)r>r�r�rlr�rks      r%r�zRoutingTableSet.load_netlink|s����#�u�%�%�	��F��x�=�G�#�#��E�E��L�L��c�'�l�;�;�E��D�'�'�'��F��i�k�k�������!�!��D�L��G�G�I�I�I��w�<�>�)�)�

7���U�+�C�0���,�'�/C�C�C���E�*�3�/��-�:�:�/9��|�,�:�:�:�:�:�:�:�:�:�:�:����:�:�:�:����
7�
7�
7��	�	�2�A�6�6�6�6�6�6�6�6�����
7����
�F����#�#�����%.�t�y�%9�%9���E�"�"�%1�$�)�%<�%<���E�"���E�����$�$�$�$�$s<�2C,�C �C,� C$�$C,�'C$�(C,�,
D�6D�Dc�x�|dtzrdS|d}|tk�r|�d��}tjdt||����ddd|dz
zz}|�d|i��D]�}|d	�d
��}|r�tjdt||����d|z}||krN|d	j5d|d	d<tj	��|d	_
ddd��n#1swxYwY��dS|tkrdSdS)
Nr�r5�	IFA_LOCALz>Irl��� �	prefixlenryr�r	r�)rrr��struct�unpackrr_rPr�rkr$r)r>r�r5r6�netr��gw�gwnets        r%r�zRoutingTableSet.gc_mark_addr�s���.�w�<�/�)�	��F��X����W����<�<��,�,�D��-��i���&=�&=�>�>�q�A��r�C��$4�4�5��C��+�+�x��&8�9�9�
B�
B���G�_�(�(��3�3���B�"�M�$�	�&�"�0E�0E�F�F�q�I�C�O�E���|�|�#�G�_�:�B�B�<@�F�7�O�L�9�6:�i�k�k�F�7�O�3�B�B�B�B�B�B�B�B�B�B�B����B�B�B�B��
B�
B��x�
�
�
�D�
�Fs�)*D�D#	�&D#	c���|ddks|ddkrdS|�d|di��D]P}|dj5d|dd	<tj��|d_ddd��n#1swxYwY�Q|�d
|di��D]P}|dj5d|dd	<tj��|d_ddd��n#1swxYwY�QdS)Nr5r�state�downrq�indexryr	r��iif)r_r�rkr$)r>r�r�s   r%r�zRoutingTableSet.gc_mark_link�s����x�=�A����W���!7�!7��F��k�k�5�#�g�,�"7�8�8�	6�	6�F����.�
6�
6�04��w���-�*.�)�+�+��w��'�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6����
6�
6�
6�
6���k�k�5�#�g�,�"7�8�8�	6�	6�F����.�
6�
6�04��w���-�*.�)�+�+��w��'�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6����
6�
6�
6�
6��	6�	6s$�*A=�=B	�B	�5*C+�+C/	�2C/	c�|�|j���D]!}|j|����"dSr:)r�rFr	rs  r%r	zRoutingTableSet.gc�sE���[�%�%�'�'�	$�	$�E��K���!�!�#�#�#�#�	$�	$r'c���t|t��r/|�dd��pd}|�dd��}n|pd}|j||���dS)Nr�r�rsr�)rLrRrPr�ri)r>ryr�s   r%rizRoutingTableSet.remove�sn���e�U�#�#�	!��I�I�g�s�+�+�2�s�E��I�I�e�Y�/�/�E�E��L�S�E���E��5�!�(�(�*�*�*�*�*r'c��g}t|j�����D],}|�(|�|�|�����-|Sr:)rSr�r\r!r_)r>rtrHr�s    r%r_zRoutingTableSet.filtersV�����4�;�-�-�/�/�0�0�	1�	1�E�� ��
�
�5�<�<��/�/�0�0�0���
r'r�c�B�|j|�|��Sr:)r�r})r>r�r�s   r%r}zRoutingTableSet.describes���{�5�!�*�*�4�0�0�0r'c�0�|pd}|j||S�Nr��r�)r>rsr�s   r%rPzRoutingTableSet.gets�������{�5�!�#�&�&r'c�6���fd�|j|D��S)Nc�h��g|].}|�d���ks�tk�&|d��/S)r5rs)rPr)r#r]r5s  �r%r&z(RoutingTableSet.keys.<locals>.<listcomp>sF���
�
�
�����h���6�)�)�v��/B�/B�
�e�H�/B�/B�/Br'r�)r>r�r5s  `r%rFzRoutingTableSet.keyss5���
�
�
�
��[��'�
�
�
�	
r'c� �||j|vSr:r�)r>rXr�s   r%�has_keyzRoutingTableSet.has_keys���d�k�%�(�(�(r'c� �||jdvSr�r�rWs  r%r�zRoutingTableSet.__contains__s���d�k�#�&�&�&r'c�,�|�|��Sr:)rPrWs  r%rYzRoutingTableSet.__getitem__s���x�x��}�}�r'c�b�||dkrtd���|�|��S)Nrszdst doesn't match key)r�r=)r>rXr�s   r%rCzRoutingTableSet.__setitem__s0���%��,����4�5�5�5��x�x����r'c�,�|�|��Sr:)rirWs  r%r�zRoutingTableSet.__delitem__$s���{�{�3���r'c�6�t|jd��Sr�)rdr�rs r%rezRoutingTableSet.__repr__'s���D�K��$�%�%�%r'r:)r�)r(r)r*r<r�r=r�r�r�r	rir_r}rPrrFr�r�rYrCr�rer-r'r%r�r�!sJ������
�
�
�#�#�#�=�=�=�=�~)%�)%�)%�V;�;�;�z6�6�6� $�$�$�+�+�+�+����1�1�1�1�'�'�'�'��Y�
�
�
�
�)�)�)�)�'�'�'�������
 � � �&�&�&�&�&r'r�r�)�name�classr�)H�loggingr�rYrkr�rr�collectionsr�socketrrrrr�pyroute2.commonr	r
�pyroute2.ipdb.exceptionsr�pyroute2.ipdb.linkedsetr�pyroute2.ipdb.transactionalr
rr�pyroute2.netlinkrrrrr�pyroute2.netlink.rtnlrrr�pyroute2.netlink.rtnl.ifaddrmsgr�pyroute2.netlink.rtnl.rtmsgr�pyroute2.requests.mainr�pyroute2.requests.router�	getLoggerr(r��RTMGRP_IPV4_ROUTE�RTMGRP_IPV6_ROUTE�RTMGRP_MPLS_ROUTE�groupsr�rr/r4r8rOror{r�r�rbr�r�r�rMrRrQ�objectrWr�r�r�r-r'r%�<module>r�sy������
�
�
�
�����������������"�"�"�"�"�"�E�E�E�E�E�E�E�E�E�E�E�E�E�E�/�/�/�/�/�/�/�/�4�4�4�4�4�4�-�-�-�-�-�-�����������
P�O�O�O�O�O�O�O�O�O�O�O�O�O�?�?�?�?�?�?�?�?�?�?�;�;�;�;�;�;�-�-�-�-�-�-�3�3�3�3�3�3�4�4�4�4�4�4��g���!�!����T�3�3�d�6L�L����L�L�L�L�L�m�L�L�L�!�!�!�!�!�M�!�!�!�!�!�!�!�!�-�!�!�!�;1�;1�;1�;1�;1��;1�;1�;1�|M�M�M�M�M�d�M�M�M�
�
�
�
�
�$�
�
�
�L�:��=����
�*�Y� ;�
<�
<�����
�J�{�$<�=�=�	��	��������P@�P@�P@�P@�P@�
�P@�P@�P@�fI�I�I�I�I�I�I�I�I�XS�S�S�S�S�	�S�S�S�l^�^�^�^�^�6�^�^�^�B+�+�+�+�+��+�+�+�$G&�G&�G&�G&�G&�f�G&�G&�G&�T�O�b�A�A�B���r'