509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼mevK  ã               @   sÞ   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mZ d dl	m
Z
mZmZmZ d dlmZmZmZmZmZ d dlmZmZ dZejeƒZdd„ Zdeed	œd
d„Zdd„ Zddd„ZG dd„ dej ƒZ ddd„Z!dS )é    N)ÚOptionalÚcast)ÚfeaturesÚsafeyamlÚsubpÚutil)ÚIPV6_DYNAMIC_TYPESÚSYS_CLASS_NETÚget_devicelistÚrendererÚsubnet_is_ipv6)ÚNET_CONFIG_TO_V2ÚNetworkStates4  # This is the initial network config.
# It can be overwritten by cloud-init or console-conf.
network:
    version: 2
    ethernets:
        all-en:
            match:
                name: "en*"
            dhcp4: true
        all-eth:
            match:
                name: "eth*"
            dhcp4: true
c                s   t ‡ fdd„| jƒ D ƒƒS )Nc             3   s$   | ]\}}|j ˆ ƒr||fV  qd S )N)Ú
startswith)Ú.0ÚkeyÚvalue)Úmatch© ú/usr/lib/python3.6/netplan.pyú	<genexpr>*   s   z,_get_params_dict_by_match.<locals>.<genexpr>)ÚdictÚitems)Úconfigr   r   )r   r   Ú_get_params_dict_by_match(   s    
r   )r   Úentryc             C   sl  d(dd„}|dkrg }g }g }g }g }| j dg ƒ}	|	dkr>g }	�x|	D �]}
|
j dƒ}|jdƒr€|dkrp|d7 }|j|d	iƒ qF|tkr˜|jd
d	iƒ qF|d)krFd|
j dƒ }d|
krÈ|d|
j dƒ 7 }|
j dƒ�rl|
j dƒddœ}yDtj|
d ƒ}tj|dd�}||k�r&tjd|
d |ƒ d	|d< W n8 t	k
�r` } ztj
d|
d ||ƒ W Y dd}~X nX |j|ƒ d|
k�rŠ|||
j dg ƒƒ7 }d|
k�r¨|||
j dg ƒƒ7 }d|
k�râd}t|
ƒ�rÎd|k�rÎd}|j||
j dƒiƒ xh|
j dg ƒD ]X}d|j dƒ|j dƒf }|j dƒ|dœ}d |k�r<|jd |j d d!ƒiƒ |j|ƒ �qðW |j|ƒ qFW d| k�r¤|j dƒ}|�r˜| d |k�r˜tj
d"|| d |ƒ n| d |d< t|ƒd#k�rÀ|jd$|iƒ t|ƒd#k�rÜ|jd|iƒ t|ƒd#k�r d$|i}|jd%|iƒ t|ƒd#k�r6|j d%i ƒ}|jd&|iƒ |jd%|iƒ d'| k�rh| d' dk	�rh|jd'tj| j d'ƒƒiƒ dS )*aÖ  This method parse a cloudinit.net.network_state dictionary (config) and
       maps netstate keys/values into a dictionary (entry) to represent
       netplan yaml. (config v1 -> netplan)

    An example config dictionary might look like:

    {'mac_address': '52:54:00:12:34:00',
     'name': 'interface0',
     'subnets': [
        {'address': '192.168.1.2/24',
         'mtu': 1501,
         'type': 'static'},
        {'address': '2001:4800:78ff:1b:be76:4eff:fe06:1000",
         'mtu': 1480,
         'netmask': 64,
         'type': 'static'}],
      'type: physical',
      'accept-ra': 'true'
    }

    An entry dictionary looks like:

    {'set-name': 'interface0',
     'match': {'macaddress': '52:54:00:12:34:00'},
     'mtu': 1501}

    After modification returns

    {'set-name': 'interface0',
     'match': {'macaddress': '52:54:00:12:34:00'},
     'mtu': 1501,
     'address': ['192.168.1.2/24', '2001:4800:78ff:1b:be76:4eff:fe06:1000"],
     'ipv6-mtu': 1480}

    ú c             S   s2   |  st | tƒ r| S || kr(| j|ƒS | gS dS )zT
        Helper to convert strings to list of strings, handle single string
        N)Ú
isinstanceÚstrÚsplit)ÚobjÚtokenr   r   r   Ú_listifyU   s
    
z$_extract_addresses.<locals>._listifyNÚsubnetsÚtypeZdhcpÚ4TZdhcp6ÚstaticÚstatic6z%sZaddressÚprefixz/%dZgatewayÚdefault)ZviaZtoF)ÚstrictzAGateway %s is not contained within subnet %s, adding on-link flagzon-linkzDFailed to check whether gateway %s is contained within subnet %s: %sÚdns_nameserversZ
dns_searchZmtuzipv6-mtuÚroutesz%s/%sÚnetworkZmetricéd   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r   Ú	addressesÚnameserversÚsearchz	accept-ra)r   )r&   r'   )Úgetr   Úupdater   Ú	ipaddressZ
ip_addressZ
ip_networkÚLOGÚdebugÚ
ValueErrorZwarningÚappendr   Úlenr   Zis_true)r   r   Úifnamer   r"   r/   r,   r0   Úsearchdomainsr#   ZsubnetZsn_typeZaddrZ	new_routeZsubnet_gatewayZsubnet_networkÚeZmtukeyZrouteZto_netZ	entry_mtuÚnsr   r   r   Ú_extract_addresses0   s     %










r>   c                s8   t ‡ fdd„| jƒ D ƒƒ}t|ƒdkr4|jd|iƒ d S )Nc                s$   g | ]\}}|j d dƒˆ kr|‘qS )zbond-masterN)r2   )r   ÚnameÚcfg)Úbond_masterr   r   ú
<listcomp>Æ   s   z0_extract_bond_slaves_by_name.<locals>.<listcomp>r   Ú
interfaces)Úsortedr   r9   r3   )rC   r   rA   Zbond_slave_namesr   )rA   r   Ú_extract_bond_slaves_by_nameÃ   s
    
rE   c                s†   t jˆ dƒ}tjj|ƒsd S tj|dd�}|tkr6d S ‡ fdd„dD ƒ}d	d„ |D ƒ}tj	d
||ƒ x|g| D ]}tj
|ƒ qpW d S )Nz etc/netplan/00-snapd-config.yamlF)Údecodec                s   g | ]}t jˆ |ƒ‘qS r   )r   Útarget_path)r   Úf)Útargetr   r   rB   Ú   s   z"_clean_default.<locals>.<listcomp>ú-run/systemd/network/10-netplan-all-en.networkú.run/systemd/network/10-netplan-all-eth.networkú#run/systemd/generator/netplan.stampc             S   s   g | ]}t jj|ƒr|‘qS r   )ÚosÚpathÚisfile)r   rH   r   r   r   rB   á   s    z9removing known config '%s' and derived existing files: %s)rJ   rK   rL   )r   rG   rM   rN   rO   r   Z	load_fileÚKNOWN_SNAPD_CONFIGr5   r6   Úunlink)rI   ZtpathÚcontentZderivedZexistingrH   r   )rI   r   Ú_clean_defaultÏ   s"    
  rS   c               @   sz   e Zd ZdZddgZddgZddd„Zedd	„ ƒZde	e
e dd
œdd„Zdeedœdd„Zddd„Ze	edœdd„ZdS )ÚRendererzBRenders network information in a /etc/netplan/network.yaml format.ÚnetplanZgenerateÚinfoNc             C   sR   |si }|j ddƒ| _|j dd ƒ| _|j ddƒ| _|j ddƒ| _|j dd ƒ| _d S )	NÚnetplan_pathzetc/netplan/50-cloud-init.yamlÚnetplan_headerZpostcmdsFÚclean_defaultTr   )r2   rW   rX   Ú	_postcmdsrY   Ú	_features)Úselfr   r   r   r   Ú__init__ò   s    
zRenderer.__init__c             C   sˆ   | j d kr‚y0tj| jdd�\}}tj|ƒ}|d d | _ W nF tjk
rP   Y n2 ttfk
r€ } ztj	d|ƒ W Y d d }~X nX | j S )NT)Úcapturez
netplan.ior   z-Failed to list features from netplan info: %s)
r[   r   ÚNETPLAN_INFOr   Z	load_yamlÚProcessExecutionErrorÚ	TypeErrorÚKeyErrorr5   r6   )r\   Z	info_blobZ_errrV   r<   r   r   r   r   ý   s    

zRenderer.features)Únetwork_stateÚ	templatesÚreturnc             C   s*  t jjtj|ƒ| jƒ}tjt jj|ƒƒ | j	|ƒ}| j
r>| j
nd}|jdƒsT|d7 }|| }d}t jj|ƒr¬tjtj|jƒ ƒƒ}t|dƒ�}	tj|	ƒ}
W d Q R X ||
kr¬d}tjr¶dnd}| ræt jj|ƒrætj|ƒ}||@ |kræ|}tj|||d� | j�rt|d	� | j| j|d
� | j| jd� d S )NÚ Ú
FÚrbTi€  i¤  )Úmode)rI   )ÚrunÚsame_content)rj   )rM   rN   Újoinr   rG   rW   r   Z
ensure_dirÚdirnameÚ_render_contentrX   ÚendswithÚexistsZhash_bufferÚioÚBytesIOÚencodeÚopenr   ZNETPLAN_CONFIG_ROOT_READ_ONLYZget_permissionsZ
write_filerY   rS   Ú_netplan_generaterZ   Ú_net_setup_link)r\   rc   rd   rI   ZfpnplanrR   Úheaderrk   Zhashed_contentrH   Zhashed_original_contentri   Zcurrent_moder   r   r   Úrender_network_state  s0    	



zRenderer.render_network_stateF)rj   rk   c             C   s8   |st jdƒ d S |r$t jdƒ d S tj| jdd� d S )Nz!netplan generate postcmd disabledzEskipping call to `netplan generate`. reason: identical netplan configT)r^   )r5   r6   r   ÚNETPLAN_GENERATE)r\   rj   rk   r   r   r   ru   8  s    
zRenderer._netplan_generatec             C   s¨   |st jdƒ dS dddg}t}x‚tdƒD ]l}y>x6tƒ D ],}tjjt| ƒr8t	j	|t| g dd� q8W P W q* t	j
k
r” } z
|}W Y dd}~X q*X q*W td	ƒ|‚dS )
z¤To ensure device link properties are applied, we poke
        udev to re-evaluate networkd .link files and call
        the setup_link udev builtin command
        z'netplan net_setup_link postcmd disabledNZudevadmztest-builtinZnet_setup_linké   T)r^   zQ'udevadm test-builtin net_setup_link' unable to run successfully for all devices.)r5   r6   Ú	ExceptionÚranger
   rM   rN   Úislinkr	   r   r`   ÚRuntimeError)r\   rj   Z	setup_lnkZlast_exceptionÚ_Zifacer<   r   r   r   rv   D  s"    

