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__/ospfclient.cpython-39.opt-1.pyc
a

��sgq��@sBddlZddlZddlZddlZddlZddlZddlZddlmZmZddl	m
ZdZe�
e�ZdZdZdZdZdZe�
e�ZdZdZd	Zd
ZdZdZd
ZdZdZdZedededefedefeddedd�fedededededi
ZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*e!d&e"d'e#d(d)edd�fe$d*d)edd�fe%d+e&d,e'd-e(d.e)d/e*d0i
Z+dZ,d1Z-d2Z.d3Z/d4Z0d5Z1d6Z2d7Z3d8Z4d9Z5d:Z6e,d;e-d<e.d=e/d>e0d?e1d@e2dAe3dBe4dCe5dDe6dEiZ7iZ8e8�9e�e8�9e+�dFdG�e8�:�D�Z;dHdG�e8�:�D�Z<dIdG�e<�:�D�Z=dJdK�Z>dLdM�Z?GdNdO�dOe@�ZAGdPdQ�dQe@�ZBGdRdS�dSe@�ZCdZDdZEdZFd	ZGd
ZHdZIdZJd
ZKdZLdZMdZNdZOdTdU�ZPdZQdZRdZSd	ZTd
ZUdZVdZWd
ZXdVdW�ZYdZZdZ[dZ\d	Z]d
Z^dZ_dZ`d
ZadZbdZcdXdY�ZdGdZd[�d[�ZeGd\d]�d]�ZfGd^d_�d_ef�Zgdgd`da�Zhdbdc�Ziddde�Zjekdfk�r>ej�Zle�mel�dS)h�N)�Event�Lock)�
ip_addressz>BBHLz>HBB��z	>HBBIILHH�������	�)ZREGISTER_OPAQUETYPE�BBxx)ZUNREGISTER_OPAQUETYPErZREGISTER_EVENTZ	SYNC_LSDBZORIGINATE_REQUEST�>II)ZDELETE_REQUESTz>IBBxBL)�MSG_SYNC_REACHABLE�)�MSG_SYNC_ISMr)�MSG_SYNC_NSMr)�MSG_SYNC_ROUTER_IDr�
���
������)ZREPLYZbxxx)ZREADY_NOTIFYz>BBxxIZLSA_UPDATE_NOTIFY�>IIBxxxZLSA_DELETE_NOTIFY)ZNEW_IFr)ZDEL_IF�>I)Z
ISM_CHANGEr )Z
NSM_CHANGEz>IIIBxxx)ZREACHABLE_CHANGEz>HH)ZROUTER_ID_CHANGEr!���������������i����i����i����i����i�����OSPF_API_OK�OSPF_API_NOSUCHINTERFACE�OSPF_API_NOSUCHAREA�OSPF_API_NOSUCHLSA�OSPF_API_ILLEGALLSATYPE�OSPF_API_OPAQUETYPEINUSE� OSPF_API_OPAQUETYPENOTREGISTERED�OSPF_API_NOTREADY�OSPF_API_NOMEMORY�OSPF_API_ERROR�OSPF_API_UNDEFcCsi|]\}}||d�qS)r���.0�k�vr2r2�/usr/lib/frr/ospfclient.py�
<dictcomp>��r8cCsi|]\}}||d�qS)rr2r3r2r2r7r8�r9cCsi|]\}}|t�|��qSr2)�struct�calcsizer3r2r2r7r8�r9cCst�|t|��S�N)�msg_name�get�str)�mtr2r2r7�api_msgname�srAcCst�|t|��Sr<)�msg_errnamer>r?)�ecoder2r2r7�api_errname�srDc@seZdZdS)�APIErrorN��__name__�
__module__�__qualname__r2r2r2r7rE�srEc@seZdZdS)�MsgTypeErrorNrFr2r2r2r7rJ�srJc@seZdZdS)�SeqNumErrorNrFr2r2r2r7rK�srKcCs@tdtdtdtdtdtdtdtdtd	t	d
t
di}|�|t|��S)Nz
LSA:ROUTERzLSA:NETWORKzLSA:SUMMARYzLSA:ASBR_SUMMARYzLSA:AS_EXTERNALzLSA:GROUP_MEMBERzLSA:AS_NSSAzLSA:EXTERNAL_ATTRIBUTESzLSA:OPAQUE_LINKzLSA:OPAQUE_AREAz
LSA:OPAQUE_AS)
�LSA_TYPE_ROUTER�LSA_TYPE_NETWORK�LSA_TYPE_SUMMARY�LSA_TYPE_ASBR_SUMMARY�LSA_TYPE_AS_EXTERNAL�LSA_TYPE_GROUP_MEMBER�LSA_TYPE_AS_NSSA�LSA_TYPE_EXTERNAL_ATTRIBUTES�LSA_TYPE_OPAQUE_LINK�LSA_TYPE_OPAQUE_AREA�LSA_TYPE_OPAQUE_ASr>r?)�lsa_type�namesr2r2r7�lsa_typename�s�
rYcCs4tdtdtdtdtdtdtdtdi}|�|t	|��S)	N�ISM_DEPENDUPON�ISM_DOWN�ISM_LOOPBACK�ISM_WAITING�ISM_POINTTOPOINT�ISM_DROTHER�
ISM_BACKUP�ISM_DR)
rZr[r\r]r^r_r`rar>r?��staterXr2r2r7�ism_name�s�
rdcCs<tdtdtdtdtdtdtdtdtd	t	d
i
}|�
|t|��S)N�NSM_DEPENDUPON�NSM_DELETED�NSM_DOWN�NSM_ATTEMPT�NSM_INIT�
NSM_TWOWAY�NSM_EXSTART�NSM_EXCHANGE�NSM_LOADING�NSM_FULL)rerfrgrhrirjrkrlrmrnr>r?rbr2r2r7�nsm_name�s�roc@s eZdZdZdd�Zdd�ZdS)�WithNothingz<An object that does nothing when used with `with` statement.c�sdSr<r2��selfr2r2r7�
__aenter__szWithNothing.__aenter__c�sdSr<r2)rr�args�kwargsr2r2r7�	__aexit__szWithNothing.__aexit__N)rGrHrI�__doc__rsrvr2r2r2r7rpsrpc@s�eZdZdd�Zedd��Zd-dd�Zd	d
�Zdd�Ze	d
d��Z
dd�Zdd�Zed.dd��Z
dd�Zdd�Zd/dd�Zdd�Zedd ��Zed!d"��Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�ZdS)0�
OspfApiClientcCsd�|j�S)NzOspfApiClient({}))�format�serverrqr2r2r7�__str__szOspfApiClient.__str__cCs�t�tjtjd�}z�|�tjtjd�|�d|f�t�tjtjd�}z0|�tjtjd�|�d|df�||fWWSty�|���Yn0Wnty�|���Yn0dS)Nrrr)	�socketZAF_INETZSOCK_STREAMZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbind�	Exception�close)�port�s1�s2r2r2r7�_get_bound_socketssz OspfApiClient._get_bound_sockets�	localhostNcCs�d|_d|_d|_d|_d|_|_|_||_|dur<|nt�|_	t
�|_d}d}t||dd�D]�}z0t
�d|||d�|�|�\|_|_Wq�Wqdty�}zF|jtjks�||kr�t
�d|||��t
�d	|||d�WYd}~qdd}~00qddS)
afA client connection to OSPF Daemon using the OSPF API

        The client object is not created in a connected state.  To connect to the server
        the `connect` method should be called.  If an error is encountered when sending
        messages to the server an exception will be raised and the connection will be
        closed.  When this happens `connect` may be called again to restore the
        connection.

        Args:
            server: hostname or IP address of server default is "localhost"
            handlers: dict of message handlers, the key is the API message
                type, the value is a function. The functions signature is:
                `handler(msg_type, msg, msg_extra, *params)`, where `msg` is the
                message data after the API header, `*params` will be the
                unpacked message values, and msg_extra are any bytes beyond the
                fixed parameters of the message.
        Raises:
            Will raise exceptions for failures with various `socket` modules
            functions such as `socket.socket`, `socket.setsockopt`, `socket.bind`.
        rNi�i��rz%s: binding to ports %s, %srz%s: binding port %s error %sz%s: ports %s, %s in use.)�_seq�_s�_as�_ls�_ar�_r�_wrz�dict�handlersr�
write_lock�range�logging�debugr��OSError�errnoZ
EADDRINUSE�warning)rrrzr�Z	PORTSTARTZPORTENDr�errorr2r2r7�__init__)s*
,zOspfApiClient.__init__c�s�t�d|�t��}|j��zNt�d|�|�|j|jdf�IdHt�d|�|�	|j�IdH\|_
}Wn"ty�|��IdH�Yn0t�d|�tj
|jd�IdH\|_|_tj
|j
d�IdH\|_}d|_dS)Nz%s: connect to OSPF APIz$%s: connecting sync socket to serveri/
z!%s: accepting connect from serverz%s: success)Zsockr)r�r��asyncio�get_event_loopr�ZlistenZsock_connectr�rzZsock_acceptr�r}�
_close_lockedZopen_connectionr�r�r�r�)rr�loop�_r2r2r7�_connect_lockedWs
zOspfApiClient._connect_lockedc	�sL|j4IdH�$|��IdHWd�IdHqH1IdHs>0YdSr<)r�r�rqr2r2r7�connectlszOspfApiClient.connectcCs
|jdkS)z!True if the connection is closed.r)r�rqr2r2r7�closedpszOspfApiClient.closedc�s�t�d|�|jrP|jr:|j��|j��IdHd|_n
|j��d|_d|_|jrl|j��d|_d|_|j	r�|j	��d|_	d|_
dS)Nz%s: closingr)r�r�r�r�r~Zwait_closedr�r�r�r�r�rqr2r2r7r�us"



zOspfApiClient._close_lockedc	�sL|j4IdH�$|��IdHWd�IdHqH1IdHs>0YdSr<)r�r�rqr2r2r7r~�szOspfApiClient.closer"c�s�z�|�t�IdH}t�t|�\}}}}|dkr<td�|���|dkrRt�d|�n||krjt	d�||���|r~|�|�IdHnd}||fWSt
jy�t�Yn0dS)aWRead an OSPF API message from the socket `r`

        Args:
            r: socket to read msg from
            expseq: sequence number to expect or -1 for any.
        Raises:
            Will raise exceptions for failures with various `socket` modules,
            Additionally may raise SeqNumError if unexpected seqnum is received.
        Nrz'received unexpected OSPF API version {}r"z&_msg_read: got seq: 0x%x on async read�rx {} != {}r9)
Zreadexactly�FMT_APIMSGHDR_SIZEr:�unpack�
FMT_APIMSGHDRr}ryr�r�rKr�ZIncompleteReadError�EOFError)�rZexpseq�mhr6r@�l�seq�msgr2r2r7�	_msg_read�s
zOspfApiClient._msg_readc�st�|jd�IdHS)z�Read a message from the async notify channel.

        Raises:
            May raise exceptions for failures with various `socket` modules.
        r"N)rxr�r�rqr2r2r7�msg_read�szOspfApiClient.msg_readc	�st�d|t|�|j�t�td|t|�|j�}|j}|d|_z�|j4IdH�N|j	�
||�|j	��IdHt�
|j|�IdH\}}Wd�IdHq�1IdHs�0Y|tkr�td�t|�tt����t�tt|�dWSt�y
|��IdH�Yn0dS)a
Send a message to OSPF API and wait for error code reply.

        Args:
            mt: the messaage type
            mp: the message payload
        Returns:
            error: an OSPF_API_XXX error code, 0 for OK.
        Raises:
            Raises SeqNumError if the synchronous reply is the wrong sequence number;
            MsgTypeError if the synchronous reply is not MSG_REPLY. Also,
            may raise exceptions for failures with various `socket` modules,

            The connection will be closed.
        zSEND: %s: sending %s seq 0x%xrNr�r)r�r�rAr�r:�packr��lenr�r��writeZdrainrxr�r��	MSG_REPLYrJryr��msg_fmtr}r~)rrr@�mpr�r�r2r2r7�msg_send�s"
B�zOspfApiClient.msg_send�c�s2|�||�IdH}|r.td�t|�t|����dS)a�Send a message to OSPF API and wait for error code reply.

        Args:
            mt: the messaage type
            mp: the message payload
        Raises:
            APIError if the server replies with an error.

            Also may raise exceptions for failures with various `socket` modules,
            as well as MsgTypeError if the synchronous reply is incorrect.
            The connection will be closed for these non-API error exceptions.
        Nz{} error {})r�rEryrArD)rrr@r�rCr2r2r7�msg_send_raises�s
zOspfApiClient.msg_send_raisesc�s�|tvrt�d||�dSt|}t|}t�||d|��}||d�}||jvrjt�d|t|��dSt�d|t|��|j||||g|�R�IdHdS)Nz#RECV: %s: unknown async msg type %sz%RECV: %s: no handlers for msg type %sz RECV: %s: calling handler for %s)r�r�r��msg_sizer:r�r�rA)rrr@r��fmtZsz�tup�extrar2r2r7�handle_async_msg�s

�zOspfApiClient.handle_async_msgcGs&|sdSd}|D]}|d|>O}q|S)z.Return a 16 bit mask for each LSA type passed.i��rrr2)�	lsa_types�mask�tr2r2r7�
lsa_type_mask�szOspfApiClient.lsa_type_maskcCs@tj|�}t|�}t|r"d�|�nd}tj||||g|�R�S)z�Return an LSA filter.

        Return the filter message bytes based on `origin` the `areas` list and the LSAs
        types in the `lsa_types` list.
        z{}Ir)rxr�r��FMT_LSA_FILTERryr:r�)�originZareasr�r�Znarear�r2r2r7�
lsa_filters
zOspfApiClient.lsa_filterc�sNt�d|�t�tgg�}|�t|�IdHt�d|�|�t|�IdHdS)zHRegister for all LSA notifications and request an LSDB synchronoization.zSEND: %s: request LSDB eventsNzSEND: %s: request LSDB sync)r�r�rxr��LSAF_ORIGIN_ANYr��MSG_REGISTER_EVENT�
MSG_SYNC_LSDB)rrr�r2r2r7�
req_lsdb_syncs
zOspfApiClient.req_lsdb_syncc�s t�d|�|�t�IdHdS)z(Request a dump of all reachable routers.z#SEND: %s: request reachable changesN)r�r�r�rrqr2r2r7�req_reachable_routerssz#OspfApiClient.req_reachable_routersc�s t�d|�|�t�IdHdS)z;Request a dump of the current ISM states of all interfaces.zSEND: %s: request ISM changesN)r�r�r�rrqr2r2r7�req_ism_states"szOspfApiClient.req_ism_statesc�s t�d|�|�t�IdHdS)�:Request a dump of the current NSM states of all neighbors.zSEND: %s: request NSM changesN)r�r�r�rrqr2r2r7�req_nsm_states'szOspfApiClient.req_nsm_statesc�s t�d|�|�t�IdHdS)r�z SEND: %s: request router ID syncN)r�r�r�rrqr2r2r7�req_router_id_sync,sz OspfApiClient.req_router_id_sync)r�N)r")r�)rGrHrIr{�staticmethodr�r�r�r��propertyr�r�r~r�r�r�r�r�r�r�r�r�r�r�r�r2r2r2r7rxs2

.
&



	rxcs�eZdZdZd6�fdd�	Zdd�Zdd	�Zed
d��Zedd
��Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd7dd �Zd!d"�Zd8d$d%�Zd&d'�Zd9d(d)�Zd*d+�Zd:d,d-�Zd;d.d/�Zd<d0d1�Zd=d2d3�Zd>d4d5�Z�ZS)?�OspfOpaqueClientaPA client connection to OSPF Daemon for manipulating Opaque LSA data.

    The client object is not created in a connected state.  To connect to the server
    the `connect` method should be called.  If an error is encountered when sending
    messages to the server an exception will be raised and the connection will be
    closed.  When this happens `connect` may be called again to restore the
    connection.

    Args:
        server: hostname or IP address of server default is "localhost"
        wait_ready: if True then wait for OSPF to signal ready, in newer versions
            FRR ospfd is always ready so this overhead can be skipped.
            default is False.

    Raises:
        Will raise exceptions for failures with various `socket` modules
        functions such as `socket.socket`, `socket.setsockopt`, `socket.bind`.
    r�Fcs�t|jt|jt|jt|jt|jt|j	t
|jt|j
i}|rB|j|t<t��||�||_|r`t�nt�|_tititii|_td�|_d|_i|_d|_i|_t �|_!d|_"i|_#i|_$d|_%i|_&d|_'dS)Nr)(�MSG_LSA_UPDATE_NOTIFY�_lsa_change_msg�MSG_LSA_DELETE_NOTIFY�
MSG_NEW_IF�_if_msg�
MSG_DEL_IF�MSG_ISM_CHANGE�_if_change_msg�MSG_NSM_CHANGE�_nbr_change_msg�MSG_REACHABLE_CHANGE�_reachable_msg�MSG_ROUTER_ID_CHANGE�_router_id_msg�
_ready_msg�MSG_READY_NOTIFY�superr��
wait_readyrrp�
ready_lockrTrUrV�
ready_cond�ip�	router_id�router_id_change_cbZlsid_seq_num�
lsa_change_cb�opaque_change_cb�set�reachable_routers�reachable_change_cb�if_area�
ism_states�
ism_change_cb�
nsm_states�
nsm_change_cb)rrrzr�r���	__class__r2r7r�Fs<�

