+
    itm                        ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHt ^ RIHtHtHt ^ RIHtHtHtHtHtHtHt ^ RIHt ]P6                  ! ]4      t. ROt. ROt. ROt R R lt!R	 R
 lt"RR R llt#R R lt$]PJ                  ! R4      R R l4       t&R R lt'R R lt( ! R R]PR                  4      t)R R lt*R# )    N)suppress)AnyDictListOptional)performancesubputil)ParserErroris_ipv4_addressis_ipv4_networkis_ipv6_addressis_ipv6_networkrenderersubnet_is_ipv6)NetworkStatec          	      ^    V ^8  d   QhR\         R\         R\        R\        \        ,          /# )   ifacesubnetis_ipv6returndictboolr   str)formats   "3/usr/lib/python3/dist-packages/cloudinit/net/eni.py__annotate__r   J   s2     ^ ^T ^4 ^$ ^49 ^    c           
         . p. ROpVP                  4        EF  w  rVVR8X  d   K  VR 8X  d   VR ,          : RVR,          : 2pV'       g   K7  WT9   g   K?  \        V\        4      '       Ed"   VR8X  d9   \        \        \        P
                  ! \        VR7      V4      4      pV. 8X  d   K  VR8X  d   \        VP                  R4      \        4      '       dE   \        \        \        P
                  ! \        VR7      VP                  R. 4      4      4      . 8X  g^   \        VP                  R4      \        4      '       d<   VP                  R4      R8X  g#   \        VP                  RR4      V4      '       g   EKe  RP                  V4      pMVR8X  d   \        Wb4      '       g   EK  VR8X  d   \        VP                  R4      \        4      '       dE   \        \        \        P
                  ! \        VR7      VP                  R. 4      4      4      . 8X  g^   \        VP                  R4      \        4      '       d<   VP                  R4      R8X  g#   \        VP                  RR4      V4      '       g   EKb  R	V9   d   VP                  R	R
4      pVP                  RP                  WV4      4       EK  	  \        V4      # )addressnetmask
dns_searchdns_nameservers/prefix)r     _-    {0} {1})
r"   r#   	broadcastmetricgatewaypointopointmtuscoper$   r%   )items
isinstancelistfilter	functoolspartialhas_same_ip_versiongetr   joinreplaceappendr   sorted)r   r   r   content	valid_mapkeyvalues   &&&    r   _iface_add_subnetrC   J   s_   GI lln
))%i00&2BCE5S%%&&++ %-- 3W "	E { ,&"6::.?#@$GG " ) 1 1$7!" !'

+<b A	  #6::.?#@#FF"JJ'89R?#6 &

+<b A7$ $ !++4G5 5 ,&"6::.?#@$GG " ) 1 1$7!" !'

+<b A	  #6::.?#@#FF"JJ'89R?#6 &