zRenderer._net_setup_link)rc   re   c       +      C   sd  |j dkr*tjdƒ tjd|jiddd�S i }i }i }i }i }g }|jjdg ƒ}|j}	|j	}
�x4|j
ƒ D �]&}|jdƒ}ttdd	„ |jƒ ƒƒ}|jd
ƒ}|dk�r||jdd ƒdœ}|d d krò|jdd ƒ}|d k	ræd|jƒ i|d< n|d= |d= t|||| jƒ |j||iƒ qh|dk�ri }i }tttjdƒƒ}x^d/D ]V}t||ƒ}xD|jƒ D ]8\}}|j|jddƒƒ}|d k�rz�qR|j||iƒ �qRW �q:W t|ƒdk�r°|jd|iƒ |jdƒ�rÌ|d jƒ |d< |jdƒ}|dk�rìt|||ƒ t|||| jƒ |j||iƒ qh|dk�r2|jdƒ}ttj|ƒƒ}d|i}d}t||ƒ}i }tttjdƒƒ} x€|jƒ D ]t\}}| j|ƒ}|d k�r‚�qb|j||iƒ |d0k�rbi }!x&|D ]}"|"jƒ \}#}$t|$ƒ|!|#< �q¤W |j||!iƒ �qbW t|ƒdk�rö|jd|iƒ |jdƒ�r|d jƒ |d< t|||| jƒ |j||iƒ qh|dkrh|jd ƒ|jd!ƒd"œ}%|jdd ƒ}|d k	�rr|jƒ |%d< t||%|| jƒ |j||%iƒ qhW |	�s |
�r|	|
d#œ}&xV|||||gD ]D}'x<|'jƒ D ]0\}(})d$|)k�sÈd%|)k�rè�qÈ|)jd$|&iƒ �qÈW �qºW d&d'„ }*|jd(ƒ ||*d)|ƒ7 }||*d*|ƒ7 }||*d+|ƒ7 }||*d,|ƒ7 }||*d-|ƒ7 }d.j|ƒS )1Né   zV2 to V2 passthroughr-   F)Úexplicit_startÚexplicit_endrC   r?   c             S   s   | d d k	S )Né   r   )Úitr   r   r   Ú<lambda>}  s    z*Renderer._render_content.<locals>.<lambda>r$   Zphysicalr   )zset-namer   Zmac_addressZ
macaddresszset-nameÚbondÚbond_úbond-r   ú-r   Z
parameterszbond-slavesZnoneÚbridgeÚbridge_portsZbridge_ú	path-costúport-priorityÚvlanZvlan_idzvlan-raw-device)ÚidÚlink)r/   r1   r0   r/   c             S   s0   |r,t j| |idddd�}tj|dƒ}|gS g S )NFT)r�   r‚   Znoaliasr   é   z    )r   ÚdumpsÚtextwrapÚindent)r?   ÚsectionÚdumpZtxtr   r   r   Ú_render_sectionë  s    z1Renderer._render_content.<locals>._render_sectionznetwork:
    version: 2
