509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼meU  ã               @   s   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	 d dl
mZmZmZ d dlmZ ejeƒZdddd	d
dgZddddddddgZddddddddddddd d!d"d#d$d%d&d'd(d)d*gZd+d,„ Zd-d.„ Zd>d0d1„Zd2d3„ Zd4d5„ Zd6d7„ ZG d8d9„ d9ejƒZd?d:d;„Zd@d<d=„ZdS )Aé    N)ÚOptional)ÚsubpÚutil)ÚParserErrorÚrendererÚsubnet_is_ipv6)ÚNetworkStatezpre-upÚupzpost-upÚdownzpre-downz	post-downZbridge_ageingZbridge_bridgeprioZ	bridge_fdZbridge_gcinitZbridge_helloZbridge_maxageZbridge_maxwaitZ
bridge_stpÚaddressÚnetmaskÚ	broadcastÚnetworkÚmetricÚgatewayZpointtopointZmediaÚmtuZhostnameZ
leasehoursZ	leasetimeZvendorZclientZbootfileÚserverZhwaddrZproviderÚframeZnetnumZendpointZlocalZttlc          
   C   s¦   g }ddddddddd	d
g
}x€|j ƒ D ]t\}}|dkr8q&|dkrTd|d |d f }|r&||kr&t|tƒrtdj|ƒ}d|krˆ|jddƒ}|jdj||ƒƒ q&W t|ƒS )Nr   r   r   r   r   Zpointopointr   ZscopeÚ
dns_searchÚdns_nameserversz%s/%sÚprefixú Ú_ú-z    {0} {1})ÚitemsÚ
isinstanceÚlistÚjoinÚreplaceÚappendÚformatÚsorted)ÚifaceÚsubnetÚcontentZ	valid_mapÚkeyÚvalue© r'   ú/usr/lib/python3.6/eni.pyÚ_iface_add_subnet@   s.    

r)   c       
   	   C   s"  |dkrg S g }dddddddd	d
g	}dddg}ddi}| d
 dkrN|j dƒ xÊ| jƒ D ]¾\}}t|tƒrz| | rvdnd}| sX||krŠqX|dkr´|r´||krXtjd| d ||ƒ qX||kræx&|D ]}	|j dj|j||ƒ|	ƒƒ qÂW qXt|tƒ� rüdj	|ƒ}|j dj|j||ƒ|ƒƒ qXW t
|ƒS )Nr   ÚcontrolZ	device_idZdriverÚindexÚinetÚmodeÚnameÚsubnetsÚtypeÚbridge_pathcostÚbridge_portprioZbridge_waitportÚmac_addressÚ	hwaddressÚbondÚbridgeÚ
infinibandÚvlanZonZoffr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.z    {0} {1}r   )r5   r6   r7   r8   )r   r   r   ÚboolÚLOGZwarningr    Úgetr   r   r!   )
r"   r+   Úipv4_subnet_mtur$   Z
ignore_mapZmultiline_keysÚrenamesr%   r&   Úvr'   r'   r(   Ú_iface_add_attrs^   sN    



r?   Fc             C   sŒ   | d }| d }|dkrd}n|dkr0d| }nd| }| j ƒ }|j||dœƒ djf |Žd	jf |Žg}|rˆ| jd
ƒrˆ|jdjf |Žƒ |S )Nr.   r*   ÚautoÚhotplugzallow-z
# control-)ÚfullnameÚcverbz{cverb} {fullname}ziface {fullname} {inet} {mode}r3   z    hwaddress {mac_address})rA   )ÚcopyÚupdater    r;   r   )r"   r+   Úrender_hwaddressrB   r*   rC   ZsubstÚlinesr'   r'   r(   Ú_iface_start_entryš   s    