�
zOspfOpaqueClient.__init__c	�s�|j4IdH�t|j|�|�}t�dt|�|�t}t�t	|||�}|�
||�IdH|jsnd|j||<Wd�IdHq�1IdHs�0YdS)Nzregister %s opaque-type %sT)r�r�r>r�r�rY�MSG_REGISTER_OPAQUETYPEr:r�r�r�r�)rrrW�otype�condr@r�r2r2r7�_register_opaque_dataosz&OspfOpaqueClient._register_opaque_datac�s|zXt�d�|��IdH\}}|tvr:|�||�IdHqt|�}t�d|t|��qWntyvt�	d�YdS0dS)Nz entering async msg handling loopz#ignoring unexpected msg: %s len: %s�3Got EOF from OSPF API server on async notify socketr)
r�r�r��	amsg_infor�rAr�r�r��info)rrr@r�Zmtsr2r2r7�_handle_msg_loop�s

�

z!OspfOpaqueClient._handle_msg_loopc
Cs(|d>|B}dd||dddtt|�fS)N�r)�FMT_LSA_HEADER_SIZEr�)rWr��oidr�Zlsidr2r2r7�_opaque_args�szOspfOpaqueClient._opaque_argscCs*tjtgt�||||��R�}||7}|Sr<)r:r��FMT_LSA_HEADERr�r�)rWr�r�r��lsar2r2r7�_make_opaque_lsa�s��z!OspfOpaqueClient._make_opaque_lsac
	�s�|tkrd�t|��}n|tkr0d�t|��}nd}t�d|t|�||�|j4IdH�4|j|�	|�}d|j||<Wd�IdHq�1IdHs�0Y|dur�t�
