
    ܍~cAV                        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
 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d Zd Zd Z G d dej                  ZddZddZ dS )    N)Optional)log)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                    g }g d}|                                 D ]\  }}|dk    r|dk    r|d         d|d         }|rt||v rpt          |          t          k    rd                    |          }d|v r|                    dd          }|                    d	                    ||                     t          |          S )
N)
r   r   r   r   r   pointopointr   scope
dns_searchdns_nameserversr   r   /prefix _-    {0} {1})itemstype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_subnetrF   @   s    G  I llnn 
= 
=
U))%i000&2B2BCE 	=SI%%E{{d""czzkk#s++NN=//U;;<<<'??    c           
         |dk    rg S g }g d}g d}ddi}| d         dvr|                     d           |                                 D ]\  }}t          |          t          k    r| |         rdnd	}|r||v r1|d
k    r,|r*||k    r#t                              d| d         ||           c||v rC|D ]?}	|                     d                    |                    ||          |	                     @t          |          t          k    rd	                    |          }|                     d                    |                    ||          |                     t          |          S )Nr   )	control	device_iddriverindexinetmodenamesubnetsr8   )bridge_pathcostbridge_portpriobridge_waitportmac_address	hwaddressr8   )bondbridge
infinibandvlanonoffr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rO   r6   r3   )r<   r7   r8   boolLOGwarningr=   getr9   r:   r>   )
r?   rL   ipv4_subnet_mturA   
ignore_mapmultiline_keysrenamesrC   rD   vs
             rE   _iface_add_attrsre   ^   s    zz	G
 
 
J  N k*GV}DDD-(((kkmm K K
U;;$!#J1DDEE 	z))%<<O<'':&M#   .   O O}33GKKS4I4I1MMNNNN;;$HHUOOE}++GKKS,A,A5IIJJJJ'??rG   Fc                 P   | d         }| d         }|dk    rd}n|dv rd|z   }nd|z   }|                                  }|                    ||d            dj        di | d	j        di |g}|r5|                     d
          r |                     dj        di |           |S )NrO   rI   auto)hotplugzallow-z
# control-)fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}rT   z    hwaddress {mac_address} )copyupdater=   r_   r<   )r?   rL   render_hwaddressri   rI   rj   substliness           rE   _iface_start_entryrq      s    V}HIG&	L	 	 7"w&JJLLE	LLh77888 	$#,,e,,/(/88%88E  DEIIm44 D929BBEBBCCCLrG   c           
      $   d}|                                 D ]J}|                                }|                    d          r-|                    d          }|d         }|dk    r|d         }|                    d          s t          j                            ||          }t          j        |          D ]Ŋt	          j                  }	fd|	D             }	|	D ]}
t          |
d	          5 }|
                                                                }ddd           n# 1 swxY w Y   t          j                            |
          }t          | |t          j                            |          |           Ɛj|d
k    r|d         }|                    d          s t          j                            ||          }t          j        |          D ]t          d	          5 }|
                                                                }ddd           n# 1 swxY w Y   t          j                                      }t          | |t          j                            |          |           b|dk    r%|dd         D ]}|| vrd|i| |<   d| |         d<   |dk    rT|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         | |         |<   3|t           v rS|| |         vrg | |         |<   | |         |                             d                    |dd                              |                    d          rd| |         vri | |         d<   |dk    rGg | |         d         d<   |dd         D ])}| |         d         d                             |           *|dk    rEg | |         d         d<   |dd         D ])}| |         d         d                             |           *S|                    d          rd| |         vri | |         d<   |t$          v r0|                    dd d          }|d         | |         d         |<   |d!k    rGg | |         d         d"<   |dd         D ])}| |         d         d"                             |           *|d#k    rP|d                                         d$k    r|d         | |         d         d$<   A|d         | |         d         d$<   Z|d%k    rFd&| |         d         vri | |         d         d&<   |d         | |         d         d&         |d         <   |d'k    rDd(| |         d         vri | |         d         d(<   |d         | |         d         d(         |d         <   |                    d)          rCd*| |         vri | |         d*<   |                    d)d d          }|d         | |         d*         |<   L|                                 D ]}d| |         vrd+| |         d<   dS ),a}  Parses the file contents, placing result into ifaces.

    '_source_path' is added to every dictionary entry to define which file
    the configration 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#r3   r   zsource-directory   r1   c                     g | ]t}t           j                            t           j                            |                    r5t	          j        d |          Tt           j                            |          uS )z^[a-zA-Z0-9_-]+$)ospathisfiler:   rematch).0rw   expanded_paths     rE   