Ú	ethernetsÚwifisÚbondsÚbridgesÚvlansrf   )r‡   rˆ   )rŒ   r�   )Úversionr5   r6   r   r’   r   Z_network_stater2   r+   Zdns_searchdomainsZiter_interfacesr   Úfilterr   Úlowerr>   r   r3   r   r   r   Úreplacer9   rE   rD   Úcopyr   Úintr8   rl   )+r\   rc   r˜   r™   r›   rš   rœ   rR   rC   r0   r;   r   r:   ZifcfgZif_typeZethZmacaddrr†   Zbond_configZv2_bond_mapr   Zbond_paramsZparamr   ZnewnameZslave_interfacesr‹   ZportsrŠ   Zmatch_prefixZparamsZ	br_configZv2_bridge_mapZnewvalueÚvalZportZportvalrŽ   Znscfgr•   Ú_namer@   r—   r   r   r   rn   c  sÄ    




















zRenderer._render_content)N)NN)FF)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ry   r_   r]   Úpropertyr   r   r   r   rx   Úboolru   rv   r   rn   r   r   r   r   rT   ì   s   
 
'
rT   c             C   s4   dg}ddg}x |D ]}t j||| d�sdS qW dS )NrU   z	/usr/sbinz/sbin)r1   rI   FT)r   Zwhich)rI   Zexpectedr1   Úpr   r   r   Ú	available  s    
r¬   )N)N)N)"r¡   rq   r4   ZloggingrM   r“   Ztypingr   r   Z	cloudinitr   r   r   r   Zcloudinit.netr   r	   r
   r   r   Zcloudinit.net.network_stater   r   rP   Z	getLoggerr¥   r5   r   r   r>   rE   rS   rT   r¬   r   r   r   r   Ú<module>   s(   
 
  