rH   c                sr  d}�x8|j ƒ D �]*}|jƒ }|jdƒr*q|jdƒ}|d }|dkrè|d }|jdƒsdtjj||ƒ}x€tj|ƒD ]r‰ tjˆ ƒ}	‡ fdd	„|	D ƒ}	xP|	D ]H}
t	|
d
ƒ�}|j
ƒ jƒ }W dQ R X tjj|
ƒ}t| |tjj|ƒ|ƒ q–W qpW q|dk�rp|d }|jdƒ�stjj||ƒ}xXtj|ƒD ]J‰ t	ˆ d
ƒ�}|j
ƒ jƒ }W dQ R X tjjˆ ƒ}t| |tjj|ƒ|ƒ �q W q|dk�r¶x8|dd… D ](}|| k�r¢d|i| |< d| | d< �qˆW q|dk�r&|dd… \}}}|| k�rêd|i| |< nd| | k�rtd||f ƒ‚|| | d< || | d< |}q|dk�r^|d dk�rH|d }n|d }|| | d< q|tk�rz|d | | |< q|tk�rÀ|| | k�ržg | | |< | | | jdj|dd… ƒƒ q|jdƒ�rzd| | k�ræi | | d< |dk�r0g | | d d< xv|dd… D ]}| | d d j|ƒ �qW nH|dk�r<g | | d d< x,|dd… D ]}| | d d j|ƒ �qXW q|jdƒ�röd| | k�r i | | d< |tk�rÐ|jdddƒ}|d | | d |< �q<|d k�rg | | d d!< x,|dd… D ]}| | d d! j|ƒ �qøW nÚ|d"k�rb|d jƒ d#k�rL|d | | d d#< n|d | | d d#< n’|d$k�r¬d%| | d k�rŽi | | d d%< |d | | d d% |d < nH|d&k�r<d'| | d k�rØi | | d d'< |d | | d d' |d < q|jd(ƒrd)| | k�ri | | d)< |jd(ddƒ}|d | | d) |< qW x,| jƒ D ] }d| | k�rJd*| | d< �qJW 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ú#r   r   zsource-directoryé   ú/c                s@   g | ]8}t jjt jjˆ |ƒƒrtjd |ƒdk	rt jjˆ |ƒ‘qS )z^[a-zA-Z0-9_-]+$N)ÚosÚpathÚisfiler   ÚreÚmatch)Ú.0rM   )Úexpanded_pathr'   r(   ú
<listcomp>Ë   s   z*_parse_deb_config_data.<locals>.<listcomp>ÚrÚsourcer@   Z_source_pathTr"   é   Úfamilyz:Interface %s can only be defined once. Re-defined in '%s'.Úmethodr4   Zetheré   zdns-Údnsz
dns-searchÚsearchzdns-nameserversÚnameserversZbridge_r6   Ú Zbridge_portsZportsZ	bridge_hwZmacr1   Zpathcostr2   Zportpriozbond-r5   F)Ú
splitlinesÚstripÚ
startswithÚsplitrL   rM   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_pathZcurrifÚlinera   ZoptionZparsed_src_dirZdir_contentsÚentryÚfpZsrc_dataZ	abs_entryZnew_src_pathZabs_pathr"   rW   rX   ÚvalZdomainr   Zbridge_optionZbond_optionr'   )rR   r(   rg   ²   sÆ    














"







