PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
a >sgR @s4 dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlmZmZddlmZddZeeZGd d d eZGd d d eZGd ddeZddZddZGdddeZddZ ddZ!dddZ"ddZ#ddZ$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/d0d1e,j.dd2Z/e/j-d3d4d5d6d7e/j-d8d4d9d6d7e,.Z0e0j-d:d4d;d6d7e0j-dd?d@e,j-dAd4dBd6d7e,j-dCdDdEdFddGe,j-dHdId1e,j-dJd4dKd6d7e,j-dLdMdNdOe,j-dPdQdRdOe,j-dSdTdUdOe,j-dVdWddOe,j-dXdYdZdOe,j-d[d4d\d]e,1Z2e2j3s~e2j4rej5d^d_e6ej7d`e8ej7e6ej9dae8ej9nre?ej@ne?e2jABe2j:rle2j4sleCe j4ZDeD?ej7eDEeFeGeDej;He2jIseJdhe2jIe Kdiej;Le2jIseJdje2jIe Kdiej;de^pgZqerdD]ZseeTZcecee2jPe>desecpe*e^ec\ZfZgesdkrefZqn efteqegresdkregD]\ZiZZeZdzkrԐqe eieZdZlelZugZvzeTdgelevWneye\ddkeleldwdZxeyexdkrjeJddkeuevr`eJevdd6Z`YqexddZzdkezeld<Yn0e\ddkelqqqefrVgZnefD]V\ZiZZeZdzkr̐qesdikreid{drqd~ke eieZd6d~Zlen|elqenrVdZkdderdDZ}e2j~de}ZIe\deIeenfeWeId*ZXenD]ZZeXeZd~ q`Wdn1 s0YzeTeIWn:e yZz edej2d6Z`WYdZ[n dZ[00eeIqVe]e2jMdZe2j se2jP s e2jIek r eTde` s0e KdidS)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_functionunicode_literalsN) OrderedDict) IPv6Address ip_network)pformatcCs t|SN)iteritems)dr /usr/lib/frr/frr-reload.py iteritems-src@s eZdZdS)VtyshExceptionN)__name__ __module__ __qualname__r r r r r4src@sXeZdZdddZdddZdddZddd Zd d Zd d ZdddZ dddZ dS)VtyshNcCsh||_||_||_tj|pddg|_|r<|jd|g|rP|jd|g|rd|jd|gdS)Nvtyshz --config_dir --vty_socket-N)bindirconfdir pathspaceospathjoin common_argsextend)selfrrZsockdirrr r r __init__9szVtysh.__init__cCsLi}|dur||d<|dur$||d<|dur4||d<tj|j|fi|S)Nstdinstdoutstderr) subprocessPopenr)r argsr"r#r$kwargsr r r _callEsz Vtysh._callcCs2t|trdd|D}nd|g}|||||S)NcSsg|]}d|fD]}|qqS)-cr ).0subitemr r r Qz#Vtysh._call_cmd..r*) isinstancelistr))r commandr"r#r$r'r r r _call_cmdOs zVtysh._call_cmdcCs\|j|tjd}|\}}|dkrR|dur@||dtd|j|f|dS)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#rNUTF-8z)vtysh returned status %d for command "%s") r3r%PIPE communicatewaitappenddecoder returncode)r r2stdoutsprocr#r$r r r __call__Vs   zVtysh.__call__cCs&|d}d|vr"td|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)logerror)r outputr r r is_config_availablegs zVtysh.is_config_availablecCs,|d|g}|dkr(td|jdS)N-frz'vtysh (exec file) exited with status %d)r)r8rr;)r filenamechildr r r exec_filevs  zVtysh.exec_filecCs|jdd|gtjtjtjd}z|\}}Wn0tjy^||\}}tdYn0|dkr~td|j|f| dS)N-mrD)r#r"r$zvtysh call timed out!rz+vtysh (mark file) exited with status %d: %sr5) r)r%r6r7ZTimeoutExpiredkillrr8r;r:)r rEr"rFr#r$r r r mark_file}s&  zVtysh.mark_filecCsd}|r|d|7}|d7}|j|tjd}|jgd|jtjd}||\}}||jdkrxtd|j|jdkrtd |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 daemoncmdZshow_runZmarkr#r$r r r mark_show_runs,    zVtysh.mark_show_run)NNNN)NNN)NNN)N)N)N) rrrr!r)r3r>rCrGrJrNr r r r r8s   rc@s(eZdZdZddZddZddZdS) 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)keyslinesrdlines)r rPrQligner r r r!s zContext.__init__cCst|jdt|jS)Nz : )strrPrQr 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_liness zContext.add_linesN)rrr__doc__r!rVrWr r r r rOs rOcCsDddg}|D]2}t|d|}|r d||df}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\S*)z%s %sZesi)rematchgrouplower)lineZsub_strsZsub_strobjr r r get_normalized_es_idsr_cCs&|drt|Sd|vr"t|S|S)Nz evpn mh eszipv6 add) startswithr_get_normalized_ipv6_line)r]r r r get_normalized_mac_ip_lines  rbc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ 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)rQrcontextsr)r rr r r r!szConfig.__init__cCstd||j|}|dD]}|}d|}d|vrLt|}|ds`|drd|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 vrfexit-vrfendN) r@inforrJsplitstriprrbr`indexrQr9 load_contexts)r rEZ file_outputr]newlineZ vrf_indexZvrf_ctxr r r load_from_files0        zConfig.load_from_filecCs\td|j|}|dD].}|}|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 rLZ config_textr]r r r load_from_show_running,s  zConfig.load_from_show_runningcCs d|jS)zA Return the lines read in from the configuration re)rrQrUr r r get_linesDszConfig.get_linescCs(tt|jD]\}}tt|qdS)zL Return the parsed context as strings for display, log etc. N)sortedrrdprintrT)r _ctxr r r get_contextsJszConfig.get_contextsc CsL|sdStd|d}|rz|d}d|vrzz8t|dd}d|d t|j|j|d f|d<WntyxYn0td |d}|rP|d }d|vrz$t|dd}d t|j|jf}Wqty|}Yq0n|}|d}td|}|r(d|d |d |d|d f}d|d |d|d ||f|d<|r|d drg} |D]} td| } | r| d }d|vr|d dr|d}z6t|dd}dt|j|j| df} | | Wnty| | Yn0n | | qn| }|d dsH|d dr^d|dvr^t dd|d|d<|r|d drg} |D]L} | ds| drd| vrt dd| } | | n | | q|| }|rt ||j vrtt ||} | |j t |<n|j t |} | |n,t ||j vrHtt |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/Fstrictz%s route %s/%s%srkzA(ip|ipv6)\s+prefix-list(.*)(permit|deny)\s+([A-Fa-f:.0-9/]+)(.*)$%s/%sz(.*)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 %sip route ipv6 routeZnull0z\s+null0(\s*$)z Null0vrf rhri)rYrZr[rrTnetwork_address prefixlen ValueErrorsearchr`r9r,tuplerdrOrW) r keyrQZ re_key_rtaddrZnewaddrZ network_addrZlegestrZre_legenewlinesr]Zre_netr{r r r save_contextsQs                    zConfig.save_contextsc Cs6diiiiiiiidiiiiiiiiddiiidiidiiidiiiidiiiiid d d d iiid iiiiiidid}g}|g}g}|jD]~}|sq|ds|drq|drt|dkrq|||td||||g}q|drNt|dkr|||td||||g}qqd}|dD]l\}}||r^|dkrd|vrq|||d}||||g}td||q̐q^|rqt|dkrtd|||ggqtd||||qt|dkr2|||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 z vrf-policy z bmp targets zsegment-routing srv6r interface zmember pseudowire zkey z link-paramscandidate-path )pcczpce z pce-config )z segment-list policy pcepZlocatorszlocator )z traffic-engZsrv6)zpeer zprofile )z router bgp z router ripz router ripngz router isis zrouter openfabric z router ospfz router ospf6z router eigrp z router babelmpls ldpzl2vpn z key chain rrz pseudowire segment-routingznexthop-group z route-map zpbr-map ZrpkiZbfdline vty!#exitrzLINE %-50s: exit context %-50srnFZexplicitTzLINE %-50s: enter context %-50szLINE %-50s: single-line contextz(LINE %-50s: add to current context %-50sN) rQr`lenrr@debugpopr r9) r Z ctx_keywordsctx_keysZcur_ctx_keywordsZ cur_ctx_linesr]Znew_ctxkvr r r rss:    +              zConfig.load_contextsN) rrrrXr!rurvrwr|rrsr r r r rcs2{rccCsHg}|rt|D]\}}|d||q|}t|d}|r~|drj|d||ddfq|d||fn|||nt|ddD]\}}|dd||fq|r"|ddr|ddt|d|dddfn"|ddt|d|dfn"|ddt|d|df|S) z; Return the command as it would appear in frr.conf rfno z%s%srNz%sno %srrk) enumerater9lstriprr`)rr]deleterMiZctx_keyindentr r r lines_to_configs&  ,$"rc Csd}|d}|D]}d|vrd}d|vrbz$t|dd}dt|j|jf}Wnty`Yn0|szd t|}Wqty|}Yq0n|}|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~rz%s)rprrTrrrrrq)r]Z norm_linewordsZwordZ norm_wordZv6wordr r r ras,      raTcCs>|D]4\}}||kr|r(||kr8dSq||rdSqdS)NTFr`)rQZtarget_ctx_keysZ target_lineZ exact_matchrr]r r r line_exists  rcCsd}d}|D]j\}}|dkrB|d|krB|f}|||dfd}|ddrn|rn|dkrjd}|d}nd}|d7}q |D]*\}}|dkr|t|||r||||fq|||fS)NFrTrmrjrk)insertr`rremove) lines_to_add lines_to_delZ add_exit_vrfrrrr]Z prior_ctx_keyZ insert_keyr r r check_for_exit_vrfs&      rcCsd}d}|D]L\}}|ddr6|s6d|dvr6d}|ddr |s d|dvr d}q |r|r|D]B\}}|ddrf|sfd|dvrf|||f|||fqfdS)NFrrrjT)r`rr9)rZbgp_defult_instZ bgp_vrf_instrr]r r r bgp_delete_inst_move_lines,      rcCsNt}d}|D]\}}|ddr|r|dr|d|vrLt||d<td|}|r|d||dvrtdd||d|d<d}q|durdS|D]\}}|ddr|r|dr|d|vr||dD]}d |}t||}|rd||d|d <d |} t| |} | r| d||d|vr||d|d | dqqg} |D]\}}|ddrr|rr|drrd } t| |} | rr|d|vrr||dD]Z}||d|d dkr||d|d D]$}| d|kr| ||fqq̐qr| D]\}}|||fq0dS)NFrr neighbor neighbor (\S+) peer-group$rk)nbrremoteasTzneighbor %s remote-as (\S+)rzneighbor (\S+) peer-group %s$rzneighbor (\S+) remote-as.*) dictr`rYrZr[r1rr9r)rZpg_dictZ found_pg_cmdrr]re_pgpg_keyZpg_rmtasZ re_pg_rmtasnb_pg re_nbr_pgZlines_to_del_from_addZ nbr_rmtasZ re_nbr_rmtaspgrr r r bgp_delete_nbr_remote_as_linesr         $    rc Csg}|D]x\}}|ddr|r|dr|d|vr||dD]:}td|}d|}|sDt||}|rD|||fqDq|D]\}}|||fqdS)Nrrr!neighbor (\S+) .*peer-group (\S+)neighbor %s .*)r`rYrr9r) r del_nbr_dictlines_to_del_to_delrr]rrnb_expre_nbr r r bgp_remove_neighbor_cfgrs$      rcCsBt|t}t}g}g}d}|D]\}}|ddr$|r$|dr$d} t| |} | rl|||ftd|} | r|d|vrt||d<| d||dvr||d| d|d|vrt||d<td|} | r$| d||dvr$t||d| d<d }q$|dkrLt ||rDt ||||fS|D]&\}}| ||f|||fqP|D]\}}|ddr||r||dr||d|vr|||dD]X} d | }t||} | r| d||d| vr||d| | dqq|g}|D]\}}|ddr&|r&|dr&|d|vr&||dD]x}||d|D]8}d |}t||}|r~||vr~|||fq~d |}t||} | rj|||fqjq&|D]\}}| ||fq|D]&\}}| ||f|||fq t |||fS) NFrrrz neighbor (\S+) .*remote-as (\S+)rrkrTzneighbor (\S+) .*peer-group %s$rzneighbor %s peer-group$) rrr`rYrr9r1r[rZrrr)rrZdel_dictrrZlines_to_del_to_appZfound_pg_del_cmdrr]Z nb_remoteasZre_nb_remoteasrrrrrrrrZpg_expr r r delete_move_liness0            $      rc= Cs g}g}|D]x\}}d}|rdd|vrd|D]6\}}|d|dkr*|r*d|vr*|||fq q*q |ddr|r|drVtd|} td|} | s| rd} d} | r| d} | d }d | } n | r| d} | d }d | } d | |f} t||| }t||| }tt|}|szt|}|d t|}t||| }|szt|}|dt|}t||| }|r|rd}|||f||| f||| ftd|}|r4|d}d|}|d}|D]N\}}|ddrt||}|rt|||d}|r|||fqtd|}|rzd}|d}|d }|d}d||f}d}|D]\}}|ddr||rt||} | r|| d}!|!|krĐq|t|dkr|}d}n.)Zagentxz frr versionz frr defaultsusernamepasswordrzservice integrated-vtysh-configz"%s" cannot be removedr)anyr@ror9r)rrrr]r rr ignore_unconfigurable_liness   rcCsg}g}g}g}g}g}g}d} t|jD]\} } | |jvr*d| dvrjt| dkrjd} || dfq*| dds| ddr| jD]} || | fqq*d| dvrt| dkr| rq*q*d| dvrt| d kr| dd r| d d r|| dfq*d| dvrXt| dkrX| dd rX| jD]} || | fq@q*| dd sx| ddrd| df} || dfq*t| d kr| ddr| dd r| dd df|vrq*q*t| dkr&| ddr&| ddr&| dddf|vr&q*q*| ddrHt| dkrHq*q*t| dkrz| ddrz| d drzq*q*t| dkr| ddr| d dr|| dfq*t| dkr| ddr| d dr|| dfq*t| dkr4| ddr4| ddr4|| dfq*t| dkrr| ddrr| ddrr|| dfq*| rtdd| Ds|| dfq*| rtdd| Ds|| dfq*| jD]} || | fqq*t|dkr||t|dkr||t|dkr,||t|dkrD||t|jD]\}}||jvrN|j|} |jD]j} | | jvrrt|dkr|ddr|d dr| dr||| fn||| fqr| jD] } | |jvr||| fqqNt|jD]\}}||jvrt|dkr|ddr|dd r||df|jD]} ||| fqjn*||df|jD]} ||| fqqt|dkr||t ||\}}t ||\}}t ||\}}t ||\}}||fS)!z> Create a context diff for the two specified contexts FrrrkTNZ interfacerjrlrraddress-familyrrrrZl2vpnzmember pseudowirerrrz segment-listZpolicyrz pce-configrcss|]}d|vVqdS)rNr r+rr r r sz*compare_context_objects..css|]}d|vVqdS)rNr rr r r rr/rrzcandidate-path) rrdrr9r`rQrrrRrrrr)newconfrunningrrZpollist_to_delZseglist_to_delZpceconf_to_delZpcclist_to_delZcandidates_to_addZ delete_bgpdZrunning_ctx_keysZ running_ctxr]rZnewconf_ctx_keysZ newconf_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)actionrdefaultz--testzShow the deltasz--debugz-Enable debugs (synonym for --log-level=debug)z --log-levelz Log levelro)ZcriticalrAwarningror)rrchoicesz--stdoutz Log to STDOUTz --pathspacerNAMEzReload specified path/namespace)metavarrrrEzLocation of new frr config filez --overwritez-Overwrite frr.conf with running config outputz--bindirzpath to the vtysh executablez/usr/bin)rrz --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)rrz'%(asctime)s %(levelname)5s: %(message)s)formatz  %sz %sz /var/log/frr/i)modez/var/log/frr/frr-reload.log)rErzMust 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.confrz"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===============rcCsg|] }|qSr rqrr r r r.r/r.cCs g|]}d|vrd|vr|qS)rzlog filer rr r r r.srez Lines To Addz ============cCsg|]}|r|qSr rrr r r r.r/zNew Frr Config %srlz Running Frr Config (Pass #%d) %sr?zFailed to execute %srfrz%"%s" we failed to remove this commandz -- z Executed "%s"rccs$|]}ttjtjVqdSr)randomZ SystemRandomchoicestringZascii_uppercasedigits)r+rzr r r rs rrz/reload-%s.txtz %s content %swzfrr-reload.py failed due to %sz /frr.confwrite)T)rXZ __future__rrargparseZloggingrZos.pathrrYrr%sys collectionsr ipaddressrrZpprintrrZ getLoggerrr@ ExceptionrobjectrrOr_rbrcrrarrrrrrrrrArgumentParserparser add_argumentadd_mutually_exclusive_groupr[Z level_group parse_argsr'testr#Z basicConfigZ addLevelNameZERRORZ getLevelNameZWARNINGreloadrisdirmakedirsrZsetLevelDEBUGZ log_levelupperZ StreamHandlerZ stdout_hdlrZ setFormatterZ FormatterZ addHandlerisfilerErArgetsizerrZ vty_socketrLmsgryrrZvtysh_filenameZservice_integrated_vtysh_configopenZfh readlinesr]rqrorTrruZ reload_okverrinputrvrrZ test_resetrZnolinesrrMrQZlines_to_configurerCrwZlines_to_add_first_passrangerrZ original_cmdr<rpZlast_argrZ new_last_argr`r9Z random_stringZrundirrrGerunlinktargetZ overwriter r r r s2    v)  ,!   T00#n          $         *             %            2