
    쑛hx`              
          d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ  ej6                  e      Zg dZg dZg d	Z d
e!de!de"dee#   fdZ$d
e!de%dee#   dee#   fdZ&	 d"d
e!de"dee#   fdZ'de!de#de#de#ddf
dZ( ejR                  d      de#de!fd       Z*de!de!fdZ+de#de"de"fdZ, G d d ejZ                        Z-de"fd!Z.y)#    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)NetworkState)zpre-upupzpost-updownzpre-downz	post-down)bridge_ageingbridge_bridgeprio	bridge_fdbridge_gcinitbridge_hellobridge_maxagebridge_maxwait
bridge_stp)addressnetmask	broadcastnetworkmetricgatewaypointtopointmediamtuhostname
leasehours	leasetimevendorclientbootfileserverhwaddrproviderframenetnumendpointlocalttlifacesubnetis_ipv6returnc           	         g }g d}|j                         D ]  \  }}|dk(  r|dk(  r|d   d|d   }|s!||v s&t        |t              rE|dk(  r.t        t        t	        j
                  t        |      |            }dj                  |      }n|dk(  rt        ||      sd	|v r|j                  d	d
      }|j                  dj                  ||              t        |      S )N)
r   r   r   r!   r"   pointopointr%   scope
dns_searchdns_nameserversr   r   /prefixr<   )r6    _-    {0} {1})items
isinstancelistfilter	functoolspartialhas_same_ip_versionjoinreplaceappendformatsorted)r4   r5   r6   content	valid_mapkeyvalues          3/usr/lib/python3/dist-packages/cloudinit/net/eni.py_iface_add_subnetrT   J   s    GI lln =
U))%i0&2BCESI%%&++ %-- 3W "	E ++4G75 czkk#s+NN=//U;<1=4 '?    indexipv4_subnet_mtuc                 `   |dk7  rg S g }g d}g d}ddi}| d   dvr|j                  d       | j                         D ]  \  }}|j                  ||      }	d|	v r|	j                  dd	      }	t	        |t
              r	| |   rd
nd}|r||v rN|dk(  r#|r!||k7  rt        j                  d| d   ||       v||v r)|D ]#  }
|j                  dj                  |	|
             % t	        |t              rdj                  |      }|j                  dj                  |	|              t        |      S )Nr   )
control	device_iddnsdriverrV   inetmodenamesubnetstype)bridge_pathcostbridge_portpriobridge_waitportmac_address	hwaddressra   )bondbridge
infinibandvlanr@   rA   onoffr%   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r_   rB   r?   )rL   rC   getrK   rD   boolLOGwarningrM   rE   rJ   rN   )r4   rV   rW   rO   
ignore_mapmultiline_keysrenamesrQ   rR   	key_writevs              rS   _iface_add_attrsrv   v   sV    z	GJN k*GV}DD-(kkm ?
UKKS)	)!))#s3IeT"!#JDEEz)%<O':&M# .  C}33IqABCeT"HHUOE}++Iu=>3?6 '?rU   render_hwaddressc                 @   | d   }| d   }|dk(  rd}n|dv rd|z   }nd|z   }| j                         }|j                  ||d        dj                  di | d	j                  di |g}|r2| j                  d
      r!|j	                   dj                  di |       |S )Nr_   rY   auto)hotplugzallow-z
# control-)fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}re   z    hwaddress {mac_address} )copyupdaterM   rm   rL   )r4   rV   rw   r{   rY   r|   substliness           rS   _iface_start_entryr      s     V}HIG&	L	 7"w&JJLE	LLh78 	$##,e,/(//8%8E EIIm49299BEBCLrU   ifacescontentssrc_dirsrc_pathc                 *   d}|j                         D ]F  }|j                         }|j                  d      r&|j                  d      }|d   }|dk(  r]|d   }|j                  d      s t        j
                  j                  ||      }t        j                  |      D ]  }	t	        j                  |	      }