rg   c             C   s   i }t || d d d� t|ƒS )N)rp   rq   )rg   Ú_ifaces_to_net_config_data)Zeni_datarn   r'   r'   r(   Úconvert_eni_data7  s    rw   c                sF  i ‰ �x"| j ƒ D �]\}}|jdƒd }|ˆ krj|dkr>d}nd}||g dœˆ |< d|krj|d ˆ | d< ||d	 d
œ}|jdƒrŒd|d< nd|d< |jd	ƒdkr®|d |d< x dD ]}||kr´|| ||< q´W d|k�rx8dD ]0}||d krà|d | rà|d | |d| < qàW ˆ | d j|ƒ qW d‡ fdd„tˆ ƒD ƒdœS )zÂReturn 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)r0   r.   r/   r4   r3   rX   )Z_orig_eni_namer0   r@   r*   ZmanualÚstaticr   r   r   r   rZ   r\   r[   Zdns_r/   rJ   c                s   g | ]}ˆ | ‘qS r'   r'   )rQ   Úd)Údevsr'   r(   rS   d  s    z._ifaces_to_net_config_data.<locals>.<listcomp>)ÚversionÚconfig)r   r   r   )r\   r[   )r   Ú	partitionr;   r   r!   )rn   r.   ÚdataZdevnameZdtyper#   Zcopy_keyÚnr'   )r~   r(   rv   >  s2    




rv   c               @   sP   e Zd ZdZddd„Zddd„Zdd	d
„Zddd„Zdee	e
 ddœdd„ZdS )ÚRendererz@Renders network information in a /etc/network/interfaces format.Nc             C   s6   |si }|j ddƒ| _|j dd ƒ| _|j ddƒ| _d S )NÚeni_pathzetc/network/interfacesÚ
eni_headerÚnetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r;   r…   r†   r‡   )Úselfr€   r'   r'   r(   Ú__init__j  s    zRenderer.__init__r]   c             C   sP  g }|d }|d }d}dddœ}d}|d d	krD|d
 d	krDd}n|d dkr`|d dkr`d}d}	xÂdD ]º}
|r||
dkr|qj|
dkr |	d|||
 ||
 f 7 }	qj|
|krj|
dk�rd||
 krÈ|	d7 }	n |j dƒdkrà|	d7 }	n|	d7 }	d|k�r$|	d||
 |d f 7 }	qj|	d||
 ||
 f 7 }	qjW |j||	 | ƒ |j||	 | ƒ |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 || trueZgwr   )r   r   r]   r   z0.0.0.0r   z defaultz::r   r   z -A inet6 defaultr   z%s %s %srx   z	 -A inet6é    z -hostz -netz %s/%sz %s %s)r   r   r   )r;   r   )rˆ   ÚrouteÚindentr$   r	   r
   Zor_trueÚmappingZ
