U
    Ld!                     @   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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}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"   r7   r%   :   z::0)r:   r&   r7   routesr:   zSkipping a bad route entryr"   r&   )
listZiter_routesr(   r   lensplitappendr+   r0   	set_route)
r   r1   r>   r2   r   r5   r7   Zrouter:   r"   r   r   r   _route_entriesr   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 filer   zFailed to add nameserver %szFailed to add search domain %si  )rE   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   r1   ZnameserversZsearchdomainsr2   r5   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)r1   )run)r   r6   rD   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   r4   r3   r   r   r   r-      s    zBSDRenderer.rename_interfacec                 C   s
   t  d S r[   r\   )r   r:   r"   r7   r   r   r   rC      s    zBSDRenderer.set_route)N)NN)F)N)__name__
__module____qualname__rG   r   Zinterface_routesZroute_namesr   r   r   r6   rD   rM   r
   r   dictrT   rZ   rS   rR   r-   rC   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   