dt|�|�n|r�|D]}	|	��q�dS)Nz	ifaddr {}zarea {}rz-RECV: %s ready notify for %s opaque-type %s%sTz.RECV: dup ready received for %s opaque-type %s)rTryr�rUr�r�rYr�r�r>r�r�)
rrr@r�r�rWr��addr�er��evtr2r2r7r��s0�	8�zOspfOpaqueClient._ready_msgc�s@|tkr|\}}n|dd}}t�dt|�t|�t|��dS)NrzRECV: %s ifaddr %s areaid %s)r�r�r�rAr�)rrr@r�r�rt�ifaddr�aidr2r2r7r��s
�zOspfOpaqueClient._if_msgc�sVt|�}t|�}t�dt|�||t|��||j|<||j|<|jrR|�|||�dS)Nz%RECV: %s ifaddr %s areaid %s state %s)r�r�r�rArdr�r�r�)rrr@r�r�rrrcr2r2r7r��s�

zOspfOpaqueClient._if_change_msgc	�stt|�}t|�}t|�}t�dt|�|||t|��||jvrHi|j|<||j|||f<|jrp|�||||�dS)Nz3RECV: %s ifaddr %s nbraddr %s router_id %s state %s)r�r�r�rAror�r�)rrr@r�r�rZnbraddrr�rcr2r2r7r��s �	