default_gwZ
route_lineÚkr'   r'   r(   Ú_render_routes  s<    




zRenderer._render_routeFc                s6  g }ˆ j di ƒ}ˆ jdd ƒ}ˆ jdd ƒ}|r4dˆ d< |�rØ�xôt|ƒD �]Š\}}d }	|ˆ d< |d ˆ d< |j d	d
ƒˆ d	< d}
t|ƒrŽ|
d7 }
n
|j dƒ}	|
ˆ d< |d dksÄ|d dksÄ|d dkrædˆ d< |d k	rä|rÜdndˆ d< nn|d dk�rd
ˆ d< dˆ d< nN|d dk�r&d
ˆ d< dˆ d< n.t|ƒ�rTdˆ d< |d k	�rT|�rLdndˆ d< d‡ fdd„|D ƒk�rtdˆ d	< ttˆ ||d�tˆ |ƒ tˆ ||	ƒ ƒ}x*|j dg ƒD ]}|j| j	|dd�ƒ �qªW |j
|ƒ qFW nZg }d ˆ k�sðd!ˆ k�r|j
d"jf ˆ Žƒ |j
d#jf ˆ Žƒ |jtˆ d$d d%�ƒ |j
|ƒ |S )&Nr/   z	accept-raZ	wakeonlanÚgzethernet-wolr+   r0   r-   r*   r@   r,   Ú6r   Zdhcp4Zdhcp6zipv6_dhcpv6-statefulZdhcpÚ1Ú0Ú	accept_razipv6_dhcpv6-statelessZ
ipv6_slaacr|   Tc                s   g | ]}d ˆ d  |k‘qS )zauto %sr.   r'   )rQ   rr   )r"   r'   r(   rS   Ù  s    z*Renderer._render_iface.<locals>.<listcomp>Úalias)rF   Zroutesz    )rŒ   zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )r+   r<   )r;   ÚpopÚ	enumerater   r   rH   r)   r?   Úextendr�   r   r    )rˆ   r"   rF   Úsectionsr/   r”   Zethernet_wolr+   r#   r<   Zsubnet_inetrG   r‹   r'   )r"   r(   Ú_render_iface§  sb    





&
zRenderer._render_ifacec       	         s&  ddddddœgdœ}x(|j ƒ D ]}|jdƒdkr tj|ƒ}q W |j}|r`d	j|ƒ|d
 d d< |j}|r€d	j|ƒ|d
 d d< dddddddœ‰ g }|j| j|ƒƒ xDt	|j ƒ ‡ fdd„d�D ](}|jdƒdkrÔqÀ|j| j||d�ƒ qÀW x |j
ƒ D ]}|j| j|ƒƒ qöW djdd„ |D ƒƒd S )z1Given state, emit etc/network/interfaces content.ry   r{   r,   rz   r@   )r0   r*   )r.   r0   r,   r/   r.   r   r/   r   r   r   rJ   rY   é   rV   é   )rz   r{   r7   r5   r6   r8   c                s   ˆ | d  | d fS )Nr0   r.   r'   )rŽ   )Úorderr'   r(   Ú<lambda>  s    z-Renderer._render_interfaces.<locals>.<lambda>)r%   )rF   z

c             S   s   g | ]}d j |ƒ‘qS )Ú
)r   )rQ   Úsr'   r'   r(   rS   &  s    z/Renderer._render_interfaces.<locals>.<listcomp>rŸ   )Ziter_interfacesr;   rD   Údeepcopyr   r   Zdns_searchdomainsr˜   rš   r!   Ziter_routesr   r�   )	rˆ   Únetwork_staterF   ry   r"   r\   Zsearchdomainsr™   r‹   r'   )r�   r(   Ú_render_interfacesô  s>    zRenderer._render_interfaces)r¢   Ú	templatesÚreturnc             C   s†   t j|| jƒ}tjtjj|ƒƒ | jr,| jnd}tj	||| j
|ƒ ƒ | jr‚t j|| jƒ}tjtjj|ƒƒ tj	|| j|ƒdd� d S )Nr]   T)r$   Zpreserve_mode)r   Útarget_pathr…   r   Z
ensure_dirrL   rM   rh   r†   Z
write_filer£   r‡   Z_render_persistent_net)rˆ   r¢   r¤   ÚtargetZfpeniÚheaderZnetrulesr'   r'   r(   Úrender_network_state(  s    zRenderer.render_network_state)N)r]   )F)F)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‰   r�   rš   r£   r   r   Údictr©   r'   r'   r'   r(   r„   g  s   
	
4
M
7 
r„   c             C   sF   d}t ||d dœd�}|sd}|jdƒs0|d7 }|j| |d�}|| S )Nzetc/network/interfaces)r…   r†   r‡   )r€   r]   rŸ   )rF   )r„   Úendswithr£   )r¢   r¨   rF   r…   r   ro   r'   r'   r(   Únetwork_state_to_eni=  s    

r°   c             C   sT   dddg}ddg}x |D ]}t j||| d�sdS qW t j| dƒ}tjj|ƒsPdS d	S )
NZifqueryZifupZifdownz/sbinz	/usr/sbin)r[   r§   Fzetc/network/interfacesT)r   Zwhichr¦   rL   rM   rN   )r§   Zexpectedr[   ÚpZenir'   r'   r(   Ú	availableQ  s    

r²   )F)NF)N)rD   rb   ZloggingrL   rO   Ztypingr   Z	cloudinitr   r   Zcloudinit.netr   r   r   Zcloudinit.net.network_stater   Z	getLoggerrª   r:   rj   rk   ri   r)   r?   rH   rg   rw   rv   r„   r°   r²   r'   r'   r'   r(   Ú<module>   sr   
<
 ) W
