o
    ÷¢iÖ!  ã                   @   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¡s¹t d| d¡¡ qet d|| d¡| d¡¡ | d¡| d¡| d¡pØ| d¡dœ| j|< qe| d	¡dksí| d	¡dkròd| 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 q€w 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   
