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:/lib/python2.7/site-packages/cloudinit/net/
Upload File :
Current File : //lib/python2.7/site-packages/cloudinit/net/network_state.pyc
�
oB�]c@s�ddlZddlZddlZddlZddlZddlZddlmZddlmZej	e
�ZdZddddgZ
id	d
dgd6Zdd
dddddddddddddgZiidd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d86id9d:6d;d<6d=d>6ed?6d@dA6dBdC6edD6dEdF6dGdH6dIdJ6edK6dL6ZedM�ZedN�ZdO�ZdP�ZdQefdR��YZdS�ZdTefdU��YZdVefdW��YZeje�dXefdY��Y�ZdZ�Z fd[�Z!d\�Z"d]�Z#d^�Z$d_�Z%d`�Z&da�Z'db�Z(dc�Z)dd�Z*dS(ei����N(tsafeyaml(tutilitdhcp6t
ipv6_slaacsipv6_dhcpv6-statelesssipv6_dhcpv6-statefultversiontconfigt
network_statet	addressestdhcp4sdhcp4-overridessdhcp6-overridestgateway4tgateway6t
interfacestmatchtmtutnameserverstrenderersset-namet	wakeonlans	accept-ras	ad-selectsbond-ad-selectsarp-intervalsbond-arp-intervals
arp-ip-targetsbond-arp-ip-targetsarp-validatesbond-arp-validates
down-delaysbond-downdelaysfail-over-mac-policysbond-fail-over-macs	lacp-ratesbond-lacp-ratesmii-monitor-intervalsbond-miimons	min-linkssbond-min-linkstmodes	bond-modesgratuitious-arpsbond-num-grat-arptprimarysbond-primarysprimary-reselect-policysbond-primary-reselectsup-delaysbond-updelaystransmit-hash-policysbond-xmit-hash-policytbondsageing-timet
bridge_ageingtprioritytbridge_bridgeprios
forward-delayt	bridge_fdtbridge_gcints
hello-timetbridge_hellosmax-aget
bridge_maxagetbridge_maxwaits	path-costtbridge_pathcosts
port-prioritytbridge_portpriotstpt
bridge_stptbridge_waitporttbridgecCs�d}|jd�}|jd�}|dkr9|}n|r|dk	rtd|d|�}|jd|�|j�}n|S(sfParses the config, returns NetworkState object

    :param net_config: curtin network config dict
    RRitskip_brokenN(tNonetgettNetworkStateInterpretertparse_configtget_network_state(t
net_configR"tstateRRtnsi((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytparse_net_config_data?s	cCsCd}tj|�}d|kr?t|jd�d|�}n|S(sJParses a curtin network configuration file and
       return network statetnetworkR"N(R#Rt	read_confR+R$(tpathR"tnsR(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytparse_net_configTscCs)tj|�}t�}|j|�|S(N(RR-R%tload(t
state_fileR)R*((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytfrom_state_file_s	
cCs.t|�}x|D]}|j|�qW|S(N(tsettdiscard(texpectedtactualtmissingtkey((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt	diff_keysfs
tInvalidCommandcBseZRS((t__name__t
__module__(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR;mscs�fd�}|S(Ncs%tj����fd��}|S(NcsJ�r7t�|�}|r7td|�f��q7n�||||�S(Ns&Command missing %s of required keys %s(R:R;(tselftcommandtargstkwargstmissing_keys(tfunct
required_keys(s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt	decoratorus(t	functoolstwraps(RCRE(RD(RCs?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytwrapperss!
((RDRH((RDs?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytensure_command_keysqstCommandHandlerMetacBseZdZd�ZRS(sMetaclass that dynamically creates a 'command_handlers' attribute.

    This will scan the to-be-created class for methods that start with
    'handle_' and on finding those will populate a class attribute mapping
    so that those methods can be quickly located and called.
    cCs�i}x[|j�D]M\}}t|�r|jd�r|td�}|r`|||<q`qqW||d<tt|�j||||�S(Nthandle_tcommand_handlers(titemstcallablet
startswithtlentsuperRJt__new__(tclstnametparentstdctRLt	attr_nametattrthandles_what((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRR�s
(R<R=t__doc__RR(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRJ�stNetworkStatecBs�eZed�Zed��Zed��Zed��Zed��Zed��Z	d
d�Zd
d�Zd�Z
d	�ZRS(cCs=tj|�|_||_|jdt�|_d|_dS(Ntuse_ipv6(	tcopytdeepcopyt_network_statet_versionR$tFalseR\R#t_has_default_route(R>RR((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt__init__�s	cCs|jdS(NR(R_(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs|jS(N(R`(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs,y|jddSWntk
r'gSXdS(NtdnsR(R_tKeyError(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdns_nameservers�s
cCs,y|jddSWntk
r'gSXdS(NRdtsearch(R_Re(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdns_searchdomains�s
cCs(|jdkr!|j�|_n|jS(N(RbR#t_maybe_has_default_route(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythas_default_route�sccs[|jjdi�}x?tj|�D].}|dkr?|Vq%||�r%|Vq%q%WdS(NR(R_R$tsixt
itervaluesR#(R>tfilter_functifacestiface((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytiter_interfaces�sccsLxE|jjdg�D].}|dk	r?||�rD|VqDq|VqWdS(Ntroutes(R_R$R#(R>Rmtroute((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytiter_routes�s
cCs�x'|j�D]}|j|�r
tSq
Wxa|j�D]S}xJ|jdg�D]6}x-|jdg�D]}|j|�ritSqiWqPWq7WtS(NtsubnetsRq(Rst_is_default_routetTrueRpR$Ra(R>RrRotsubnet((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRi�scCs.d}|jd�dko-|jd�|kS(Ns::s0.0.0.0tprefixiR,(s::s0.0.0.0(R$(R>Rrtdefault_nets((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRu�sN(R<R=tNETWORK_STATE_VERSIONRctpropertyRRRfRhRjR#RpRsRiRu(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR[�s		R%cBs�eZiid6gd6igd6gd6d6ed6d+d6Zed+d�Zed��Zed	��Z	e	j
d
��Z	d�Zd�Zd
�Z
d�Zd�Zed�Zed�Zed�Zedg�d��Zedg�d��Zedddg�d��Zedddg�d��Zeddg�d��Zedg�d��Zedg�d ��Zed!g�d"��Zd#�Zd$�Zd%�Zd&�Z d'�Z!d(�Z"d+d)�Z#d*�Z$RS(,RRqRRgRdR\RcCsA||_||_tj|j�|_||jd<t|_dS(NR(R`t_configR]R^tinitial_network_stateR_Rat_parsed(R>RR((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRc�s
		
cCst|jd|j�S(NR(R[R_R`(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs|jjd�S(NR\(R_R$(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR\�scCs|jji|d6�dS(NR\(R_tupdate(R>tval((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR\�scCs1i|jd6|jd6|jd6}tj|�S(NRRR(R`R|R_Rtdumps(R>R)((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdumps



cCs�d|kr(tjd�td��nt|d}t||�}|rqd|}tj|�t|��nxAg|D]}|dkr{|^q{D]}t||||�q�WdS(NRs$Invalid state, missing version fieldsInvalid state, missing keys: %s(sversion(tLOGterrort
ValueErrortNETWORK_STATE_REQUIRED_KEYSR:tsetattr(R>R)RDRBtmsgtkR9((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR1s


,cCstj|j�S(N(RR�R_(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdump_network_statescCsi|jd6|jd6S(NRR(R`R|(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytas_dictscCs
|j}|S(N(R(R>R/((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR's	cCsZ|jdkr+|jd|�t|_n+|jdkrV|jd|�t|_ndS(NiR"i(R`tparse_config_v1RvR~tparse_config_v2(R>R"((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR&"scCs�x�|jD]�}|d}y|j|}Wn!tk
rNtd|��nXy|||�Wq
tk
r�|s|�q�tjd|dt�tj|j	��q
Xq
WdS(Nttypes!No handler found for command '%s'sSkipping invalid command: %stexc_info(
R|RLRetRuntimeErrorR;R�twarningRvtdebugR�(R>R"R?tcommand_typethandler((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�*s


cCs�x�|jj�D]�\}}|dkr.qny|j|}Wn!tk
rbtd|��nXy|||�|j|�Wqtk
r�|s��q�tjd|dt	�tj
|j��qXqWdS(NRs!No handler found for command '%s'sSkipping invalid command: %sR�(R|RMRLReR�t
_v2_commonR;R�R�RvR�R�(R>R"R�R?R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�<s"


RTcCs
|j|�S(N(thandle_physical(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_loopbackPsc	Cs�|jjdi�}|j|di�}x:|jdi�j�D] \}}|ji||6�qDWt|jd��}|js�xK|D]@}|jd�jd�s�t|jd��r�t|_Pq�q�Wn|jdd�}|dk	rt
j|�}n|ji
|jd�d6|jd�d6|jd	�d	6d
d
6dd6|jd
�d
6dd6dd6|d6|d6�|jdji||jd�6�|j�dS(s�
        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ],
            'accept-ra': 'true'
        }
        RRTtparamsRtR�t6taddresss	accept-ratmac_addresstinettmanualRR
tgatewayN(
R_R$RMRt_normalize_subnetsR\tendswithtis_ipv6_addrRvR#Rtis_trueR�(	R>R?RRotparamR�RtRwt	accept_ra((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�Ts6%	
		$tvlan_idt	vlan_linkcCs|jjdi�}|j|�|j|jd�i�}|jd�|d<|jd�|d<|ji||d6�dS(s�
            auto eth0.222
            iface eth0.222 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    hwaddress ether BC:76:4E:06:96:B3
                    vlan-raw-device eth0
        RRTR�svlan-raw-deviceR�N(R_R$R�R(R>R?RRo((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_vlan�s

tbond_interfacesR�c	Cs�|j|�|jjd�}|j|jd�i�}x7|jd�j�D] \}}|ji||6�qPW|jidd6�|jdji||d6�x�|jd�D]�}||kr�i|d6dd6}|j|�n|jjdi�}|j|�}|jd�|d	<x7|jd�j�D] \}}|ji||6�q:W|jdji||6�q�Wd
S(s
    #/etc/network/interfaces
    auto eth0
    iface eth0 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto eth1
    iface eth1 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto bond0
    iface bond0 inet static
         address 192.168.0.10
         gateway 192.168.0.1
         netmask 255.255.255.0
         bond-slaves none
         bond-mode 802.3ad
         bond-miimon 100
         bond-downdelay 200
         bond-updelay 200
         bond-lacp-rate 4
        RRTR�tnonesbond-slavesR�RR�sbond-masterN(R�R_R$RMR(	R>R?RRoR�R�tifnametcmdtbond_if((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bond�s&
"
"tbridge_interfacesc	Cs�|jjdi�}xC|jd�D]2}||kr=q%ni|d6}|j|�q%W|jjdi�}|j|�|j|jd�i�}|d|d<x:|jdi�j�D] \}}|ji||6�q�W|jd�}|dk	rit|�tkri|dkr%t}n-|dkr:t	}nt
d
jd|���|ji|d6�n|ji||d6�dS(s�
            auto br0
            iface br0 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    bridge_ports eth0 eth1
                    bridge_stp off
                    bridge_fd 0
                    bridge_maxwait 0

        bridge_params = [
            "bridge_ports",
            "bridge_ageing",
            "bridge_bridgeprio",
            "bridge_fd",
            "bridge_gcint",
            "bridge_hello",
            "bridge_hw",
            "bridge_maxage",
            "bridge_maxwait",
            "bridge_pathcost",
            "bridge_portprio",
            "bridge_stp",
            "bridge_waitport",
        ]
        RR�RTtbridge_portsR�Rtont1itofft0is2Cannot convert bridge_stp value ({stp}) to booleanRN(R�R�i(R�R�i(R_R$R�RMRR#R�tboolRvRaR�tformat(	R>R?RR�R�RoR�R�R((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt
handle_bridge�s0

%			cCs|j|�dS(N(R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_infiniband
sR�cCs�|jjd�}d|krk|d}t|�tksF|g}nx"|D]}|dj|�qMWnd|kr�|d}t|t�s�|g}nx"|D]}|dj|�q�WndS(NRdR�RRg(R_R$R�tlisttappendt
isinstance(R>R?RdtaddrstaddrtpathsR.((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_nameservers



tdestinationcCs|jdjt|��dS(NRq(R_R�t_normalize_route(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_routescCs|j|dd�dS(s�
        v2_command = {
          bond0: {
            'interfaces': ['interface0', 'interface1'],
            'parameters': {
               'mii-monitor-interval': 100,
               'mode': '802.3ad',
               'xmit_hash_policy': 'layer3+4'}},
          bond1: {
            'bond-slaves': ['interface2', 'interface7'],
            'parameters': {
                'mode': 1,
            }
          }
        }

        v1_command = {
            'type': 'bond'
            'name': 'bond0',
            'bond_interfaces': [interface0, interface1],
            'params': {
                'bond-mode': '802.3ad',
                'bond_miimon: 100,
                'bond_xmit_hash_policy': 'layer3+4',
            }
        }

        tcmd_typeRN(t_handle_bond_bridge(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bonds#scCs|j|dd�dS(s�
        v2_command = {
          br0: {
            'interfaces': ['interface0', 'interface1'],
            'forward-delay': 0,
            'stp': False,
            'maxwait': 0,
          }
        }

        v1_command = {
            'type': 'bridge'
            'name': 'br0',
            'bridge_interfaces': [interface0, interface1],
            'params': {
                'bridge_stp': 'off',
                'bridge_fd: 0,
                'bridge_maxwait': 0
            }
        }

        R�R!N(R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bridgesBsc
CsLxE|j�D]7\}}idd6|jd|�d6}|jdi�}|jdd�}|stjd|t|��n||d<|jd	d�}|r�i|d	6|d
<nx7dddd
gD]#}||kr�||||<q�q�W|j|�}	t|	�dkr'|ji|	d6�ntjd|�|j	|�q
WdS(s�
        ethernets:
          eno1:
            match:
              macaddress: 00:11:22:33:44:55
              driver: hv_netsvc
            wakeonlan: true
            dhcp4: true
            dhcp6: false
            addresses:
              - 192.168.14.2/24
              - 2001:1::1/64
            gateway4: 192.168.14.1
            gateway6: 2001:1::2
            nameservers:
              search: [foo.local, bar.local]
              addresses: [8.8.8.8, 8.8.4.4]
          lom:
            match:
              driver: ixgbe
            set-name: lom1
            dhcp6: true
            accept-ra: true
          switchports:
            match:
              name: enp2*
            mtu: 1280

        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ]
        }
        tphysicalR�sset-nameRTRt
macaddresssHNetworkState Version2: missing "macaddress" info in config entry: %s: %sR�tdriverR�R
Rs	accept-raiRts!v2(ethernets) -> v1(physical):
%sN(
RMR$R#R�R�tstrt_v2_to_v1_ipcfgRPRR�(
R>R?tethtcfgtphy_cmdRR�R�R9Rt((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_ethernets\s*&	
cCs�x�|j�D]�\}}idd6|d6|jd�d6|jd�d6}d|krj|d|d<n|j|�}t|�d	kr�|ji|d
6�ntjd|�|j|�q
WdS(
sq
        v2_vlans = {
            'eth0.123': {
                'id': 123,
                'link': 'eth0',
                'dhcp4': True,
            }
        }

        v1_command = {
            'type': 'vlan',
            'name': 'eth0.123',
            'vlan_link': 'eth0',
            'vlan_id': 123,
            'subnets': [{'type': 'dhcp4'}],
        }
        tvlanR�RTtidR�tlinkR�R
iRtsv2(vlans) -> v1(vlan):
%sN(RMR$R�RPRR�R�R�(R>R?R�R�tvlan_cmdRt((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_vlans�scCstjd�dS(NsNWifi configuration is only available to distros withnetplan rendering support.(R�R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_wifis�scCs�tjd|�d|kr�|jd�jdg�}|jd�jdg�}idd6}t|�dkr�|ji|d6�nt|�dkr�|ji|d6�ntjd|�|j|�ndS(	Nsv2_common: handling config:
%sRRgRt
nameserverR�is$v2(nameserver) -> v1(nameserver):
%s(R�R�R$RPRR�(R>R�RgRdtname_cmd((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s
c
s�td�tj|�j�D���xw|j�D]i\}}td�|j�D��}|d}|jdd�}|r�||d<ni|d6|d6|jd�|d	6t�fd
�|jdi�j�D��d6}d|kr�|d|d<n|j|�}	t|	�d
kr5|ji|	d6�nt	j
d|||�|dkrg|j|�q2|dkr�|j|�q2t
djd|���q2WdS(s(Common handler for bond and bridge typescss!|]\}}||fVqdS(N((t.0R�tv((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�scss-|]#\}}|tkr||fVqdS(N(tNETWORK_V2_KEY_FILTER(R�R9tvalue((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�s	t
parameterssgratuitous-arpsgratuitious-arpR�RTRt_interfacesc3s%|]\}}�||fVqdS(N((R�R�R�(tv2key_to_v1(s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�sR�R
iRtsv2(%s) -> v1(%s):
%sR!Rs Unknown command type: {cmd_type}R�N(tdicttNET_CONFIG_TO_V2R$RMtpopR#R�RPRR�R�R�R�R�R�(
R>R?R�t	item_nametitem_cfgtitem_paramsR�t
grat_valuetv1_cmdRt((R�s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s6		

#c
Csyd�}g}|jd�rTidd6}||jdi�|�|j|�n|jd�r�idd6}t|_||jdi�|�|j|�nd}d}i}x?|jdg�D]+}idd6|d	6}d
|kr.d|krl|dkrl|jd�}|ji|d6�qln>d
|krl|dkrl|jd
�}|ji|d6�nd|kr�|r�|jd�jd�}	|	r�|	|d<n|jd�jd�}
|
r�|
|d<n|j|�n|j|�q�Wg}xM|jdg�D]9}|jti|jd�d6|jd�d6��qWt|�rut|�ru||dd<n|S(s7Common ipconfig extraction from v2 to v1 subnets array.cSs!d|kr|d|d<ndS(Nsroute-metrictmetric((t	overridesRw((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt_add_dhcp_overrides�sRR�sdhcp4-overridesRsdhcp6-overridesRtstaticR�t:R
R�R	RRfRgt
dns_searchRqttoR�tviaiN(R$R�RvR\R#RR�RP(
R>R�R�RtRwR	R
RR�RRgRqRr((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��sR	

	


	.N(%R<R=RaR#R}RzRcR{RR\tsetterR�R1R�R�R'RvR&R�R�RIR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR%�sH
					05@			?	!		
)cCs�tj|�}td�|j�D��}|jd�dkr\|jt|dd��ng|jdg�D]}t|�^qo|d<d�}xd
D]}|||�q�W|S(Ncss'|]\}}|r||fVqdS(N((R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>5sR�R�tstatic6taddress_keysR�RqcSs;||kr7t||t�r7||j�||<ndS(N(R�R�tsplit(tsnetRT((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytlistify=s R�Rf(sstaticR�(saddress(s
dns_searchsdns_nameservers(R]R^R�RMR$Rt_normalize_net_keysR�(Rwt
normal_subnettrR�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt_normalize_subnet2s,	
c
Cs�td�|j�D��}d
}x'|D]}|j|�r)|}Pq)q)W|s�ddj|�|f}tj|�t|��n|j|�}t|�}|jd�}d|kr|j	d�\}	}
}|	||<yt
|�}WqXtk
rt|�}qXXnF|r't|�}n1d|krFt
|d�}n|rRdnd}d|kr�t|d�t|�kr�tj
d	||�n||d<|r�d|kr�|d=q�nt|d�|d<|S(s�Normalize dictionary network keys returning prefix and address keys.

    @param network: A dict of network-related definition containing prefix,
        netmask and address_keys.
    @param address_keys: A tuple of keys to search for representing the address
        or cidr. The first address_key discovered will be used for
        normalization.

    @returns: A dict containing normalized prefix and matching addr_key.
    css'|]\}}|r||fVqdS(N((R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>Rss/No config network address keys [%s] found in %st,tnetmaskt/Rxi@is;Overwriting existing 'prefix' with '%s' in network info: %sN(R�RMR#R$tjoinR�R�R�R�t	partitiontinttmask_to_net_prefixR�R�tnet_prefix_to_ipv4_mask(
R,R�tnettaddr_keyR9tmessageR�tipv6R�t	addr_partt_tmaybe_prefixRx((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�GsF



(	


cCs�td�|j�D��}d|kr@|d|d<|d=n|jt|dd��|jd�}|r�yt|�|d<Wq�tk
r�tdj|���q�Xn|S(s�normalize a route.
    return a dictionary with only:
       'type': 'route' (only present if it was present in input)
       'network': the network portion of the route as a string.
       'prefix': the network prefix for address as an integer.
       'metric': integer metric (only if present in input).
       'netmask': netmask (string) equivalent to prefix iff network is ipv4.
       css-|]#\}}|dkr||fVqdS(tN(RN(R#(R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�s	R�R,R�R�s(Route config metric {} is not an integer(snetworksdestination(	R�RMRR�R$R�R�t	TypeErrorR�(Rrtnormal_routeR�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s


cCs,|sg}ng|D]}t|�^qS(N(R�(Rtts((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s	cCs|s
tSdt|�kS(NR�(RaR�(R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��scCsT|djd�s#|dtkr'tS|ddkrPt|jd��rPtStS(s:Common helper for checking network_state subnets for ipv6.R�R�R�R�(R�tIPV6_DYNAMIC_TYPESRvR�R$Ra(Rw((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytsubnet_is_ipv6�s
#%cCs1tjtjdddt|�>d@��}|S(s�Convert a network prefix to an ipv4 netmask.

    This is the inverse of ipv4_mask_to_net_prefix.
        24 -> "255.255.255.0"
    Also supports input as a string.s>II����i (tsockett	inet_ntoatstructtpackR�(Rxtmask((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s'cCs�t|t�r|St|tj�rJyt|�SWqVtk
rFqVXntd��d|krutd|��n|jd�}t|�dkr�td|t|�f��ntg|D]!}t	t|��j
d�^q��S(sConvert an ipv4 netmask into a network prefix length.

    If the input is already an integer or a string representation of
    an integer, then int(mask) will be returned.
       "255.255.255.0" => 24
       str(24)         => 24
       "24"            => 24
    s mask '%s' is not a string or intt.s#netmask '%s' does not contain a '.'isnetmask '%s' had only %d partsR�(R�R�Rktstring_typesR�RR�RPtsumtbintcount(Rttokstx((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytipv4_mask_to_net_prefix�s	
cCs
t|t�r|St|tj�rJyt|�SWqVtk
rFqVXntd��d|krqtd��ndddddd	d
ddd
dddddddg}d}xS|jd�D]B}|s�t|d�dkr�Pn||jt|d��7}q�W|S(s�Convert an ipv6 netmask (very uncommon) or prefix (64) to prefix.

    If 'mask' is an integer or string representation of one then
    int(mask) will be returned.
    s mask '%s' is not a string or intR�smask '%s' does not have a ':'ii�i�i�i�i�i�i�i�i��i��i�i�i��i��i��i��i(R�R�RkRR�RR�tindex(RtbitCountRxtword((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytipv6_mask_to_net_prefix�s&
 cCsFyt|�SWntk
r!nXt|�r8t|�St|�SdS(sXReturn the network prefix for the netmask provided.

    Supports ipv4 or ipv6 netmasks.N(R�R�R�RR(R((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s

cCs�tdjg|jd�D] }tt|�d�d^q�d�}t|�}|dd|dB}djgtd�d	d	d
�D]}t||d>?d@�^q��}|S(sZCalculate the broadcast address from the subnet mask and ip addr.

    Supports ipv4 only.RRiiii iiNi����i�(R�R�R�RRtrangeR�(RtipRtip_bintmask_dect	bcast_bintit	bcast_str((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytmask_and_ipv4_to_bcast_addrsH	>(+R]RFtloggingR
RRkt	cloudinitRRt	getLoggerR<R�RzRR�R�R#R�RvR+R0R3R:t	ExceptionR;RIR�RJtobjectR[t
add_metaclassR%R�R�R�R�R�RR�RRR�R%(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt<module>s�	

			H��T	: