o
    w7e!                     @   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"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)rB   r)   r?   routesrB   zSkipping a bad route entryr%   r)   )
listiter_routesr.   r   lensplitappendr1   r6   	set_route)
r   r7   rF   r9   r"   r=   r?   routerB   r%   r   r   r   _route_entriesr   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  )rO   dns_searchdomainsr.   r   extendr   r   	load_filer   r   r   resolv_conf_fnparseIOErrorlogexcr1   setadd_nameserver
ValueErroradd_search_domain
write_filestr)	r   r7   nameserverssearchdomainsr9   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)r7   )run)r   r>   rN   rc   write_configstart_servicesr   )r   rd   re   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r4   )r   rg   r   r   r   ri         zBSDRenderer.start_servicesc                 C   rr   rs   rt   )r   r   r   r   r   rh      ru   zBSDRenderer.write_configc                 C   rr   rs   rt   )r   r<   r:   r   r   r   r3      ru   zBSDRenderer.rename_interfacec                 C   rr   rs   rt   )r   rB   r%   r?   r   r   r   rL      ru   zBSDRenderer.set_routers   )NN)F)__name__
__module____qualname__rT   r   interface_routesroute_namesr   r   r   r>   rN   rc   r
   r   dictrj   rq   ri   rh   r3   rL   r   r   r   r   r      s2    
L*1


r   )r/   typingr   	cloudinitr   loggingr   r   r   cloudinit.distrosr   %cloudinit.distros.parsers.resolv_confr   cloudinit.netr	   cloudinit.net.network_stater
   	getLoggerrv   r1   Rendererr   r   r   r   r   <module>   s   
