U
    Ad!                     @   s   d dl Z d dlm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eZG d	d
 d
ejZdS )    N)Optional)log)netsubputil)	bsd_utils)
ResolvConf)renderer)NetworkStatec                   @   s   e 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d ZdS )$BSDRendererzetc/resolv.confzetc/rc.confc                 C   s"   t | j| j}tj||d d S N)fn)r   target_pathtarget
rc_conf_fnr   get_rc_config_value)selfkeyr    r   3/usr/lib/python3/dist-packages/cloudinit/net/bsd.pyr      s    zBSDRenderer.get_rc_config_valuec                 C   s$   t | j| j}tj|||d d S 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 | _|dd| _d S )NZpostcmdsT)r   interface_configurationsinterface_configurations_ipv6get	_postcmds)r   Zconfigr   r   r   __init__   s    zBSDRenderer.__init__c              
   C   s   t  }| D ]}|d}|d}|r<td|r<q||krRtd| nd|r|r|| }||krtd|| z| || W q t	k
r   t
d |}Y qX n|| }td| |dg D ](}|d	d
krR|dstd|d qtd||d|d |d|d|dpD|dd| j|< q|d	dkr|dstd|d qtd||d|d |d|d|dp|dd| j|< q|d	dks|d	dkrd| j|< qq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$   s    

zBSDRenderer._ifconfig_entriesc           
      C   s$  t | }| D ]}|dg }|D ]}|ddkrn|d}|rt|ddkr|dd|d nD|dd	kr(|d}|rt|d
dkr|dd|d nq(||dg 7 }q(q|D ]T}|d}|std q|dr|dn|d}	|d}| 	||	| qd 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_entriesp   sF    




zBSDRenderer._route_entriesc           	      C   sd  |j }|j}| D ]B}|dg D ]0}d|kr>||d  d|kr$||d  q$qz&ttt	| j
| j}|  W n> tk
r   ttdt	| j
| j td}|  Y nX t|D ]6}z|| W q tk
r   ttd| Y qX qt|D ]:}z|| W n$ tk
r<   ttd| Y nX qtt	| j
| jt|d d S )	Nr   dns_nameserversZ
dns_searchz&Failed to parse %s, use new empty file 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   sL    zBSDRenderer._resolve_conf)network_state	templatesreturnc                 C   sH   |r
|| _ | j|d | j|d | j|d |   | j| jd d S )N)r0   )run)r   r5   rC   rM   write_configstart_servicesr   )r   rN   rO   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   rQ   r   r   r   rS      s    zBSDRenderer.start_servicesc                 C   s
   t  d S r[   r\   )r   r   r   r   r   rR      s    zBSDRenderer.write_configc                 C   s
   t  d S r[   r\   )r   r6   r   r   r   set_gateway   s    zBSDRenderer.set_gatewayc                 C   s
   t  d S r[   r\   )r   r3   r2   r   r   r   r,      s    zBSDRenderer.rename_interfacec                 C   s
   t  d S r[   r\   )r   r9   r!   r6   r   r   r   rB      s    zBSDRenderer.set_route)N)NN)F)N)__name__
__module____qualname__rG   r   r   r   r   r5   rC   rM   r
   r   dictrT   rZ   rS   rR   r]   r,   rB   r   r   r   r   r      s*   
L*1  

r   )r(   typingr   Z	cloudinitr   Zloggingr   r   r   Zcloudinit.distrosr   Z%cloudinit.distros.parsers.resolv_confr   Zcloudinit.netr	   Zcloudinit.net.network_stater
   Z	getLoggerr^   r*   ZRendererr   r   r   r   r   <module>   s   