|
D cg c]u  }t        j
                  j                  t        j
                  j                  |	|            r6t        j                  d|       t        j
                  j                  |	|      w }
}|
D ]o  }t        j                  |      j                         }t        j
                  j                  |      }t        | |t        j
                  j!                  |      |       q  |d	k(  r|d   }|j                  d      s t        j
                  j                  ||      }t        j                  |      D ]  }	t#        |	d
      5 }|j%                         j                         }ddd       t        j
                  j                  |	      }t        | t        j
                  j!                  |      |        s|dk(  r|dd D ]  }|| vrd|i| |<   d| |   d<    |dk(  rB|dd \  }}}|| vrd|i| |<   nd| |   v rt'        d|d|d      || |   d<   || |   d<   |}|dk(  r|d   dk(  r|d   }n|d   }|| |   d<    |t(        v r|d   | |   |<   |t*        v r:|| |   vrg | |   |<   | |   |   j-                  dj                  |dd              W|j                  d      r}d| |   vri | |   d<   |dk(  r1g | |   d   d<   |dd D ]  }| |   d   d   j-                  |        |dk(  sg | |   d   d<   |dd D ]  }| |   d   d   j-                  |        |j                  d      rd| |   vri | |   d<   |t.        v r#|j1                  dd d      }|d   | |   d   |<   1|d!k(  r1g | |   d   d"<   |dd D ]  }| |   d   d"   j-                  |        g|d#k(  r6|d   j3                         d$k(  r|d   | |   d   d$<   |d   | |   d   d$<   |d%k(  r+d&| |   d   vri | |   d   d&<   |d   | |   d   d&   |d   <   |d'k(  sd(| |   d   vri | |   d   d(<   |d   | |   d   d(   |d   <   |j                  d)      sd*| |   vri | |   d*<   |j1                  d)d d      }|d   | |   d*   |<   I | j5                         D ]  }d| |   vsd+| |   d<    yc c}w # 1 sw Y   ZxY w),a~  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?   r   zsource-directory   r=   z^[a-zA-Z0-9_-]+$sourcerry   _source_pathTr4      familyz
Interface z* can only be defined once. Re-defined in 'z'.methodrf   ether   zdns-r[   z
dns-searchsearchzdns-nameserversnameserversbridge_rh    bridge_portsports	bridge_hwmacrb   pathcostrc   portpriozbond-rg   F)
splitlinesstrip
startswithsplitospathrJ   globlistdirisfilerematchr
   load_text_fileabspath_parse_deb_config_datadirnameopenreadr   NET_CONFIG_OPTIONSNET_CONFIG_COMMANDSrL   NET_CONFIG_BRIDGE_OPTIONSrK   lowerkeys)r   r   r   r   currifliner   optionparsed_src_direxpanded_pathdir_contentsr   entrysrc_data	abs_entrynew_src_pathfpabs_pathr4   r   r   valdomainr,   bridge_optionbond_options                             rS   r   r      sQ    F##% r;zz|??3

