o
    f!                     @   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 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Zdd Zdd Z	d!d	d
Z
dd Zdd Zdd Z		d"dedee ddf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 )NpostcmdsT)r   interface_configurationsinterface_configurations_ipv6get	_postcmds)r   configr   r   r   __init__   s   zBSDRenderer.__init__c              
   C   s  t  }| D ]}|d}|d}|rtd|rq||vr(td| n1|rU|rU|| }||krTtd|| z| || W n t	yS   t
d |}Y nw n|| }td| |dg D ]}|d	d
kr|ds}td|d qetd||d|d |d|d|dp|dd| j|< qe|d	dkr|dstd|d qetd||d|d |d|d|dp|dd| j|< qe|d	dks|d	dkrd| j|< qeqd S )Nname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&   dhcpdhcp4DHCP)r   get_interfaces_by_maciter_interfacesr   rematchLOGinforename_interfaceNotImplementedErrorerrordebugr   r   )r   settingsifname_by_mac	interfacedevice_name
device_maccur_namesubnetr   r   r   _ifconfig_entries'   s   




zBSDRenderer._ifconfig_entriesc           
      C   s$  t | }| D ]X}|dg }|D ]M}|ddkr7|d}|r6t|ddkr6|dd|d n"|dd	krX|d}|rWt|d
dkrW|dd|d nq||dg 7 }qq
|D ]*}|d}|sttd qe|dr~|dn|d}	|d}| 	||	| qed S )Nr!   r"   r#   gateway.   z0.0.0.0)networkr$   r>   r'   :   z::0)rA   r(   r>   routesrA   zSkipping a bad route entryr$   r(   )
listiter_routesr-   r   lensplitappendr0   r5   	set_route)
r   r6   rE   r8   r!   r<   r>   routerA   r$   r   r   r   _route_entriess   sN   




zBSDRenderer._route_entriesc           	      C   sV  |j }|j}| D ]!}|dg D ]}d|v r||d  d|v r*||d  qq
zttt	| j
| j}|  W n ty]   ttdt	| j
| j td}|  Y nw t|D ]}z|| W qb ty{   ttd| Y qbw t|D ]}z|| W q ty   ttd| Y qw tt	| j
| jt|d d S )	Nr!   dns_nameservers
dns_searchz&Failed to parse %s, use new empty filer   zFailed to add nameserver %szFailed to add search domain %si  )rN   dns_searchdomainsr-   r   extendr   r   load_text_filer   r   r   resolv_conf_fnparseIOErrorlogexcr0   setadd_nameserver
ValueErroradd_search_domain
write_filestr)	r   r6   nameserverssearchdomainsr8   r<   
resolvconfserverdomainr   r   r   _resolve_conf   sV   
zBSDRenderer._resolve_confnetwork_state	templatesreturnc                 C   sH   |r|| _ | j|d | j|d | j|d |   | j| jd d S )N)r6   )run)r   r=   rM   rb   write_configstart_servicesr   )r   rc   rd   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   icr   r   r   dhcp_interfaces   s   zBSDRenderer.dhcp_interfacesFc                 C      t  Nr3   )r   rf   r   r   r   rh         zBSDRenderer.start_servicesc                 C   rq   rr   rs   )r   r   r   r   r   rg      rt   zBSDRenderer.write_configc                 C   rq   rr   rs   )r   r;   r9   r   r   r   r2      rt   zBSDRenderer.rename_interfacec                 C   rq   rr   rs   )r   rA   r$   r>   r   r   r   rK      rt   zBSDRenderer.set_routerr   )NN)F)__name__
__module____qualname__rS   r   interface_routesroute_namesroute6_namesr   r   r   r=   rM   rb   r	   r   dictri   rp   rh   rg   r2   rK   r   r   r   r   r
      s4    
L*1


r
   )loggingr.   typingr   	cloudinitr   r   r   cloudinit.distrosr   %cloudinit.distros.parsers.resolv_confr   cloudinit.netr   cloudinit.net.network_stater	   	getLoggerru   r0   Rendererr
   r   r   r   r   <module>   s   
