
    x[hS                     :   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
JrJr  S SKJrJrJr  S SKJr  \R&                  " \5      r/ SQr/ SQr/ S	QrS
 rS rSS jrS r\
R:                  " S5      S 5       rS r " S S\R@                  5      r SS jr!g)    N)suppress)Optional)performancesubputil)ParserError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ttlc                 l   / n/ SQnUR                  5        H  u  pEUS:X  a  M  US:X  a  US   < SUS   < 3nU(       d  M+  XC;   d  M2  [        U[        5      (       a  SR                  U5      nSU;   a  UR	                  SS5      nUR                  S	R                  XE5      5        M     [        U5      $ )
N)
r   r   r   r   r   pointopointr   scope
dns_searchdns_nameserversr   r   /prefix _-    {0} {1})items
isinstancelistjoinreplaceappendformatsorted)ifacesubnetcontent	valid_mapkeyvalues         3/usr/lib/python3/dist-packages/cloudinit/net/eni.py_iface_add_subnetrG   A   s    GI lln
))%i0&2BCE5S%%&&czkk#s+NN=//;< % '?    c           
         US:w  a  / $ / n/ SQn/ SQnSS0nU S   S;  a  UR                  S5        U R                  5        H  u  px[        U[        5      (       a  X   (       a  SOS	nU(       a  Xt;   a  M5  US
:X  a)  U(       a"  X:w  a  [        R                  SU S   UU5        Md  Xu;   a;  U H3  n	UR                  SR                  UR                  Xw5      U	5      5        M5     M  [        U[        5      (       a  SR                  U5      nUR                  SR                  UR                  Xw5      U5      5        M     [        U5      $ )Nr   )	control	device_iddriverindexinetmodenamesubnetstype)bridge_pathcostbridge_portpriobridge_waitportmac_address	hwaddressrR   )bondbridge
infinibandvlanonoffr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rP   r7   r4   )r=   r8   r9   boolLOGwarningr>   getr:   r;   r?   )
r@   rM   ipv4_subnet_mturB   
ignore_mapmultiline_keysrenamesrD   rE   vs
             rF   _iface_add_attrsrg   _   s.    z	G
JN k*GV}DD-(kkm
eT""!JDEE)%<O':&M#  }33GKK4I1MN eT""HHUOE}++GKK,A5IJ- $0 '?rH   c                 X   U S   nU S   nUS:X  a  SnOUS;   a  SU-   nOSU-   nU R                  5       nUR                  X5S.5        SR                  " S0 UD6S	R                  " S0 UD6/nU(       a7  U R                  S
5      (       a!  UR	                  SR                  " S0 UD65        U$ )NrP   rJ   auto)hotplugzallow-z
# control-)fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}rV   z    hwaddress {mac_address} )copyupdater>   ra   r=   )r@   rM   render_hwaddressrk   rJ   rl   substliness           rF   _iface_start_entryrs      s    V}HIG&	L	 7"w&JJLE	LLh78 	##,e,(//8%8E EIIm44299BEBCLrH   c                    SnUR                  5        GH  nUR                  5       nUR                  S5      (       a  M,  UR                  S5      nUS   nUS:X  Gat  US   nUR                  S5      (       d  [        R
                  R                  X(5      n[        R                  " U5       GH  n	[        R                  " U	5      n
U
 Vs/ s H  n[        R
                  R                  [        R
                  R                  X5      5      (       d  MF  [        R                  " SU5      c  M`  [        R
                  R                  X5      PM     n
nU
 Hp  n[        R                  " U5      R                  5       n[        R
                  R                  U5      n[        X[        R
                  R!                  U5      U5        Mr     GM     GM  US	:X  a  US   nUR                  S5      (       d  [        R
                  R                  X/5      n[        R                  " U5       H  n	[#        U	S
5       nUR%                  5       R                  5       nSSS5        [        R
                  R                  U	5      n[        U W[        R
                  R!                  U5      U5        M     GM  US:X  a$  USS  H  nUU ;  a  SU0U U'   SU U   S'   M     GM  US:X  aI  USS u  nnnUU ;  a  SU0U U'   OSU U   ;   a  ['        SU< SU< S35      eUU U   S'   UU U   S'   UnGM  US:X  a  US   S:X  a  US   nOUS   nUX   S'   GM7  U[(        ;   a  US   X   U'   GMN  U[*        ;   a:  XpU   ;  a  / X   U'   X   U   R-                  SR                  USS 5      5        GM  UR                  S5      (       a  SX   ;  a  0 X   S'   US:X  a2  / X   S   S'   USS  H  nX   S   S   R-                  U5        M     GM  US:X  a2  / X   S   S'   USS  H  nX   S   S   R-                  U5        M     GM'  GM*  UR                  S5      (       Ga  SX   ;  a  0 X   S'   U[.        ;   a#  UR1                  SS S5      nUS   X   S   U'   GM}  US!:X  a2  / X   S   S"'   USS  H  nX   S   S"   R-                  U5        M     GM  US#:X  a7  US   R3                  5       S$:X  a  US   X   S   S$'   GM  US   X   S   S$'   GM  US%:X  a+  S&X   S   ;  a
  0 X   S   S&'   US   X   S   S&   US   '   GM#  US':X  a+  S(X   S   ;  a
  0 X   S   S('   US   X   S   S(   US   '   GMT  GMW  UR                  S)5      (       d  GMp  S*X   ;  a  0 X   S*'   UR1                  S)S S5      nUS   X   S*   U'   GM     U R5                  5        H  nSU U   ;  d  M  S+U U   S'   M     gs  snf ! , (       d  f       GN= f),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#r4   r   zsource-directory   r2   z^[a-zA-Z0-9_-]+$sourcerri   _source_pathTr@      familyz
Interface z* can only be defined once. Re-defined in 'z'.methodrW   ether   zdns-dnsz
dns-searchsearchzdns-nameserversnameserversbridge_rY    bridge_portsports	bridge_hwmacrS   pathcostrT   portpriozbond-rX   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)ifacescontentssrc_dirsrc_pathcurrifliner   optionparsed_src_direxpanded_pathdir_contentsr   entrysrc_data	abs_entrynew_src_pathfpabs_pathr@   r{   r|   valdomainr%   bridge_optionbond_options                             rF   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qr& '%F5M )-uf% # w$)!AJ!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/#ABiFN5)(3::6B (,,79u%m4#ABiFN5)-8??G ( - y))v~-+-x(22 &y"a @:?(x(7>)46x(1"12YE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W"W"-#W"5W''
W6zConverting eni datac                 2    0 n[        XSSS9  [        U5      $ )z=Return a network config representation of what is in eni_dataN)r   r   )r   _ifaces_to_net_config_data)eni_datar   s     rF   convert_eni_datar   7  s      F6TDI%f--rH   c                 H   0 nU R                  5        H  u  p#UR                  S5      S   nXA;  a"  US:X  a  SnOSnXT/ S.X'   SU;   a
  US   X   S'   X#S	   S
.nUR                  S5      (       a  SUS'   OSUS'   UR                  S	5      S:X  a  US   US'   S H  nXs;   d  M
  X7   Xg'   M     SU;   a0  S H*  nXS   ;   d  M  US   U   (       d  M  US   U   USU-   '   M,     X   S   R                  U5        M     S[	        U5       V	s/ s H  oU	   PM	     sn	S.$ s  sn	f )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)rR   rP   rQ   rW   rV   r|   )_orig_eni_namerR   ri   rJ   manualstaticr   )r   r   r   r   )r   r   dns_rQ   rv   )versionconfig)r8   	partitionra   r=   r?   )
r   devsrP   datadevnamedtyperA   copy_keynds
             rF   r   r   ?  sP   
 Dlln
..%a($""%*KDM d"/3K/@m,$(x.A88F &F9 (F988H) $YF9;H#'>  < D=.U#UA)-eQF6A:& / 	i ''/= %@ fTl$Cl!Wl$CDD$Cs   Dc                   d    \ rS rSrSrSS jrSS jrSS jrSS jr  SS\	S	\
\   S
S4S jjrSrg)Rendererih  z@Renders network information in a /etc/network/interfaces format.Nc                     U(       d  0 nUR                  SS5      U l        UR                  SS 5      U l        UR                  SS5      U l        g )Neni_pathetc/network/interfaces
eni_headernetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)ra   r   r   r   )selfr   s     rF   __init__Renderer.__init__k  sF    F

:/GH **\48#ZZG
rH   c                    / nUS-   nUS-   nSnSSS.nSnUS   S	:X  a  US
   S	:X  a  SnOUS   S:X  a  US   S:X  a  SnSn	S H  n
U(       a  U
S:X  a  M  U
S:X  a  X< SXz   < SX   < 3-  n	M-  X;   d  M4  U
S:X  aJ  SX   ;   a  U	S-  n	O UR                  S5      S:X  a  U	S-  n	OU	S-  n	SU;   a  U	SX   < SUS   < 3-  n	M  M  U	SXz   < SX   < 3-  n	M     UR                  XI-   U-   5        UR                  XY-   U-   5        U$ )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
zpost-up route addzpre-down route delz || truegwr   )r   r   r   r   z0.0.0.0r   z defaultz::r3   r   z -A inet6 default)r   r   r   r   r4   r   z	 -A inet6    z -hostz -netr2   )ra   r=   )r   routeindentrB   r   r   or_truemapping
default_gw
route_lineks              rF   _render_routeRenderer._render_routet  sS    )),,

 
y(U9-=-J#J9%%/Q*>,J
1Aa9nI~J
EHMM
	>eh"k1
8,2"h.
"g-
5("%(E(O&LL
 ) gj%("CCJ! 2" 	r01t(723rH   c           	      D   [         R                  " U5      n[        [        5         UR	                  S5        S S S 5        / nUR                  S0 5      nUR	                  SS 5      nUR	                  SS 5      nU(       a  SUS'   U(       Ga  [        U5       GHp  u  pxS n	XqS'   US   US	'   UR                  S
S5      US
'   Sn
[        U5      (       a  U
S-  n
OUR                  S5      n	XS'   US   S:X  d  US   S:X  d	  US   S:X  a  SUS	'   Ub  U(       a  SOSUS'   ONUS   S:X  a  SUS	'   SUS'   O:US   S:X  a  SUS	'   SUS'   O&[        U5      (       a  SUS	'   Ub  U(       a  SOSUS'   SU Vs/ s H  nSUS   -  U;   PM     sn;   a  SUS
'   [        [        XUS9[        X5      -   [        XU	5      -   5      nUR                  S/ 5       H"  nUR                  U R                  USS 95        M$     UR                  U5        GMs     U$ / nS!U;   d  S"U;   a!  UR                  S#R                  " S'0 UD65        UR                  S$R                  " S'0 UD65        UR                  [        US%S S&95        UR                  U5        U$ ! , (       d  f       GNZ= fs  snf )(N	config_idrQ   z	accept-ra	wakeonlangzethernet-wolrM   rR   rO   rJ   ri   rN   6r   dhcp4dhcp6zipv6_dhcpv6-statefuldhcp10	accept_razipv6_dhcpv6-stateless
ipv6_slaacr   Tzauto %srP   aliasrp   routesz    )r   zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )rM   rb   rm   )rn   deepcopyr   KeyErrorpopra   	enumerater
   r:   rs   rG   rg   extendr   r=   r>   )r   r@   rp   sectionsrQ   r   ethernet_wolrM   rA   rb   subnet_inetr   rr   r   s                 rF   _render_ifaceRenderer._render_iface  s   e$ hIIk"  ))Ir*IIk40	yyd3$'E.!!*7!3"&!&g &vf#)::i#@i $!&))3&K&,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)$&7G (67 'u_E	F $ZZ"5ELL!3!3E&!3!IJ 6 &o "4D  E%%)?]11:E:;LL5<<EuEFLL aF OOE"Y  ds   J2J
Jc                 <  ^
 SSSSSS./S.nUR                  5        H0  nUR                  S5      S:X  d  M  [        R                  " U5      nM2     UR                  nU(       a  S	R                  U5      US
   S   S'   UR                  nU(       a  S	R                  U5      US
   S   S'   SSSSSSS.m
/ nUR                  U R                  U5      5        [        UR                  5       U
4S jS9 H8  nUR                  S5      S:X  a  M  UR                  U R                  XBS95        M:     UR                  5        H#  nUR                  U R                  U5      5        M%     SR                  U V	s/ s H  n	SR                  U	5      PM     sn	5      S-   $ s  sn	f )z1Given state, emit etc/network/interfaces content.r   r   rN   r   ri   )rR   rJ   )rP   rR   rN   rQ   rP   r4   rQ   r   r1   r0   rv   r~      rz      )r   r   rZ   rX   rY   r[   c                    > TU S      U S   4$ )NrR   rP   rm   )r   orders    rF   <lambda>-Renderer._render_interfaces.<locals>.<lambda>   s    56+QvY7rH   )rD   r   z


)iter_interfacesra   rn   r   r1   r;   dns_searchdomainsr   r   r?   iter_routesr=   r   )r   network_staterp   r   r@   r   searchdomainsr   r   sr   s             @rF   _render_interfacesRenderer._render_interfaces  s    !+?@	
 #224Eyy D(]]5) 5 $3325((;2GByM!./%77-0XXm-DByM!\*
 
 **2./))+7
E
 yy D(OO""5"L
 #..0EOOD..u56 1 {{(;(QDIIaL(;<tCC;s   4Fr  	templatesreturnc                 L   [         R                  " X0R                  5      n[        R                  " [
        R                  R                  U5      5        U R                  (       a  U R                  OSn[        R                  " XEU R                  U5      -   5        U R                  (       ay  [         R                  " X0R                  5      n[        R                  " [
        R                  R                  U5      5        [        R                  " UU R                  U5      SS9  g g )Nr   T)rB   preserve_mode)r   target_pathr   r   
ensure_dirr   r   r   r   
write_filer  r   _render_persistent_net)r   r  r
  targetfpeniheadernetruless          rF   render_network_stateRenderer.render_network_state.  s       7./$(OO(?(?(NNO''0B0BCHOOBGGOOH56OO33MB" rH   )r   r   r   N)r   F)NN)__name__
__module____qualname____firstlineno____doc__r   r   r   r  r   r   dictr  __static_attributes__rm   rH   rF   r   r   h  sP    J
2hPd2Dn %)	# D>
 
 rH   r   c                     / SQnSS/nU H  n[         R                  " X2U S9(       a  M    g   [         R                  " U S5      n[        R                  R                  U5      (       d  gg)N)ifqueryifupifdownz/sbinz	/usr/sbin)r   r  Fr   T)r   whichr  r   r   r   )r  expectedr   penis        rF   	availabler)  C  s]    ,H{#Fzz!6::  

6#;
<C77>>#rH   r  r  )"rn   r   loggingr   r   
contextlibr   typingr   	cloudinitr   r   r   cloudinit.netr   r	   r
   cloudinit.net.network_stater   	getLoggerr  r_   r   r   r   rG   rg   rs   r   timedr   r   r   r)  rm   rH   rF   <module>r2     s       	 	   - - ? ? 4! 	  8<9x0A*H (). *.&ERXx   Xv
rH   