509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼meÇ0  ã               @   s€   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	 d dl
mZ e jeƒZG dd„ dƒZG d	d
„ d
e	jƒZddd„ZdS )é    N)ÚOrderedDict)ÚOptional)ÚsubpÚutil)Úrenderer)ÚNetworkStatec               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	CfgParserc          	   C   s   t g g g g g g i dœƒ| _d S )N)ÚMatchÚLinkÚNetworkÚDHCPv4ÚDHCPv6ÚAddressÚRoute)r   Ú	conf_dict)Úself© r   ú/usr/lib/python3.6/networkd.pyÚ__init__   s    zCfgParser.__init__c             C   sd   x^| j jƒ D ]P}||kr| j | j|d t|ƒ ƒ ttj| j | ƒƒ| j |< | j | jƒ  qW d S )Nú=)r   ÚkeysÚappendÚstrÚlistÚdictÚfromkeysÚsort)r   ÚsecÚkeyÚvalÚkr   r   r   Úupdate_section    s
    zCfgParser.update_sectionc             C   s�   xŠ| j jƒ D ]|}||kr|| j | kr4g | j | |< | j | | j|d t|ƒ ƒ ttj| j | | ƒƒ| j | |< | j | | jƒ  qW dS )z‹
        For each route section we use rid as a key, this allows us to isolate
        this route from others on subsequent calls.
        r   N)r   r   r   r   r   r   r   r   )r   r   Úridr   r   r    r   r   r   Úupdate_route_section(   s      zCfgParser.update_route_sectionc             C   sö   d}xìt | jjƒ ƒD ]Ú\}}|s"q|dkrbxÂt |ƒD ](}|d| d 7 }||d 7 }|d7 }q4W q|dkr¸x‚t |ƒD ]>}|d| d 7 }x(t || ƒD ]}||d 7 }|d7 }q–W qtW q|d| d 7 }xt |ƒD ]}||d 7 }qÒW |d7 }qW |S )NÚ r   ú[z]
Ú
r   )Úsortedr   Úitems)r   Úcontentsr    ÚvÚeÚnr   r   r   Úget_final_conf8   s(    zCfgParser.get_final_confN)Ú__name__Ú
__module__Ú__qualname__r   r!   r#   r-   r   r   r   r   r      s   r   c               @   s®   e Zd ZdZddd„Zedœdd„Zedœdd	„Zedœd
d„Zedœdd„Z	edœdd„Z
eedœdd„Zedœdd„Zdd„ Zdeee ddœdd„Zeedœdd„ZdS )ÚRendererzº
    Renders network information in /etc/systemd/network

    This Renderer is currently experimental and doesn't support all the
    use cases supported by the other renderers yet.
    Nc             C   s(   |si }|j ddƒ| _|j ddƒ| _d S )NÚresolve_conf_fnz/etc/systemd/resolved.confÚnetwork_conf_dirz/etc/systemd/network/)Úgetr2   r3   )r   Úconfigr   r   r   r   Y   s    
zRenderer.__init__)Úcfgc             C   sX   d}ddddœ}|sd S x6|j ƒ D ]*\}}||kr"|| r"|j|||| ƒ q"W |d S )Nr	   ÚNameZDriverZ
MACAddress)ÚnameZdriverZmac_addressr8   )r(   r!   )r   Úifacer6   r   Z
match_dictr    r*   r   r   r   Úgenerate_match_sectionc   s    zRenderer.generate_match_sectionc             C   s2   d}|sd S d|kr.|d r.|j |d|d ƒ d S )Nr
   ZmtuZMTUBytes)r!   )r   r9   r6   r   r   r   r   Úgenerate_link_sectiont   s
    zRenderer.generate_link_sectionc       	      C   st   d}ddddœ}d}d|kr,dt |d ƒ }xB|jƒ D ]6\}}||krHq6|d	krX||7 }|j|||| |ƒ q6W d
S )zy
        Parse a route and use rid as a key in order to isolate the route from
        others in the route dict.
        r   ÚGatewayZDestinationZMetric)ÚgatewayÚnetworkZmetricr$   Úprefixú/r>   N)r   r(   r#   )	r   r"   Úconfr6   r   Zroute_cfg_mapr?   r    r*   r   r   r   Úparse_routes}   s    zRenderer.parse_routesc             C   s¼  d}d}d}�xj|j dg ƒD �]X}|d }|dks:|dkrV|dkrHd}qx|d	krxd
}n"|dkrx|dkrld	}n|dkrxd
}d|kr¶|d r¶x,|d D ] }| jd|› �||ƒ |d }q’W d|krdddddœ}	x¨|jƒ D ]œ\}
}|
dk�rd|k�r|dt|d ƒ 7 }|jd|	|
 |ƒ qÖ|
dk�rH|jdd|› �|	|
 |ƒ |d }qÖ|
dk�sZ|
dkrÖ|j||	|
 dj|ƒƒ qÖW qW |j|d|ƒ |d!k�r¸t|j ddƒtƒ�r¸|j|d |d ƒ |S )"NÚnor   r   ZsubnetsÚtypeZdhcp4ÚdhcpZipv4Úipv6ÚyesZdhcp6ZroutesÚré   Úaddressr   r<   ÚDNSÚDomains)rJ   r=   Údns_nameserversÚ
