
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me!                 @   s   d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ e jeZG dd	 d	ejZdS )
    N)Optional)netsubputil)	bsd_utils)
ResolvConf)renderer)NetworkStatec               @   s   e Zd ZdZdZdZdZdd Zdd Zdd	d
Z	dd Z
dd Zdd Zd eee ddddZdd Zd!ddZd"ddZdd Zdd ZdS )#BSDRendererzetc/resolv.confzetc/rc.conf c             C   s"   t j| j| j}tj||d d S )N)fn)r   target_pathtarget
rc_conf_fnr   get_rc_config_value)selfkeyr    r   /usr/lib/python3.6/bsd.pyr      s    zBSDRenderer.get_rc_config_valuec             C   s$   t j| j| j}tj|||d d S )N)r   )r   r   r   r   r   set_rc_config_value)r   r   valuer   r   r   r   r      s    zBSDRenderer.set_rc_config_valueNc             C   s,   |si }d | _ i | _i | _|jdd| _d S )NZpostcmdsT)r   interface_configurationsinterface_configurations_ipv6get	_postcmds)r   configr   r   r   __init__   s    zBSDRenderer.__init__c             C   s  t j }x|j D ]}|jd}|jd}|r@tjd|r@q||krVtjd| nd|r|r|| }||krtjd|| y| j|| W q t	k
r   tj
d |}Y qX n|| }tjd| x:|jdg D ](}|jd	d
krZ|jdstjd|jd qtjd||jd|jd |jd|jd|jdpL|jdd| j|< q|jd	dkr|jdstjd|jd qtjd||jd|jd |jd|jd|jdp|jdd| j|< q|jd	dks|jd	dkrd| j|< qW qW d S )NnameZmac_addressz^lo\d+$z"Cannot find any device with MAC %sz,netif service will rename interface %s to %sz.Interface renaming is not supported on this OSzConfiguring interface %ssubnetstypestaticnetmaskz+Skipping IP %s, because there is no netmaskaddresszConfiguring dev %s with %s / %smtu)r"   r!   r#   static6prefixz*Skipping IP %s, because there is no prefix)r"   r%   r#   ZdhcpZdhcp4DHCP)r   Zget_interfaces_by_maciter_interfacesr   rematchLOGinforename_interfaceNotImplementedErrorerrordebugr   r   )r   settingsZifname_by_mac	interfacedevice_nameZ
device_maccur_namesubnetr   r   r   _ifconfig_entries&   sn    

""zBSDRenderer._ifconfig_entriesc       
      C   s2  t |j }x|j D ]}|jdg }x|D ]}|jddkrr|jd}|rt|jddkr|jdd|d nD|jdd	kr,|jd}|rt|jd
dkr|jdd|d nq,||jdg 7 }q,W qW x^|D ]V}|jd}|stjd q|jdr|jdn|jd}	|jd}| j	||	| qW d S )Nr   r   r    gateway.   z0.0.0.0)networkr!   r6   r$   :   z::0)r9   r%   r6   routesr9   zSkipping a bad route entryr!   r%   )
listZiter_routesr'   r   lensplitappendr*   r/   	set_route)
r   r0   r=   r1   r   r4   r6   Zrouter9   r!   r   r   r   _route_entriesr   s:    







zBSDRenderer._route_entriesc       	      C   sv  |j }|j}xR|j D ]F}x@|jdg D ]0}d|krB|j|d  d|kr(|j|d  q(W qW y&ttjtj	| j
| j}|j  W n> tk
r   tjtdtj	| j
| j td}|j  Y nX xDt|D ]8}y|j| W q tk
r   tjtd| Y qX qW xFt|D ]:}y|j| W n$ tk
rL   tjtd| Y nX qW tjtj	| j
| jt|d d S )	Nr   dns_nameserversZ
dns_searchz&Failed to parse %s, use new empty filer   zFailed to add nameserver %szFailed to add search domain %si  )rD   Zdns_searchdomainsr'   r   extendr   r   Z	load_filer   r   r   resolv_conf_fnparseIOErrorZlogexcr*   setZadd_nameserver
ValueErrorZadd_search_domainZ
write_filestr)	r   r0   ZnameserversZsearchdomainsr1   r4   Z
resolvconfZserverZdomainr   r   r   _resolve_conf   sD    zBSDRenderer._resolve_conf)network_state	templatesreturnc             C   sH   |r
|| _ | j|d | j|d | j|d | j  | j| jd d S )N)r0   )run)r   r5   rC   rL   write_configstart_servicesr   )r   rM   rN   r   r   r   r   render_network_state   s    z BSDRenderer.render_network_statec             C   s   | j j}dd | D S )Nc             S   s   g | ]\}}|d kr|qS )r&   r   ).0kvr   r   r   
<listcomp>   s    z/BSDRenderer.dhcp_interfaces.<locals>.<listcomp>)r   items)r   Zicr   r   r   dhcp_interfaces   s    zBSDRenderer.dhcp_interfacesFc             C   s
   t  d S )N)r-   )r   rP   r   r   r   rR      s    zBSDRenderer.start_servicesc             C   s
   t  d S )N)r-   )r   r   r   r   r   rQ      s    zBSDRenderer.write_configc             C   s
   t  d S )N)r-   )r   r3   r2   r   r   r   r,      s    zBSDRenderer.rename_interfacec             C   s
   t  d S )N)r-   )r   r9   r!   r6   r   r   r   rB      s    zBSDRenderer.set_route)N)NN)F)N)__name__
__module____qualname__rF   r   Zinterface_routesZroute_namesr   r   r   r5   rC   rL   r	   r   dictrS   rY   rR   rQ   r,   rB   r   r   r   r   r
      s$   
L*1 



r
   )Zloggingr(   Ztypingr   Z	cloudinitr   r   r   Zcloudinit.distrosr   Z%cloudinit.distros.parsers.resolv_confr   Zcloudinit.netr   Zcloudinit.net.network_stater	   Z	getLoggerrZ   r*   ZRendererr
   r   r   r   r   <module>   s   