z OspfOpaqueClient._nbr_change_msgc	�s�|\}}	}
}}	}}	}
|d?d@}|tkr.d}nd}t�d|t|�t|�||
|�|
|f}t|t}||d�}||jvr�|j|||||||�|jr�|�||||||�dS)Nr���update�deletez=RECV: LSA %s msg for LSA %s in area %s seq 0x%x len %s age %s)r�r�r�r�r�r�r�r�)rrr@r�r�rrZis_selfZ	ls_headerZlsa_ager�rWZls_idZls_seqZls_lenr��ts�idxZpre_lsa_sizer�r2r2r7r��s<
��	
z OspfOpaqueClient._lsa_change_msgc�s�t�d�||�|�}dd�|D�}t�dt|�|d|�||d��|jt|d|��O_|jt||d��8_t�dt|�|j�|jr�t�dt|��|�|d|�||d��IdHdS)Nz>{}IcSsg|]}t|��qSr2)r�)r4�xr2r2r7�
<listcomp>r9z3OspfOpaqueClient._reachable_msg.<locals>.<listcomp>zRECV: %s added %s removed %szRECV: %s new set %s�RECV: %s calling callback)	r:r�ryr�r�rAr�r�r�)rrr@r�r�ZnaddZnremoveZ
router_idsr2r2r7r�s

