o
    x[h3  ã                   @   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	m
Z
 d dlmZ e  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Úshould_add_gateway_onlink_flag)Ú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   ú8/usr/lib/python3/dist-packages/cloudinit/net/networkd.pyÚ__init__   s   ù
ÿzCfgParser.__init__c                 C   s`   | j  ¡ D ](}||kr-| j |  |d t|ƒ ¡ tt | j | ¡ƒ| j |< | j |  ¡  q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Œ   | j  ¡ D ]>}||krC|| j | vrg | j | |< | j | |  |d t|ƒ ¡ tt | j | | ¡ƒ| j | |< | j | |  ¡  q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   Nr   )r   r   Úridr    r!   r"   r   r   r   Úupdate_route_section(   s    ÿ€÷zCfgParser.update_route_sectionc                 C   sâ   d}t | j ¡ ƒD ]e\}}|sq	|dkr.t |ƒD ]}|d| d 7 }||d 7 }|d7 }qq	|dkrUt |ƒD ]}|d| d 7 }t || ƒD ]}||d 7 }qF|d7 }q6q	|d| d 7 }t |ƒD ]}||d 7 }qa|d7 }q	|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defdd„Zdefdd	„Zdefd
d„Zdefdd„Z	defdd„Z
dedefdd„Zdefdd„Zdd„ Z		ddedee ddfdd„Zdedef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 }|  dd¡| _|  dd¡| _d S )NÚresolve_conf_fnz/etc/systemd/resolved.confÚnetwork_conf_dirz/etc/systemd/network/)Úgetr4   r5   )r   Úconfigr   r   r   r   Y   s   ÿ
ÿzRenderer.__init__Úcfgc                 C   sT   d}ddddœ}|sd S |  ¡ D ]\}}||v r%|| r%| |||| ¡ q|d S )Nr
   ÚNameÚDriverÚ
MACAddress)ÚnameÚdriverÚmac_addressr<   )r*   r#   )r   Úifacer8   r   Ú
match_dictr"   r,   r   r   r   Úgenerate_match_sectionc   s   ý€zRenderer.generate_match_sectionc                 C   sX   d}|sd S d|v r|d r|  |d|d ¡ d|v r(|d r*|  |dd¡ d S d S d S )Nr   ÚmtuÚMTUBytesÚoptionalÚRequiredForOnlineÚno)r#   )r   r?   r8   r   r   r   r   Úgenerate_link_sectiont   s   ÿzRenderer.generate_link_sectionc           	      C   sp   d}ddddœ}d}d|v rdt |d ƒ }| ¡ D ]\}}||vr#q|d	kr+||7 }| |||| |¡ q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   ÚGatewayÚDestinationÚMetric)ÚgatewayÚnetworkÚmetricr&   Úprefixú/rL   N)r   r*   r%   )	r   r$   Úconfr8   r   Úroute_cfg_maprN   r"   r,   r   r   r   Úparse_routes€   s   ýûzRenderer.parse_routesc              	   C   sÎ  d}d}d}|  dg ¡D ]¿}|d }|dks|dkr(|dkr!d}n|d	kr'd
}n|dkr9|dkr3d	}n|dkr9d
}d|v rV|d rV|d D ]}|  d|› �||¡ |d }qEd|v rË|d }	d|v rl|	dt|d ƒ 7 }	dddddœ}
| ¡ D ]S\}}|dkr‰| d|
| |	¡ qw|dkr¶| dd|› �|
| |¡ t||	ƒr±t d||	¡ | dd|› �dd
¡ |d }qw|dks¾|dkrÊ| ||
| d 	|¡¡ qwq| |d|¡ t
|  d d!¡tƒrå| |d"|d  ¡ |S )#NrF   r   r   ÚsubnetsÚtypeÚdhcp4ÚdhcpÚipv4Úipv6ÚyesÚdhcp6ÚroutesÚré   ÚaddressrN   rO   r   rH   ÚDNSÚDomains)r^   rK   Údns_nameserversÚ
dns_searchrK   r   ÚazGGateway %s is not contained within subnet %s, adding GatewayOnLink flagÚGatewayOnLinkra   rb   ú ÚDHCPz	accept-rar&   ÚIPv6AcceptRA)r6   rR   r   r*   r#   r%   r   ÚLOGÚdebugÚjoinÚ
isinstanceÚbool)r   r?   r8   rV   r   r$   r-   ÚtÚiÚaddrÚsubnet_cfg_mapr"   r,   r   r   r   Úparse_subnets˜   sj   €
üÿ
üÿ
€zRenderer.parse_subnetsc              	   C   sŽ   dD ]B}||vr	qt || ƒ ¡ }zt |¡}|rdnd}W n ty3   |dkr1t d|¡ d}Y nw |dkr;d}nd}| |d	|¡ qd S )
N)Údhcp4domainÚdhcp6domainrY   rF   ÚroutezInvalid dhcp4domain value - %srr   r   r   Ú
UseDomains)r   Úcasefoldr   Útranslate_boolÚ
ValueErrorrh   Úwarningr#   )r   Údr8   ÚitemÚretÚsectionr   r   r   Údhcp_domain×   s$   
€ýñzRenderer.dhcp_domainÚnsc                 C   sŠ   d}|  d¡}|s|jdkr|j|jdœ}n	|s|jdkrd S |  d¡r0| |dd |d ¡¡ |  d	¡rC| |d
d |d	 ¡¡ d S d S )Nr   Údnsr]   )ÚsearchÚnameserversé   r�   r`   re   r‚   r_   )r6   ÚversionÚdns_searchdomainsra   r#   rj   )r   r?   r8   r   r   r€   r   r   r   Ú	parse_dnsé   s   
þ