<listcomp>z*_parse_deb_config_data.<locals>.<listcomp>   sq          rw||M4'H'HII	 
 H%7>>J	 GLL55 KJJrG   rsourcerg   _source_pathTr?      familyz
Interface z* can only be defined once. Re-defined in 'z'.methodrU   ether   zdns-dnsz
dns-searchsearchzdns-nameserversnameserversbridge_rW    bridge_portsports	bridge_hwmacrQ   pathcostrR   portpriozbond-rV   F)
splitlinesstrip
startswithsplitrv   rw   r:   globlistdiropenreadabspath_parse_deb_config_datadirnamer   NET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr<   NET_CONFIG_BRIDGE_OPTIONSr;   lowerkeys)ifacescontentssrc_dirsrc_pathcurrifliner   optionparsed_src_dirdir_contentsentryfpsrc_data	abs_entrynew_src_pathabs_pathr?   r   r   valdomainr$   bridge_optionbond_optionr|   s                           @rE   r   r      s    F##%% s; s;zz||??3 	

3q'''"1XN!,,S11 G!#g~!F!F!%>!:!:  !z-88        ,      *  EeS)) 5R#%7799??#4#45 5 5 5 5 5 5 5 5 5 5 5 5 5 5 " 6 6I*"'//)*D*Di   	" x 8L**3// C!w||G\BB!%<!8!8  --- 1!wwyy00H1 1 1 1 1 1 1 1 1 1 1 1 1 1 17??=99&Hbgooh&?&?   	 vqrr - -&& '%F5M )-uf%%- w$)!A#J!E66F"" #H!u VE]**!k-2UUHHH>   '-F5M(#&,F5M(#FF{""Qx7""AhAh*-F6N;'')))%*1XF6N6""***VF^++)+vv&6N6"))#((59*=*=>>>>v&& *	;F6N**(*vu%%%24vu%h/#ABBi C CF6N5)(3::6BBBBC,,,79vu%m4#ABBi H HF6N5)-8??GGGGy)) 	;vf~--+-vx(222 &y"a @ @:?(vx(77>))46vx(1"122Y D DE6N8,W5<<UCCCCD;&&
 8>>##u,,6;AhF6N8,U336;AhF6N8,U33,,,VF^H%===;=F6N8,Z8AFqvx(4U1X>>,,,VF^H%===;=F6N8,Z8AFqvx(4U1X>w'' 	;VF^++)+vv& .."a88K27(F6N6";/ * *&&$)F5M&!* *s$   2'D%	%D),D)+'HH"%H"c                 B   i }t          | d          5 }|                                                                }ddd           n# 1 swxY w Y   t          j                            |           }t          ||t          j                            |          |           |S )z+Parses a debian network configuration file.r~   N)r   r   r   rv   rw   r   r   r   )rw   r   r   r   r   s        rE   parse_deb_configr   7  s    F	dC %B7799??$$% % % % % % % % % % % % % % %wt$$H"'//(33X   Ms   'AA
A
c                 J    i }t          || d d            t          |          S )N)r   r   )r   _ifaces_to_net_config_data)eni_datar   s     rE   convert_eni_datar   C  s,    F68TDIIII%f---rG   c                 ~   i |                                  D ]\  }}|                    d          d         }|vr)|dk    rd}nd}||g d|<   d|v r|d         |         d<   ||d	         d
}|                    d          rd|d<   nd|d<   |                    d	          dk    r|d         |d<   dD ]}||v r||         ||<   d|v r1dD ].}||d         v r"|d         |         r|d         |         |d|z   <   /|         d                             |           	dfdt	                    D             dS )zReturn network config that represents the ifaces data provided.
    ifaces = parse_deb_config("/etc/network/interfaces")
    config = ifaces_to_net_config_data(ifaces)
    state = parse_net_config_data(config).:r   loloopbackphysical)r8   rO   rP   rU   rT   r   )_orig_eni_namer8   rg   rI   manualstaticr   )r   r   r   r   )r   r   dns_rP   rt   c                      g | ]
}|         S rk   rk   )r{   ddevss     rE   r}   z._ifaces_to_net_config_data.<locals>.<listcomp>p  s    $C$C$CT!W$C$C$CrG   )versionconfig)r7   	partitionr_   r<   r>   )	r   rO   datadevnamedtyper@   copy_keynr   s	           @rE   r   r   J  s   
 Dllnn 0 0
d..%%a($$""%*GKKDM d""/3K/@Wm,$($x.AA88F 	) &F9 (F988H)) $YF9; 	2 	2H4#'>x D==. 8 8U##UA#)-eQF6A:&Wi ''////$C$C$C$CfTll$C$C$CDDDrG   c                   X    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dS )Rendererz@Renders network information in a /etc/network/interfaces format.Nc                     |si }|                     dd          | _        |                     dd           | _        |                     dd          | _        d S )Neni_pathetc/network/interfaces
eni_headernetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r_   r   r   r   )selfr   s     rE   __init__zRenderer.__init__v  s\     	F

:/GHH **\488#ZZG
 
rG   r   c                 H   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 rm|
dk    rPd||
         v r|	dz  }	n$|                     d          dk    r|	dz  }	n|	dz  }	d|v r|	d||
         d|d         z  }	|	d||
         d||
         z  }	|                    ||	z   |z              |                    ||	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::r2   r   z -A inet6 default)r   r   r   r   r3   r   z	 -A inet6    z -hostz -netr1   )r_   r<   )r   routeindentrA   r   r   or_truemapping
default_gw
route_lineks              rE   _render_routezRenderer._render_route  s    )),,
 

 
y((U9-=-J-J#JJ9%%%/Q*>*>,J
1 	D 	DA a9nnI~~JJJ


E!HHMM

e	>>eAh"k1

8,,22"h.

"g-
5(("
%(((E(OO&LL
Jgajjj%(("CCJrJ0111tj(72333rG   Fc           	         g }                     di           }                    dd           }                    dd           }|rdd<   |rt          |          D ]\  }}d }	|d<   |d         d<   |                     d	d
          d	<   d}
t          |          r|
dz  }
n|                     d          }	|
d<   |d         dk    s|d         dk    s|d         dk    rdd<   |	|rdndd<   nM|d         dk    rd
d<   dd<   n6|d         dk    rd
d<   dd<   nt          |          rdd<   |	|rdndd<   dfd|D             v rdd	<   t	          t          ||          t          |          z   t          ||	          z             }|                     dg           D ],}|                    | 	                    |d                     -|
                    |           ng }dv sd v r |
                     d!j        d%i            |
                     d"j        d%i            |                    t          d#d $                     |
                    |           |S )&NrP   z	accept-ra	wakeonlangzethernet-wolrL   r8   rN   rI   rg   rM   6r   dhcp4dhcp6zipv6_dhcpv6-statefuldhcp10	accept_razipv6_dhcpv6-stateless
ipv6_slaacr   Tc                 *    g | ]}d d         z  |v S )zauto %srO   rk   )r{   r   r?   s     rE   r}   z*Renderer._render_iface.<locals>.<listcomp>  s4       <@Iv/47  rG   aliasrn   routesz    )r   zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )rL   r`   rk   )r_   pop	enumerater	   r9   rq   rF   re   extendr   r<   r=   )r   r?   rn   sectionsrP   r   ethernet_wolrL   r@   r`   subnet_inetrp   r   s    `           rE   _render_ifacezRenderer._render_iface  sV   ))Ir**IIk400	yyd33 	($'E.! B	#!*7!3!3 7' 7'v"&!&g &vf#)::i#@#@i $!&)) 83&KK&,jj&7&7O +f6Ng--f~00f~)??? %+E&M ,4=-FSS3k*F^'>>>$*E&M$'E&MMF^|33$*E&M$'E&MM#F++ G$,E&M ,4=-FSS3k*     DL     (/E)$&u7G   (v667 'ue_EE	F  $ZZ"55 K KELL!3!3E&!3!I!IJJJJ&&&&o7't E%%%)?)?1]1::E::;;;LL<5<EEuEEFFFLL aFFF   OOE"""rG   c                 X  	 ddddddgd}|                                 D ]/}|                    d          dk    rt          j        |          }0|j        }|r$d	                    |          |d
         d         d<   |j        }|r$d	                    |          |d
         d         d<   ddddddd	g }|                    |                     |                     t          |                                 	fd          D ]F}|                    d          dk    r|                    |                     ||                     G|
                                D ]*}|                    |                     |                     +d                    d |D                       dz   S )z1Given state, emit etc/network/interfaces content.r   r   rM   r   rg   )r8   rI   )rO   r8   rM   rP   rO   r3   rP   r   r0   r/   rt   r      r      )r   r   rX   rV   rW   rY   c                 0    | d                  | d         fS )Nr8   rO   rk   )r   orders    rE   <lambda>z-Renderer._render_interfaces.<locals>.<lambda>&  s    56+QvY7 rG   )rC   r   z

c                 8    g | ]}d                      |          S )
)r:   )r{   ss     rE   r}   z/Renderer._render_interfaces.<locals>.<listcomp>2  s"    ;;;QDIIaLL;;;rG   r   )iter_interfacesr_   rl   deepcopyr0   r:   dns_searchdomainsr   r   r>   iter_routesr<   r   )
r   network_statern   r   r?   r   searchdomainsr   r   r   s
            @rE   _render_interfaceszRenderer._render_interfaces   s    !+??@	
 
 #2244 	* 	*Eyy  D((]5))#3 	H25((;2G2GByM!./%7 	E-0XXm-D-DByM!\*
 
 
 **2..///))++7777
 
 
 		 		E
 yy  D((OO""5;K"LL    #..00 	7 	7EOOD..u556666{{;;(;;;<<tCCrG   r  	templatesreturnc                 
   t          j        || j                  }t          j        t
          j                            |                     | j        r| j        nd}t          j	        ||| 
                    |          z              | j        rut          j        || j                  }t          j        t
          j                            |                     t          j	        ||                     |                     d S d S )Nr   )r   target_pathr   r   
ensure_dirrv   rw   r   r   
write_filer  r   _render_persistent_net)r   r  r  targetfpeniheadernetruless          rE   render_network_statezRenderer.render_network_state4  s      77..///$(O;v(?(?(N(NNOOO 	'0BCCHOBGOOH55666O$55mDD    	 	rG   N)r   F)NN)__name__
__module____qualname____doc__r   r   r   r  r
   r   dictr  rk   rG   rE   r   r   s  s        JJ
 
 
 
2 2 2 2hK K K KZ2D 2D 2D 2Dn %)	 # D>
 
     rG   r   c                     d}t          ||d d          }|sd}|                    d          s|dz  } |j        | |          }||z   S )Nr   )r   r   r   )r   r   r   r   )r   endswithr  )r  r  rn   r   r   r   s         rE   network_state_to_enir  G  s    'H  !
 
  H  ??4   $*x*(8  H HrG   c                     g d}ddg}|D ]}t          j        |||           s dS t          j        | d          }t          j                            |          sdS dS )N)ifqueryifupifdownz/sbinz	/usr/sbin)r   r  Fr   T)r   whichr  rv   rw   rx   )r  expectedr   penis        rE   	availabler&  [  s~    ,,,H{#F  z!F6::: 	55	

6#;
<
<C7>># u4rG   r  )NFr  )!rl   r   rv   ry   typingr   	cloudinitr   loggingr   r   cloudinit.netr   r   r	   cloudinit.net.network_stater
   	getLoggerr  r]   r   r   r   rF   re   rq   r   r   r   r   r   r  r&  rk   rG   rE   <module>r-     s     				 				       $ $ $ $ $ $                 ? ? ? ? ? ? ? ? ? ? 4 4 4 4 4 4g!!   	 	 	    8  <9 9 9x   0B* B* B*J	 	 	. . .&E &E &ERQ Q Q Q Qx  Q Q Qh   (
 
 
 
 
 
rG   