�zOspfOpaqueClient._reachable_msgc�srt|�}t�dt|�|�|j}||kr,dS||_t�dt|�||�|jrnt�dt|��|�||�IdHdS)NzRECV: %s router ID %sz,RECV: %s new router ID %s older router ID %sr	)r�r�r�rAr�r�)rrr@r�r�r�Z
old_router_idr2r2r7r�(s�zOspfOpaqueClient._router_id_msgc
�s�|tkrt|�d}}n |tkr0dt|�}}nd\}}t}tjt|||gt�||||��R�}	|	|7}	|�	||	�IdHdS)a�Add an instance of opaque data.

        Add an instance of opaque data. This call will register for the given
        LSA and opaque type if not already done.

        Args:
            addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type
            oid: (3 octets) ID of this opaque data
            data: the opaque data
        Raises:
            See `msg_send_raises`
        r)rrN)
rT�intrU�MSG_ORIGINATE_REQUESTr:r�r�r�r�r�)
rrr�rWr�r��datarrr@r�r2r2r7�add_opaque_data;s��z OspfOpaqueClient.add_opaque_datarc�s6t}t�t|t|�||||�}|�||�IdHdS)a7Delete an instance of opaque data.

        Delete an instance of opaque data. This call will register for the given
        LSA and opaque type if not already done.

        Args:
            addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            oid: (3 octets) ID of this opaque data
            flags: (octet) optional flags (e.g., OSPF_API_DEL_ZERO_LEN_LSA, defaults to no flags)
        Raises:
            See `msg_send_raises`
        N)�MSG_DELETE_REQUESTr:r�r�r
