PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/proc/self/root/lib/frr/__pycache__/
Upload File :
Current File : //proc/self/root/lib/frr/__pycache__/frr-reload.cpython-39.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