+<b A7$ $ !czkk#s+NN=//;<] %` '?r    c          	      t    V ^8  d   QhR\         R\        R\        \        ,          R\        \        ,          /# )r   r   indexipv4_subnet_mtur   )r   intr   r   r   )r   s   "r   r   r      s4     ? ???.6sm?	#Y?r    c                    V^ 8w  d   . # . p. ROp. ROpRR/pV R,          R9  d   VP                  R4       V P                  4        EF  w  rxVP                  Ww4      p	RV	9   d   V	P                  RR4      p	\	        V\
        4      '       d   W,          '       d   RMRpV'       d   Wt9   d   Kh  VR	8X  d0   V'       d(   W8w  d    \        P                  R
V R,          VV4       K  Wu9   d,   V F#  p
VP                  RP                  W4      4       K%  	  K  \	        V\        4      '       d   RP                  V4      pVP                  RP                  W4      4       EK  	  \        V4      # )r   nametypemac_address	hwaddressr*   r+   onoffr1   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r,   r)   )
control	device_iddnsdriverrE   inetmoderI   subnetsrJ   )bridge_pathcostbridge_portpriobridge_waitport)bondbridge
infinibandvlan)r=   r3   r:   r<   r4   r   LOGwarningr   r5   r;   r>   )r   rE   rF   r?   
ignore_mapmultiline_keysrenamesrA   rB   	key_writevs   &&&        r   _iface_add_attrsrd      sB    z	GJN k*GV}DD-(kkm
KK)	)!))#s3IeT""!JJDEE)%<O':&M#  }33IAB eT""HHUOE}++I=>3 $6 '?r    c                R    V ^8  d   QhR\         R\        R\        \        ,          /# r   r   render_hwaddressr   r   )r   s   "r   r   r      s(      *.	#Yr    c                    V R ,          pV R,          pVR8X  d   RpMVR9   d   RV,           pM	RV,           pV P                  4       pVP                  RVRV/4       RP                  ! R/ VB RP                  ! R/ VB .pV'       d9   V P                  R	4      '       d"   VP	                  R
P                  ! R/ VB 4       V# )rI   rO   autozallow-z
# control-fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}rK   z    hwaddress {mac_address})hotplug )copyupdater   r:   r=   )r   rE   rg   rj   rO   rk   substliness   &&&     r   _iface_start_entryrr      s     V}HIG&	L	 7"w&JJLE	LL*h78 	##,e,(//8%8E EIIm44299BEBCLr    c          
      L    V ^8  d   QhR\         R\        R\        R\        RR/# )r   ifacescontentssrc_dirsrc_pathr   N)r   r   )r   s   "r   r   r     s;     C* C*C*C**-C*9<C*	C*r    c                   RpVP                  4        EF  pVP                  4       pVP                  R4      '       d   K-  VP                  R4      pV^ ,          pVR8X  Ed{   V^,          pVP                  R4      '       g    \        P
                  P                  W(4      p\        P                  ! V4       EF  p	\        P                  ! V	4      p
V
 Uu. uF  p\        P
                  P                  \        P
                  P                  W4      4      '       g   KG  \        P                  ! RV4      f   Kb  \        P
                  P                  W4      NK  	  p
pV
 Fp  p\        P                  ! V4      P                  4       p\        P
                  P                  V4      p\        W\        P
                  P!                  V4      V4       Kr  	  EK   	  EK  VR8X  d   V^,          pVP                  R4      '       g    \        P
                  P                  W/4      p\        P                  ! V4       F  p	\#        V	R4      ;_uu_ 4       pVP%                  4       P                  4       pRRR4       \        P
                  P                  V	4      p\        V X\        P
                  P!                  V4      V4       K  	  EK  VR	8X  d.   VR
,           F  pVV 9  d   RV/V V&   RV V,          R	&   K  	  EK  VR8X  d\   VR,          w  pppVV 9  d	   RV/V V&   M"RV V,          9   d   \'        RV: RV: R24      hVV V,          R&   VV V,          R&   TpEKJ  VR8X  d0   V^,          R8X  d   V^,          pM	V^,          pVW,          R&   EK  V\(        9   d   V^,          W,          V&   EK  V\*        9   dP   WpV,          9  d   . W,          V&   W,          V,          P-                  RP                  VR
,          4      4       EK  VP                  R4      '       d   RW,          9  d   / W,          R&   VR8X  dK   . W,          R,          R&   VR
,           F(  pW,          R,          R,          P-                  V4       K*  	  EKz  VR8X  dK   . W,          R,          R&   VR
,           F(  pW,          R,          R,          P-                  V4       K*  	  EK  EK  VP                  R4      '       Ed   RW,          9  d   / W,          R&   V\.        9   d0   VP1                  RR^4      pV^,          W,          R,          V&   EK8  VR8X  dK   . W,          R,          R &   VR
,           F(  pW,          R,          R ,          P-                  V4       K*  	  EK  VR!8X  dU   V^,          P3                  4       R"8X  d   V^,          W,          R,          R"&   EK  V^,          W,          R,          R"&   EK  VR#8X  dQ   R$W,          R,          9  d   / W,          R,          R$&   V^,          W,          R,          R$,          V^,          &   EK;  VR%8X  dQ   R&W,          R,          9  d   / W,          R,          R&&   V^,          W,          R,          R&,          V^,          &   EK  EK  VP                  R'4      '       g   EK  R(W,          9  d   / W,          R(&   VP1                  R'R^4      pV^,          W,          R(,          V&   EK  	  V P5                  4        F  pR	V V,          9  g   K  R)V V,          R	&   K!  	  R# u upi   + '       g   i     EL; i)*ab  Parses the file contents, placing result into ifaces.

'_source_path' is added to every dictionary entry to define which file
the configuration information came from.

:param ifaces: interface dictionary
:param contents: contents of interfaces file
:param src_dir: directory interfaces file was located
:param src_path: file path the `contents` was read
N#r)   zsource-directoryr&   z^[a-zA-Z0-9_-]+$sourcerri   :   NN_source_pathTr   :r|      Nfamilyz
Interface z* can only be defined once. Re-defined in 'z'.methodrL   etherzdns-rQ   z
dns-searchsearchzdns-nameserversnameserversbridge_rZ   r(   bridge_portsports	bridge_hwmacrV   pathcostrW   portpriozbond-rY   F)
splitlinesstrip
startswithsplitospathr;   globlistdirisfilerematchr
   load_text_fileabspath_parse_deb_config_datadirnameopenreadr   NET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr=   NET_CONFIG_BRIDGE_OPTIONSr<   lowerkeys)rt   ru   rv   rw   currifliner   optionparsed_src_direxpanded_pathdir_contentsr   entrysrc_data	abs_entrynew_src_pathfpabs_pathr   r   r   valdomainserverbridge_optionbond_options   &&&&                      r   r   r     s     F##%zz|??3

3q''"1XN!,,S11!#g!F!%>!:!zz-8 !-  ,rww||M'HI 6 HH%7>	 6BGGLL5 ,    *E#2259??AH " 6I*"''//)*Di * ";  x 8L**3//!ww||GB!%<!8---!wwy0H .77??=9&Hbggooh&?	 "9 vr& '%F5M )-uf% # w$)#J!E66F" #H!u VE]*!-2H>  '-F5M(#&,F5M(#F{"Qx7"AhAh*-FN;'))%*1XFN6"**F^+)+v&N6"))#((59*=>v&&FN*(*u%%24u%h/#BiiFN5)(3::6B (,,79u%m4#BiiFN5)-8??G ( - y))v~-+-x(22 &y"a @:?(x(7>)46x(1"2YYEN8,W5<<UC ';&
 8>>#u,6;AhFN8,U36;AhFN8,U3,,V^H%==;=FN8,Z8AFqx(4U1X>,,V^H%==;=FN8,Z8AFqx(4U1X> - w''V^+)+v& .."a8K27(FN6";/e &f &$)F5M&! O & .--s   A] ] 9#] ]	]zConverting eni datac                0    V ^8  d   QhR\         R\        /# )r   eni_datar   )r   r   )r   s   "r   r   r     s     . .s .t .r    c                8    / p\        WRRR7       \        V4      # )z=Return a network config representation of what is in eni_dataNone)rv   rw   )r   _ifaces_to_net_config_data)r   rt   s   & r   convert_eni_datar     s      F6VfM%f--r    c                0    V ^8  d   QhR\         R\         /# )r   rt   r   )r   )r   s   "r   r   r     s     &E &Et &E &Er    c                   / pV P                  4        EF.  w  r#VP                  R4      ^ ,          pWA9  d0   VR8X  d   RpMRpRVRVR. /W&   RV9   d   VR,          W,          R	&   R
VRVR,          /pVP                  R4      '       d   RVR&   MRVR&   VP                  R4      R8X  d   VR,          VR&   R F  pWs9   g   K  W7,          Wg&   K  	  RV9   dK   R FD  pWR,          9   g   K  VR,          V,          '       g   K*  VR,          V,          VRV,           &   KF  	  W,          R,          P                  V4       EK1  	  R^R\	        V4       U	u. uF  qV	,          NK  	  up	/# u up	i )zReturn network config that represents the ifaces data provided.
ifaces = _parse_deb_config_data(...)
config = ifaces_to_net_config_data(ifaces)
state = parse_net_config_data(config).:loloopbackphysicalrJ   rI   rU   rL   rK   _orig_eni_namer   ri   rO   manualstaticr"   rQ   dns_versionconfig)r#   r/   r-   )r   r   )r3   	partitionr:   r=   r>   )
rt   devsrI   datadevnamedtyper   copy_keynds
   &         r   r   r     sd   
 Dlln
..%a($""#UFGYKDM d"/3K/@m,"D&$x.A88F &F9 (F988H) $YF9;H#'>  < D=.U#UA)-eQF6A:& / 	i ''/= %@ q(fTl$Cl!WWl$CDD$Cs   E+
c                <    V ^8  d   QhR\         R\        R\        /# )r   addr_or_netr   r   )r   r   )r   s   "r   r   r     s&     H HS H4 HD Hr    c                     V'       g   \        V 4      ;'       g    \        V 4      # \        V 4      ;'       g    \        V 4      # N)r   r   r   r   )r   r   s   &&r   r9   r9     s5    {+KK{/KK;'GG?;+GGr    c                      a  ] tR tRt o RtRV 3R lR lltRV 3R lR lltRV 3R lR	 lltRV 3R
 lR lltRV 3R lR llt	Rt
V tR# )Rendereri  z@Renders network information in a /etc/network/interfaces format.Nc                0   < V ^8  d   QhRS[ S[,          /# )r   r   )r   r   )r   __classdict__s   "r   r   Renderer.__annotate__  s     
 
x~ 
r    c                    V'       g   / pVP                  R R4      V n        VP                  RR4      V n        VP                  RR4      V n        R# )eni_pathzetc/network/interfaces
eni_headerNnetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r:   r   r   r   )selfr   s   &&r   __init__Renderer.__init__  sF    F

:/GH **\48#ZZG
r    c                <   < V ^8  d   QhRS[ RS[RS[S[,          /# )r   routeindentr   )r   r   r   )r   r   s   "r   r   r     s+     O O4 O Od3i Or    c                |   . p\         P                  ! R4      '       d   RpMRpV'       d   VR,           pVR,           pRRRR/pMVR	,           pVR
,           pRRRR/pRpRp	VR,          R8X  d,   VR,          R8X  d   V'       d   VR,          pVR,          pRp	M;VR,          R8X  d.   VR,          ^ 8X  d    V'       d   VR,          pVR,          pRp	MRp	Rp
R EF"  pV	'       d
   VR8X  d   K  VR8X  d"   W: RW{,          : RW,          : 2,          p
K=  W9   g   KE  VR8X  d   V'       d=   \        W,          4      '       d   VR,          pVR,          pVR,          pVR,          pMJ\        W,          4      '       d   V
R,          p
M)VP                  R4      ^ 8X  d   V
R,          p
M	V
R,          p
RV9   d"   V
RW,          : RVR,          : 2,          p
EK  EK  V
RW{,          : RW,          : 2,          p
EK%  	  VP	                  WZ,           V,           4       VP	                  Wj,           V,           4       V# ) af  When rendering routes for an iface, in some cases applying a route
may result in the route command returning non-zero which produces
some confusing output for users manually using ifup/ifdown[1].  To
that end, we will optionally include an '|| true' postfix to each
route line allowing users to work with ifup/ifdown without using
--force option.

We may at somepoint not want to emit this additional postfix, and
add a 'strict' flag to this function.  When called with strict=True,
then we will not append the postfix.

1. http://askubuntu.com/questions/168033/
         how-to-set-static-routes-in-ubuntu-server
ipTFz
post-up ipzpre-down ipr/   viar.   zpost-up route addzpre-down route delgwz || truer(   networkz0.0.0.0r#   z
 route addz
 route delz defaultz::r'   z -family inet6 route addz -family inet6 route delz -A inet6 defaultr)   z -family inet6z	 -A inet6z -hostz -netr&   )r   r/   r.   )r	   whichr   r:   r=   )r   r   r   r?   
use_ip_cmdupdownmappingor_true
default_gw
route_lineks   &&&         r   _render_routeRenderer._render_route  s    ::dJJ,&BM)D5(G
 --B00D4(G 
y(U9-=-Jl"$#J9%%/Q*>0022'
0

1Aa9nI~J

EHMM
	>!*5844"22B $44Dl*,*5844&+5J"YYx0B6&(2J&'1J5("%((E(O&LL
 ) gjj%("CCJ1 22 	r01t(723r    c                L   < V ^8  d   QhRS[ RS[RS[S[S[,          ,          /# rf   r   )r   r   s   "r   r   r   "  s2     B BB-1B	d3iBr    c           	       a \         P                  ! V4      p\        \        4      ;_uu_ 4        VP	                  R 4       RRR4       . pVP                  R/ 4      pVP	                  RR4      pVP	                  RR4      pV'       d   RVR&   V'       Ed5   Rp. p\        V4       EF  w  p	oRp
WR&   SR,          VR	&   SP                  R
R4      VR
&   Rp\        S4      '       d   RpVR,          pMRpSP                  R4      p
WR&   SR,          R8X  g   SR,          R8X  g   SR,          R8X  d   RVR	&   Ve   V'       d   RMRVR&   M[SR,          R8X  d   RVR	&   RVR&   MBSR,          R8X  d   RVR	&   RVR&   M)\        S4      '       d   RVR	&   Ve   V'       d   RMRVR&   RV Uu. uF  pRVR,          ,          V9   NK  	  up9   d   RVR
&   RS9   ;'       g    RS9   pVf   V'       d   \        V3R  lR- 4       4      pVe   V'       g   / SCVCo\        \        WVR!7      \        VSV4      ,           \        WV
4      ,           4      pSP                  R". 4       Fc  p\        VP                  R#R$4      4      pV'       d   V'       g   VP                  V4       KA  VP                  V P!                  VR%R&7      4       Ke  	  V'       dD   V'       d<   V F%  pVP                  V P!                  VR%R&7      4       K'  	  VP#                  4        VP                  V4       EK  	  V'       d   RVR,          R
VR
,          R	RRR'/pRRR"V/oVe   / SCVCo\        \        VR.VR!7      \        VSR4      ,           4      pSR",           F%  pVP                  V P!                  VR%R&7      4       K'  	  VP                  V4       V# . pR(V9   g   R)V9   d"   VP                  R*P$                  ! R// VB 4       VP                  R+P$                  ! R// VB 4       VP                  \        V^ RR,7      4       VP                  V4       V#   + '       g   i     EL; iu upi )0	config_idNrU   z	accept-ra	wakeonlangzethernet-wolrE   rJ   rT   rO   ri   rS   T6Fr1   dhcp4dhcp6zipv6_dhcpv6-statefuldhcp10	accept_razipv6_dhcpv6-stateless
ipv6_slaacr   zauto %srI   aliasr$   r%   c              3   J   <"   T F  pVSP                  V4      3x  K  	  R # 5ir   )r:   ).0r   r   s   & r   	<genexpr>)Renderer._render_iface.<locals>.<genexpr>i  s%      !BA FJJqM*!Bs    #rg   routesr   r(   z    )r   inet6zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode})rE   rF   )r$   r%   rm   )rn   deepcopyr   KeyErrorpopr:   	enumerater   r   r5   rr   rC   rd   r   r=   extendr   clearr   )r   r   rg   sectionsrU   r   ethernet_wolrQ   routes6rE   rF   subnet_inetr   r   dns_presentrq   r   ipv6_networkr   s   &&&               @r   _render_ifaceRenderer._render_iface"  s[    e$ hIIk"  $&))Ir*IIk40	yyd3$'E.!7CG!*7!3v"&!&g &vf#)::i#@i $!&))"G3&K#G&,jj&7O +f6Ng-f~0f~)?? %+E&M ,4=S3k*F^'>>$*E&M$'E&MF^|3$*E&M$'E&M#F++$,E&M ,4=S3k* DLDLDIv/47H  (/E)$
 !F*II.?6.I  ;; !B C ?;..#.F&7G (vw?@ 'u_E	F $ZZ"5E#2599Y3K#LL#Gu- LL!3!3E&!3!IJ 6 w!(T%7%7f%7%MN ")MMO&_ "4b  E&MuY/HG	 !(Hg>?..#.F&r4D (vt<= $H--ELL!3!3E&!3!IJ .&  E%%)?]11:E:;LL5<<EuEFLL aF OOE"y  ls   Q-Q!Q	c                ,   < V ^8  d   QhRS[ RS[RS[/# )r   network_staterg   r   )r   r   r   )r   r   s   "r   r   r     s*     4D 4D)4D=A4D	4Dr    c                H  a
 RRRRRRRRRRR	/./pVP                  4        F1  pVP                  R4      R8X  g   K  \        P                  ! V4      pK3  	  VP                  pV'       d   WSR,          ^ ,          R
&   VP
                  pV'       d   WcR,          ^ ,          R&   R^ R^R^R^R^R^/o
. pVP                  V P                  V4      4       \        VP                  4       V
3R lR7       F<  pVP                  R4      R8X  d   K  VP                  V P                  WBR7      4       K>  	  VP                  4        F#  pVP                  V P                  V4      4       K%  	  RP                  V U	u. uF  p	RP                  V	4      NK  	  up	4      R,           # u up	i )z1Given state, emit etc/network/interfaces content.rI   r   rJ   r   rS   rU   r   rO   ri   r%   r$   r[   rY   rZ   r\   c                 6   < SV R ,          ,          V R,          3# )rJ   rI   rm   )r   orders   &r   <lambda>-Renderer._render_interfaces.<locals>.<lambda>  s    56+QvY7r    )rA   r  z


)iter_interfacesr:   rn   r  r%   dns_searchdomainsr	  r  r>   iter_routesr=   r   r;   )r   r  rg   r   r   r   searchdomainsr  r   sr  s   &&&       @r   _render_interfacesRenderer._render_interfaces  s    DJFY?@	
 #224Eyy D(]]5) 5 $332=yM!./%77-:yM!\*
 !AaA
 **2./))+7
E
 yy D(OO""5"L
 #..0EOOD..u56 1 {{(;(QDIIaL(;<tCC;s   7Fc                P   < V ^8  d   QhRS[ RS[S[,          RS[S[,          RR/# )r   r  	templatestargetr   N)r   r   r   r   )r   r   s   "r   r   r     s;      # D> 	
 
r    c                b   \         P                  ! W0P                  4      p\        P                  ! \
        P                  P                  V4      4       V P                  '       d   V P                  MR p\        P                  ! WEV P                  V4      ,           4       V P                  '       d~   \         P                  ! W0P                  4      p\        P                  ! \
        P                  P                  V4      4       \        P                  ! VV P                  V4      RR7       R# R# )r(   T)r?   preserve_modeN)r	   target_pathr   r
   
ensure_dirr   r   r   r   
write_filer   r   _render_persistent_net)r   r  r#  r$  fpeniheadernetruless   &&&&   r   render_network_stateRenderer.render_network_state  s       7./$(OOO(?(?(NNO''0B0BCHOOBGGOOH56OO33MB" r    )r   r   r   r   )r(   F)NN)__name__
__module____qualname____firstlineno____doc__r   r   r  r   r.  __static_attributes____classdictcell__)r   s   @r   r   r     sH     J
 
O ObB BH4D 4Dl  r    r   c                $    V ^8  d   QhR\         /# )r   r   )r   )r   s   "r   r   r     s     
 
4 
r    c                      . ROp RR.pV  F#  p\         P                  ! W!R7      '       d   K"   R# 	  Rp\        P                  P	                  V4      '       g   R# R# )ifqueryz/sbinz	/usr/sbin)r   Fz/etc/network/interfacesT)r:  ifupifdown)r	   r   r   r   r   )expectedr   penis       r   	availabler@    sM    ,H{#Fzz!++  $C77>>#r    )zpre-upr   zpost-upr   zpre-downz	post-down)bridge_ageingbridge_bridgeprio	bridge_fdbridge_gcinitbridge_hellobridge_maxagebridge_maxwait
bridge_stp)r"   r#   r-   r   r.   r/   pointtopointmediar1   hostname
leasehours	leasetimevendorclientbootfiler   hwaddrproviderframenetnumendpointlocalttlr0  )+rn   r7   r   loggingr   r   
contextlibr   typingr   r   r   r   	cloudinitr   r	   r
   cloudinit.netr   r   r   r   r   r   r   cloudinit.net.network_stater   	getLoggerr1  r]   r   r   r   rC   rd   rr   r   timedr   r   r9   r   r@  rm   r    r   <module>r`     s        	 	  , , - -   5! 	  8^D?D4C*L (). *.&ERHix   iX	
r    