
    x[hS                     6   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 d dl	m
Z
mZmZ d dlmZmZmZ d dlmZ  ej&                  e      Zg dZg dZg d	Zd
 Zd ZddZd Z e
j:                  d      d        Zd Z G d dej@                        Z ddZ!y)    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                 D   g }g d}|j                         D ]}  \  }}|dk(  r|dk(  r|d   d|d   }|s!||v s&t        |t              rdj                  |      }d|v r|j	                  dd      }|j                  d	j                  ||              t        |      S )
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 
=
U))%i0&2BCESI%%&czkk#s+NN=//U;<
= '?    c           
      P   |dk7  rg S g }g d}g d}ddi}| d   dvr|j                  d       | j                         D ]  \  }}t        |t              r	| |   rdnd	}|r||v r&|d
k(  r#|r!||k7  rt        j                  d| d   ||       N||v r9|D ]3  }	|j                  dj                  |j                  ||      |	             5 t        |t              rdj                  |      }|j                  dj                  |j                  ||      |              t        |      S )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   _   sD    z	G
JN k*GV}DD-(kkm K
UeT"!#JDEEz)%<O':&M# .  O}33GKKS4I1MNOeT"HHUOE}++GKKS,A5IJ-K0 '?rH   c                 @   | 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 )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9299BEBCLrH   c                 *   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#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      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 datac                 :    i }t        || dd       t        |      S )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68TDI%f--rH   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)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   ?  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	c                   P    e Zd ZdZddZddZddZddZ	 	 ddede	e
   d	dfd
Zy)Rendererz@Renders network information in a /etc/network/interfaces format.Nc                     |si }|j                  dd      | _        |j                  dd       | _        |j                  dd      | _        y )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__zRenderer.__init__k  sF    F

:/GH **\48#ZZG
rH   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(  rCd||
   v r|	dz  }	n|j                  d      dk(  r|	dz  }	n|	dz  }	d|v s_|	d||
   d|d   z  }	q|	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::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_routezRenderer._render_routet  se    )),,

 
y(U9-=-J#J9%%/Q*>,J
1 	DAa9nI~J
E!HMM
e	>eAh"k1
8,2"h.
"g-
5("%(E(O&LL
gaj%("CCJ!	D" 	rJ01tj(723rH   c           	         t        j                  |      }t        t              5  |j	                  d       d d d        g }|j                  di       }|j	                  dd       }|j	                  dd       }|rd|d<   |rit        |      D ]X  \  }}d }	||d<   |d   |d	<   |j                  d
d      |d
<   d}
t        |      r|
dz  }
n|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
<   t        t        |||      t        ||      z   t        |||	      z         }|j                  dg       D ]$  }|j                  | j                  |d              & |j                  |       [ |S g }d!|v sd"|v r!|j                   d#j                  d'i |       |j                   d$j                  d'i |       |j                  t        |d%d &             |j                  |       |S # 1 sw Y   1xY wc c}w )(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_ifacezRenderer._render_iface  s   e$ h 	#IIk"	#))Ir*IIk40	yyd3$'E.!!*7!3 7'v"&!&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<@Iv/47  (/E)$&u7G (v67 'ue_E	F $ZZ"5 KELL!3!3E&!3!IJK &o7'D  E%%)?1]11:E:;LL<5<<EuEFLL aF OOE"Y	# 	#ds   I&I3&I0c                   
 ddddddgd}|j                         D ],  }|j                  d      dk(  st        j                  |      }. |j                  }|rd	j                  |      |d
   d   d<   |j                  }|rd	j                  |      |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   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                     | d      | d   fS )NrR   rP   rm   )r   orders    rF   <lambda>z-Renderer._render_interfaces.<locals>.<lambda>   s    56+QvY7 rH   )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_interfaceszRenderer._render_interfaces  s    !+?@	
 #224 	*Eyy D(]]5)	* $3325((;2GByM!./%77-0XXm-DByM!\*
 
 **2./))+7
 		E
 yy D(OO""5;K"L		 #..0 	7EOOD..u56	7 {{(;QDIIaL;<tCC;s   %Fr  	templatesreturnc                 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)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_statezRenderer.render_network_state.  s       7./$(OOv(?(?(NNO''0B0BCHOOBGGOOH56OO33MB" rH   N)r   F)NN)__name__
__module____qualname____doc__r   r   r   r  r   r   dictr  rm   rH   rF   r   r   h  sK    J
2hPd2Dn %)	# D>
 
rH   r   c                     g d}ddg}|D ]  }t        j                  |||       r y t        j                  | d      }t        j                  j                  |      syy)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!F6: 

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>r*     s       	 	   - - ? ? 4g! 	  8<9x0A*H (). *.&ERXx   Xv
rH   