3q''"1XN!,,S1!#g~!F!%>!: !zz-8 !- rww||M4'HIHH%7>J	 GGLL5    * E#2259??AH " 6I*"''//)*Di  x 8L**3/!ww||G\B!%<!8 -- 1!wwy0H177??=9&Hbggooh&?	 vqr -& '%F5M )-uf%- w$)!AJ!E66F" #H!u VE]*!-2H>  '-F5M(#&,F5M(#F{"Qx7"AhAh*-F6N;'))%*1XF6N6"**VF^+)+vv&6N6"))#((59*=>v&F6N*(*vu%%24vu%h/#ABi CF6N5)(3::6BC,,79vu%m4#ABi HF6N5)-8??GHy)vf~-+-vx(22 &y"a @:?(vx(7>)46vx(1"12Y DE6N8,W5<<UCD;&
 8>>#u,6;AhF6N8,U36;AhF6N8,U3,,VF^H%==;=F6N8,Z8AFqvx(4U1X>,,VF^H%==;=F6N8,Z8AFqvx(4U1X>w'VF^+)+vv& .."a8K27(F6N6";/er;f  *&$)F5M&!*O &1 1s   =A:VVVzConverting eni dataeni_datac                 :    i }t        || dd       t        |      S )z=Return a network config representation of what is in eni_dataNone)r   r   )r   _ifaces_to_net_config_data)r   r   s     rS   convert_eni_datar   X  s"     F68VfM%f--rU   c                    i }| j                         D ]  \  }}|j                  d      d   }||vr"|dk(  rd}nd}||g d||<   d|v r|d   ||   d<   ||d	   d
}|j                  d      rd|d<   nd|d<   |j                  d	      dk(  r|d   |d<   dD ]  }||v s||   ||<    d|v r&dD ]!  }||d   v s|d   |   s|d   |   |d|z   <   # ||   d   j                  |        dt	        |      D 	cg c]  }	||	   	 c}	dS c c}	w )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).:r   loloopbackphysical)ra   r_   r`   rf   re   r   )_orig_eni_namera   ry   rY   manualstaticr   )r   r"   r   r[   )r   r   dns_r`   r   )versionconfig)rC   	partitionrm   rL   rN   )
r   devsr_   datadevnamedtyper5   copy_keynds
             rS   r   r   `  sn   
 Dlln 0
d..%a($$""%*GKDM d"/3K/@Wm,$($x.A88F &F9 (F988H) $YF9; 	2H4#'>x 	2 D=. 8U#UA)-eQF6A:&8 	Wi ''/=0@ fTl$CT!W$CDD$Cs   8D	addr_or_netc                 f    |st        |       xs t        |       S t        |       xs t        |       S N)r   r   r   r   )r   r6   s     rS   rI   rI     s/    {+K{/KK;'G?;+GGrU   c            	           e Zd ZdZddee   fdZddededee   fdZ		 dd	ed
e
deee      fdZ	 dded
e
defdZ	 	 ddedee   dee   ddfdZy)Rendererz@Renders network information in a /etc/network/interfaces format.Nr   c                     |si }|j                  dd      | _        |j                  dd       | _        |j                  dd      | _        y )Neni_pathzetc/network/interfaces
eni_headernetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)rm   r   r   r   )selfr   s     rS   __init__zRenderer.__init__  sF    F

:/GH **\48#ZZG
rU   routeindentr7   c                    g }|dz   }|dz   }d}ddd}d}|d   d	k(  r|d
   d	k(  rd}n|d   dk(  r
|d   dk(  rd}d}	dD ]  }
|r|
dk(  r|
dk(  r|	|d||
   d||
   z  }	$|
|v s)|
dk(  rJt        ||
         r|	dz  }	n|j                  d      dk(  r|	dz  }	n|	dz  }	d|v sf|	d||
   d|d   z  }	x|	d||
   d||
   z  }	 |j                  ||	z   |z          |j                  ||	z   |z          |S )a  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
        zpost-up route addzpre-down route delz || truegwr!   )r"   r!   r   r    z0.0.0.0r   z defaultz::r>   r   z -A inet6 default)r    r"   r!   r"   r?   z	 -A inet6    z -hostz -netr=   )r   rm   rL   )r   r   r   rO   r   r   or_truemapping
default_gw
route_lineks              rS   _render_routezRenderer._render_route  sf    )),,

 
y(U9-=-J#J9%%/Q*>,J
1 	DAa9nI~J
E!HMM
e	>&uQx0"k1
8,2"h.
"g-
5("%(E(O&LL
gaj%("CCJ!	D" 	rJ01tj(723rU   r4   rw   c           	      4   t        j                  |      }t        t              5  |j	                  d       d d d        g }|j                  di       }|j	                  dd       }|j	                  dd       }|rd|d<   |rd }g }t        |      D ]  \  }	d }
|	|d<   d   |d	<   j                  d
d      |d
<   d}t              rd}|dz  }nd}j                  d      }
||d<   d   dk(  sd   dk(  sd   dk(  rd|d	<   |K|rdnd|d<   nAd   dk(  rd|d	<   d|d<   n.d   dk(  rd|d	<   d|d<   nt              rd|d	<   |	|rdnd|d<   d|D cg c]  }d|d   z  |v  c}v rd|d
<   dv xs dv }||rt        fd d!D              }||si |t        t        ||	|"      t        ||      z   t        ||	|
      z         }j                  d#g       D ]U  }t        |j                  d$d%            }|r|s|j                  |       4|j                  | j!                  |d&'             W |r;|r9|D ]$  }|j                  | j!                  |d&'             & |j#                          |j                  |        |r||d   |d
   dd(d)}d|d*|i |t        t        |d+|"      t        |d      z         }d#   D ]$  }|j                  | j!                  |d&'             & |j                  |       |S g }d,|v sd-|v r!|j                   d.j$                  d2i |       |j                   d/j$                  d2i |       |j                  t        |d0d 1             |j                  |       |S # 1 sw Y   RxY wc c}w )3N	config_idr`   z	accept-ra	wakeonlangzethernet-wolrV   ra   r^   rY   ry   r]   T6Fr%   dhcp4dhcp6zipv6_dhcpv6-statefuldhcp10	accept_razipv6_dhcpv6-stateless