r�)rrr�rWr�r��flagsr@r�r2r2r7�delete_opaque_data^sz#OspfOpaqueClient.delete_opaque_datac	�sV|j4IdH�.|j�|i��|�duWd�IdHS1IdHsH0YdS)aXDetermine if an (lsa_type, otype) tuple has been registered with FRR

        This determines if the type has been registered, but not necessarily if it is
        ready, if that is required use the `wait_opaque_ready` metheod.

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
        N)r�r�r>)rrrWr�r2r2r7�
is_registeredss
zOspfOpaqueClient.is_registeredNc�sV|r||j||f<n,||f|jvr@t�dt|�|�|j||f=|�||�IdHdS)a�Register intent to advertise opaque data.

        The application should wait for the async notificaiton that the server is
        ready to advertise the given opaque data type. The API currently only allows
        a single "owner" of each unique (lsa_type,otype). To wait call `wait_opaque_ready`

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            callback: if given, callback will be called when changes are received for
                LSA of the given (lsa_type, otype). The callbacks signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    data: the opaque data that follows the LSA header
                    lsa: the octets of the full lsa
        Raises:
            See `msg_send_raises`
        z=OSPFCLIENT: register: removing callback for %s opaque-type %sN)r�r�r�rYr��rrrWr��callbackr2r2r7�register_opaque_data�s�z%OspfOpaqueClient.register_opaque_datac	�s�|j4IdH�||j|�|�}|dur>Wd�IdHdSt�dt|�|�|sfg}|j||<t�}|�|�Wd�IdHq�1IdHs�0Y|��IdHt�dt|�|�dS)NTz#waiting for ready %s opaque-type %szREADY for %s opaque-type %s)	r�r�r>r�r�rYr�append�wait)rrrWr�r�r�r2r2r7�wait_opaque_ready�s
