
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me0                 @   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}xt | jj D ]\}}|s"q|dkrbxt |D ](}|d| d 7 }||d 7 }|d7 }q4W q|dkrxt |D ]>}|d| d 7 }x(t || D ]}||d 7 }|d7 }qW qtW q|d| d 7 }xt |D ]}||d 7 }qW |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 rx,|d D ] }| jd| || |d }qW 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| qW qW |j|d| |d!krt|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   xd
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 qW |	|j	d kr`|j	d |	 }| j|| xhdD ]`}d
| d|krJd|jd
| di krJ|	 d| d| d}t|| j||||  qW |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   
?  