ipv6_slaacr   zauto %sr_   aliasr;   r<   c              3   D   K   | ]  }|j                  |      f  y wr   )rm   ).0r   r5   s     rS   	<genexpr>z)Renderer._render_iface.<locals>.<genexpr>  s&       FJJqM*s    )r;   r<   rw   routesr    r   z    )r   inet6)r_   rY   r^   r]   )ra   r  zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )rV   rW   r}   )r~   deepcopyr   KeyErrorpoprm   	enumerater   dictrE   r   rT   rv   r   rL   extendr   clearrM   )r   r4   rw   sectionsr`   r   ethernet_wolr[   routes6rV   rW   subnet_inetr6   r   dns_presentr   r   ipv6_networkr5   s                     @rS   _render_ifacezRenderer._render_iface  sg    e$ h 	#IIk"	#$&))Ir*IIk40	yyd3$'E.!CG!*7!3 O'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<@Iv/47  (/E)$
 !F*I.?6.I  ;; !B C ?;..#.F&u7G (vw?@ 'ue_E	F $ZZ"5 KE#2599Y3K#LL#Gu- LL!3!3E&!3!IJK w!( OT%7%7f%7%MNOMMO&_O'b  "&M$Y/$#	 #+g>?..#.F&r4D (vt<= $H- KELL!3!3E&!3!IJK&  E%%)?1]11:E:;LL<5<<EuEFLL aF OOE"y	# 	#ls   NNNnetwork_statec                   
 ddddddgd}|j                         D ],  }|j                  d      dk(  st        j                  |      }. |j                  }|r||d	   d
   d<   |j
                  }|r||d	   d
   d<   d
dddddd
g }|j                  | j                  |             t        |j                         
fd      D ]9  }|j                  d      dk(  r|j                  | j                  ||             ; |j                         D ]"  }|j                  | j                  |             $ dj                  |D 	cg c]  }	dj                  |	       c}	      dz   S c c}	w )z1Given state, emit etc/network/interfaces content.r   r   r]   r   ry   )ra   rY   )r_   ra   r]   r`   r_   r`   r   r<   r;   r   r      r      )r   r   ri   rg   rh   rj   c                     | d      | d   fS )Nra   r_   r}   )r   orders    rS   <lambda>z-Renderer._render_interfaces.<locals>.<lambda>{  s    56+QvY7 rU   )rQ   r   z


)iter_interfacesrm   r~   r  r<   dns_searchdomainsr	  r  rN   iter_routesrL   r   rJ   )r   r  rw   r   r4   r   searchdomainsr  r   sr  s             @rS   _render_interfaceszRenderer._render_interfacesS  s    !+?@	
 #224 	*Eyy D(]]5)	* $332=ByM!./%77-:ByM!\*
 
 **2./))+7
 		E
 yy D(OO""5;K"L		 #..0 	7EOOD..u56	7 {{(;QDIIaL;<tCC;s   E)	templatestargetc                 8   t        j                  || j                        }t        j                  t
        j                  j                  |             | j                  r| j                  nd}t        j                  ||| j                  |      z          | j                  rzt        j                  || j                        }t        j                  t
        j                  j                  |             t        j                  || j                  |      d       y y )Nr   T)rO   preserve_mode)r	   target_pathr   r
   
ensure_dirr   r   r   r   
write_filer  r   _render_persistent_net)r   r  r   r!  fpeniheadernetruless          rS   render_network_statezRenderer.render_network_state  s       7./$(OOv(?(?(NNO''0B0BCHOOBGGOOH56OO33MB" rU   r   )r   F)NN)__name__
__module____qualname____doc__r   r  r   strr   r   rn   r  r   r  r+  r}   rU   rS   r   r     s    J
x~ 
24 2 2d3i 2j 5:BB-1B	d3iBJ EJ4D)4D=A4D	4Dr %) $	# D> 	
 
rU   r   c                      g d} ddg}| D ]  }t        j                  ||      r y d}t        j                  j	                  |      syy)N)ifqueryifupifdownz/sbinz	/usr/sbin)r   Fz/etc/network/interfacesT)r	   whichr   r   r   )expectedr   penis       rS   	availabler:    sN    ,H{#F zz!F+ $C77>>#rU   r,  )/r~   rG   r   loggingr   r   
contextlibr   typingr   r   r   r   	cloudinitr   r	   r
   cloudinit.netr   r   r   r   r   r   r   cloudinit.net.network_stater   	getLoggerr-  ro   r   r   r   r  rn   r1  rT   intrv   r   r   timedr   r   rI   r   r:  r}   rU   rS   <module>rD     s       	 	  , , - -   5g! 	  8(T (4 ($ (49 (X???.6sm?	#Y?F 27*.	#Y4C*C*C**-C*9<C*	C*L ().s .t . *.&Et &E &ERHS H4 HD HLx   L^
4 
rU   