ÿzRenderer.parse_dnsc           	      C   sœ   dddddœ}|dkr|  ddd	d
ddœ¡ d|› d�|v rH|dd|› �fv rJ|d|› d� }| ¡ D ]\}}||v rG| d|› �||| ¡ q3d S d S d S )Nzuse-dnsúuse-domainszuse-hostnamezuse-ntp)ÚUseDNSru   ÚUseHostnameÚUseNTPÚ4zsend-hostnameÚhostnamezroute-metriczuse-mtuz
use-routes)ÚSendHostnameÚHostnameÚRouteMetricÚUseMTUÚ	UseRoutesrV   ú
-overridesrY   ÚipvÚDHCPv)Úupdater*   r#   )	r   r8   ÚdevicerV   r„   Údhcp_config_mapsÚdhcp_overridesr"   r,   r   r   r   Úparse_dhcp_overridesú   s2   üûÿ
þ€ùzRenderer.parse_dhcp_overridesc                 C   s>   d}t  d|¡ |d | d }t ||¡ t |||¡ d S )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)rh   ri   r   Ú
write_fileÚchownbyname)r   ÚlinkrP   Únwk_dirÚnet_fn_ownerÚnet_fnr   r   r   Úcreate_network_file  s
   zRenderer.create_network_fileÚnetwork_stateÚ	templatesÚreturnc                 C   sP   | j }|rt |¡| }t |¡ |  |¡}| ¡ D ]\}}|  |||¡ qd S ©N)r5   r   Útarget_pathr   Ú
ensure_dirÚ_render_contentr*   r    )r   r¡   r¢   ÚtargetÚnetwork_dirÚret_dictr"   r,   r   r   r   Úrender_network_state  s   

ÿzRenderer.render_network_statec                 C   s^  i }|  ¡ D ]¦}tƒ }|  ||¡}|  ||¡ |  ||¡}|  |||¡ d}| ¡ D ]}|  d|› �||¡ |d }q*|jdkr£|d }	|j	d  
¡ D ]\}
}d|v r^| d¡|	kr^|
}	 nqK|	|j	d v r£|j	d |	 }|  ||¡ dD ]-}d	|› d
�|v ršd| d	|› d�i ¡v rš|	› d|› d|› d�}t|ƒ‚|  ||||¡ qu| || ¡ i¡ q|S )Nr   Úcr]   rƒ   r<   Ú	ethernetszset-name)r‹   Ú6rV   Údomainr‡   r’   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)Úiter_interfacesr	   rA   rG   rq   r†   Úiter_routesrR   r„   r7   r*   r6   r~   ÚRuntimeErrorr™   r•   r/   )r   r   rª   r?   r8   rœ   rV   r$   rt   r<   Údev_nameÚdev_cfgr–   r„   Ú	exceptionr   r   r   r§   /  sF   


€ÿÿÿzRenderer._render_contentr¤   )NN)r0   r1   r2   Ú__doc__r   r	   rA   rG   rR   rq   r~   r   r†   r™   r    r   r   r«   r§   r   r   r   r   r3   Q   s*    

?üþý
ûr3   c                 C   s4   ddg}ddg}|D ]}t j||| d�s dS q
dS )NÚipÚ	systemctlz	/usr/sbinz/bin)r�   r¨   FT)r   Úwhich)r¨   Úexpectedr�   Úpr   r   r   Ú	availablej  s   ÿr¼   r¤   )ÚloggingÚcollectionsr   Útypingr   Ú	cloudinitr   r   Úcloudinit.netr   r   Úcloudinit.net.network_stater   Ú	getLoggerr0   rh   r	   r3   r¼   r   r   r   r   Ú<module>   s   
?  