�4z"OspfOpaqueClient.wait_opaque_readyc�s*|�|||�IdH|�||�IdHdS)a�Register intent to advertise opaque data and wait for ready.

        The API currently only allows a single "owner" of each unique (lsa_type,otype).

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            callback: if given, callback will be called when changes are received for
                LSA of the given (lsa_type, otype). The callbacks signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    data: the opaque data that follows the LSA header
                    lsa: the octets of the full lsa
        Raises:

            See `msg_send_raises`
        N)rrrr2r2r7�register_opaque_data_wait�sz*OspfOpaqueClient.register_opaque_data_waitc�sF||f|jvr|j||f=t}t�t|||�}|�||�IdHdS)aBUnregister intent to advertise opaque data.

        This will also cause the server to flush/delete all opaque data of
        the given (lsa_type,otype).

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
        Raises:
            See `msg_send_raises`
        N)r��MSG_UNREGISTER_OPAQUETYPEr:r�r�r�)rrrWr�r@r�r2r2r7�unregister_opaque_data�s
z'OspfOpaqueClient.unregister_opaque_datac�s||_|��IdHdS)a�Monitor changes to LSAs.

        Args:
            callback: if given, callback will be called when changes are received for
                any LSA. The callback signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, extra, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    extra: the octets that follow the LSA header
                    lsa: the octets of the full lsa
        N)r�r��rrrr2r2r7�monitor_lsa�szOspfOpaqueClient.monitor_lsac�s||_|��IdHdS)a*Monitor the set of reachable routers.

        The property `reachable_routers` contains the set() of reachable router IDs
        as integers. This set is updated prior to calling the `callback`

        Args:
            callback: callback will be called when the set of reachable
                routers changes. The callback signature is:

                `callback(added, removed)`

                Args:
                    added: list of integer router IDs being added
                    removed: list of integer router IDs being removed
        N)r�r�rr2r2r7�monitor_reachablesz"OspfOpaqueClient.monitor_reachablec�s||_|��IdHdS)a�Monitor the state of OSPF enabled interfaces.

        Args:
            callback: callback will be called when an interface changes state.
                The callback signature is:

                `callback(ifaddr, area_id, state)`

                Args:
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    state: ISM_*
        N)r�r�rr2r2r7�monitor_ismszOspfOpaqueClient.monitor_ismc�s||_|��IdHdS)aMonitor the state of OSPF neighbors.

        Args:
            callback: callback will be called when a neighbor changes state.
                The callback signature is:

                `callback(ifaddr, nbr_addr, router_id, state)`

                Args:
                    ifaddr: integer identifying an interface (by IP address)
                    nbr_addr: integer identifying neighbor by IP address
                    router_id: integer identifying neighbor router ID
                    state: NSM_*
        N)r�r�rr2r2r7�monitor_nsm(szOspfOpaqueClient.monitor_nsmc�s||_|��IdHdS)a�Monitor the OSPF router ID.

        The property `router_id` contains the OSPF urouter ID.
        This value is updated prior to calling the `callback`

        Args:
            callback: callback will be called when the router ID changes.
                The callback signature is:

                `callback(new_router_id, old_router_id)`

                Args:
                    new_router_id: the new router ID
                    old_router_id: the old router ID
        N)r�r�rr2r2r7�monitor_router_id:sz"OspfOpaqueClient.monitor_router_id)r�F)r)N)N)N)N)N)N)N)rGrHrIrwr�r�r�r�r�r�r�r�r�r�r�r�r�r