dns_searchr?   r@   r=   r   ÚarM   rN   ú ZDHCPz	accept-rar$   ZIPv6AcceptRA)rF   rG   )	r4   rB   r(   r   r!   r#   ÚjoinÚ
isinstanceÚbool)r   r9   r6   rE   r   r"   r+   ÚtÚiZsubnet_cfg_mapr    r*   r   r   r   Úparse_subnets•   sP    



 zRenderer.parse_subnetsc             C   s”   xŽd
D ]†}||krqt || ƒjƒ }ytj|ƒ}|r8dnd}W n, tk
rj   |dkrftjd|ƒ d}Y nX |dkrzd}nd}|j|d	|ƒ qW d S )NÚdhcp4domainÚdhcp6domainrG   rC   ÚroutezInvalid dhcp4domain value - %sr   r   Ú
UseDomains)rW   rX   )r   Úcasefoldr   Ztranslate_boolÚ
ValueErrorÚLOGZwarningr!   )r   Údr6   ÚitemÚretZsectionr   r   r   Údhcp_domainË   s    


zRenderer.dhcp_domain)r6   Únsc       	      C   s�   d}ddddœ}|j dƒ}| r:|jdkr:|j|jdœ}n| rN|jdkrNd S x<|jƒ D ]0\}}||krX|| rX|j||d	j|| ƒƒ qXW d S )
Nr   rL   rK   )ÚsearchÚnameserversZ	addressesÚdnsrI   )rc   rd   é   rP   )r4   ÚversionZdns_searchdomainsrM   r(   r!   rQ   )	r   r9   r6   rb   r   Zdns_cfg_mapre   r    r*   r   r   r   Ú	parse_dnsÝ   s    
zRenderer.parse_dnsc       	      C   s˜   dddddœ}|dkr,|j ddd	d
ddœƒ d|› d�|kr”|dd|› �gkr”|d|› d� }x4|jƒ D ](\}}||krh|jd|› �||| ƒ qhW d S )Nzuse-dnszuse-domainszuse-hostnamezuse-ntp)ZUseDNSrZ   ZUseHostnameZUseNTPÚ4zsend-hostnameZhostnamezroute-metriczuse-mtuz
use-routes)ZSendHostnameZHostnameZRouteMetricZUseMTUZ	UseRoutesrE   z
-overridesrG   ZipvZDHCPv)Úupdater(   r!   )	r   r6   ÚdevicerE   rg   Zdhcp_config_mapsZdhcp_overridesr    r*   r   r   r   Úparse_dhcp_overridesó   s$    
zRenderer.parse_dhcp_overridesc             C   s>   d}t jd|ƒ |d | d }tj||ƒ tj|||ƒ d S )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)r]   Údebugr   Z
write_fileZchownbyname)r   ÚlinkrA   Znwk_dirZnet_fn_ownerZnet_fnr   r   r   Úcreate_network_file  s
    zRenderer.create_network_file)Únetwork_stateÚ	templatesÚreturnc             C   sT   | j }|rtj|ƒ| }tj|ƒ | j|ƒ}x"|jƒ D ]\}}| j|||ƒ q6W d S )N)r3   r   Ztarget_pathr   Z
ensure_dirÚ_render_contentr(   ro   )r   rp   rq   ÚtargetZnetwork_dirÚret_dictr    r*   r   r   r   Úrender_network_state  s    

zRenderer.render_network_state)rb   rr   c             C   sz  i }�xn|j ƒ D �]`}tƒ }| j||ƒ}| j||ƒ | j||ƒ}| j|||ƒ d}x,|jƒ D ] }| jd|› �||ƒ |d }q\W |jdk�r`|d }	x6|j	d j
ƒ D ]$\}
}d|kr¤|jdƒ|	kr¤|
}	P q¤W |	|j	d k�r`|j	d |	 }| j||ƒ xhdD ]`}d
|› d�|k�rJd|jd
|› d�i ƒk�rJ|	› d|› d|› d�}t|ƒ‚| j||||ƒ � qüW |j||jƒ iƒ qW |S )Nr   ÚcrI   rf   r8   Z	ethernetszset-nameri   Ú6rE   Zdomainzuse-domainsz
-overridesz has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)ri   rx   )Ziter_interfacesr   r:   r;   rV   rh   Ziter_routesrB   rg   r5   r(   r4   ra   ÚRuntimeErrorrl   rj   r-   )r   rb   ru   r9   r6   rn   rE   r"   rY   r8   Zdev_nameZdev_cfgrk   rg   Z	exceptionr   r   r   rs   (  s<    

zRenderer._render_content)N)NN)r.   r/   r0   Ú__doc__r   r   r:   r;   rB   rV   ra   r   rh   rl   ro   r   r   rv   rs   r   r   r   r   r1   Q   s   

	6 
r1   c             C   s6   ddg}ddg}x |D ]}t j||| d�sdS qW dS )NZipZ	systemctlz	/usr/sbinz/bin)rc   rt   FT)r   Zwhich)rt   Zexpectedrc   Úpr   r   r   Ú	availablec  s    
r|   )N)ZloggingÚcollectionsr   Ztypingr   Z	cloudinitr   r   Zcloudinit.netr   Zcloudinit.net.network_stater   Z	getLoggerr.   r]   r   r1   r|   r   r   r   r   Ú<module>   s   
?  