rrrrrrrrrrr �
__classcell__r2r2r�r7r�2s6)

 
(#

)




r�ccs4|r|D]
}|Vqntd�}|s$q0|��VqdS)z"Get next action from list or STDINrN)�input�strip)Zaction_list�actionr2r2r7�next_actionQs
r%c
�s*t|j�}|��IdH�z�tjddkr:t�|���nt���|���|�	�IdH|�
�IdH|��IdH|��IdHt
|j�D�]�}|�d�}|�d�}|��dkr�t|�d��}t�d|�t�|�IdHt�d|�q�t|�d��}|dk�rtd	�}n8|�d�}ztt|��}Wnt�yDt|�}Yn0||t|�d��t|�d��g}	|�|	d|	d
�IdH�s�|�|	d|	d
�IdH|��dk�r6zt�|�d��}
Wnt�y�d}
Yn0t�d
t|
��t|
�d}|�r|
dd|7}
t�dt|
��|jg|	�|
�R�IdHq�d	}t|�dk�rtzt|�d��}Wnt�yrd	}Yn0|jg|	�|�R�IdHq�|j�r�|j �r�Wd	SWn8t!�y�}
ztj"d|
dd�WYd}
~
d
Sd}
~
00z"t�d�t�d�IdH�q�Wn t#�y$t�d�Yd
S0dS)Nrr
�,Frzwaiting %s secondszwait complete: %s secondsrrr�addr9zopaque data is %s octetsr�zopaque padding to %s octetsz async_main: unexpected error: %sT��exc_infozSleeping forever�xr�)$r�rzr��sys�version_infor�Zcreate_taskr�r�r�r�r�r�r%�actions�split�pop�casefoldr
r�r��sleepr��
ValueErrorrr�bytes�fromhex�
IndexErrorr�r
r�exitr}r�r�)rt�cr$r�ZwhatZstimeZltyper�ZavalZoargs�b�mod�fr�r2r2r7�
async_main^sv





 




r<c
GsLt�|�}|jdddd�|jdddd�|jd	d
dd�|jdd
ddd�|jdddd�|��}|jrptjntj}tj|d�	|j
�d�t�d�d}zPtj
ddkr�t�t|��}n.t��}z|�t|��}W|��n
|��0WnRt�yt�d�Yn@t�y<}ztjd|dd�WYd}~nd}~00t�d�|S)Nz--logtagZCLIENTztag to identify log messages)�default�helpz--exit�
store_truezExit after commands)r$r>z--serverr�zOSPF API serverz-vz	--verbosez
be verboser.�*z?WAIT,SEC|(ADD|DEL),LSATYPE,[ADDR,],OTYPE,OID,[HEXDATA|DEL_FLAG])�nargsr>z3%(asctime)s %(levelname)s: {}: %(name)s %(message)s)�levelryzospfclient: startingrrr
z+Exiting, received KeyboardInterrupt in mainz Exiting, unexpected exception %sTr)zospfclient: clean exit)�argparse�ArgumentParser�add_argument�
parse_args�verboser��DEBUG�INFOZbasicConfigryZlogtagr�r,r-r��runr<r�Zrun_until_completer~�KeyboardInterruptr})rtZaprB�statusr�r�r2r2r7�main�sB
���
&
rM�__main__)N)nrCr�r�r�r|r:r,rr�	ipaddressrr�r�r;r�r�ZLSAF_ORIGIN_NON_SELFZLSAF_ORIGIN_SELFr�r�r�r�rr�r�rrrrrrZ	smsg_infoZOSPF_API_DEL_ZERO_LEN_LSAr�r�r�r�r�r�r�r�r�r�r�r'r(r)r*r+r,r-r.r/r0r1rBZmsg_infor�itemsr=r�r�rArDr}rErJrKZLSA_TYPE_UNKNOWNrLrMrNrOrPrQrRrSrTrUrVrYrZr[r\r]r^r_r`rardrerfrgrhrirjrkrlrmrnrorprxr�r%r<rMrG�exit_statusr7r2r2r2r7�<module>s

��
�

	##

L,