
"T`$                 @   s   d  d l  Z  d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d d	 l m Z e j e  Z Gd
 d   d e j  Z d S)    N)log)net)util)subp)
ResolvConf)	bsd_utils   )rendererc               @   s   e  Z d  Z d Z d Z d d   Z d d   Z d d d	  Z d d
 d  Z d d d  Z	 d d d  Z
 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 |  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   s2   t  j |  j |  j  } t j | | d | d  S)Nr   )r   r   r   r   r   set_rc_config_value)r   r   valuer   r   r   r   r      s    zBSDRenderer.set_rc_config_valueNc             C   s7   | s i  } d  |  _  i  |  _ | j d d  |  _ d  S)NZpostcmdsT)r   interface_configurationsget	_postcmds)r   configr   r   r   __init__   s
    		zBSDRenderer.__init__c       	      C   s  t  j   } x| j   D]} | j d  } | j d  } | rX t j d |  rX q | | k rw t j d |  n~ | r | r | | } | | k r t j d | |  y |  j | |  Wq t	 k
 r t j
 d  | } Yq Xn
 | | } t j d |  d |  j | <x | j d	 g   D] } | j d
  d k r%| j d  skt j d | j d   q%t j d | | j d  | j d   d | j d  d | j d  i |  j | <q%Wq Wd  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DHCPsubnetstypestaticnetmaskz+Skipping IP %s, because there is no netmaskZaddresszConfiguring dev %s with %s / %s)r   Zget_interfaces_by_maciter_interfacesr   rematchLOGinforename_interfaceNotImplementedErrorerrorr   debug)	r   settingsr   Zifname_by_mac	interfacedevice_nameZ
device_maccur_namesubnetr   r   r   _ifconfig_entries$   sB    
	

zBSDRenderer._ifconfig_entriesc          	   C   s4  t  | j    } x | j   D] } | j d g   } x | D] } | j d  d k r\ q> | j d  } | r t | j d   d k r | j d d d	 d d | i  | | j d
 g   7} q> Wq Wxd | D]\ } | j d  }	 |	 s t j d  q | j d	  }
 | j d  } |  j	 |	 |
 |  q Wd  S)Nr   r   r   gateway.   networkz0.0.0.0r    routeszSkipping a bad route entry)
listZiter_routesr!   r   lensplitappendr$   r)   	set_route)r   r*   r   r4   r+   r   r.   r0   Zrouter3   r    r   r   r   _route_entriesQ   s*    !zBSDRenderer._route_entriesc       
      C   s  | j  } | j } xk | j   D]] } xT | j d g   D]@ } d | k r[ | j | d  d | k r8 | j | d  q8 Wq Wy2 t t j t j	 | |  j
    } | j   WnJ t k
 r t j t d t j	 | |  j
   t d  } | j   Yn XxG | D]? } y | j |  Wqt k
 rDt j t d |  YqXqWxG | D]? }	 y | j |	  WqPt k
 rt j t d |	  YqPXqPWt j 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  )r;   Zdns_searchdomainsr!   r   extendr   r   Z	load_filer   r   resolv_conf_fnparseIOErrorZlogexcr$   Zadd_nameserver
ValueErrorZadd_search_domainZ
write_filestr)
r   r*   r   ZnameserversZsearchdomainsr+   r.   Z
resolvconfZserverZdomainr   r   r   _resolve_confh   s<    		zBSDRenderer._resolve_confc             C   sQ   |  j  d |  |  j d |  |  j d |  |  j   |  j d |  j  d  S)Nr*   run)r/   r:   rC   write_configstart_servicesr   )r   Znetwork_stateZ	templatesr   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   rD   r   r   r   rF      s    zBSDRenderer.start_servicesc             C   s   t     d  S)N)r'   )r   r   r   r   r   rE      s    zBSDRenderer.write_configc             C   s   t     d  S)N)r'   )r   r0   r   r   r   set_gateway   s    zBSDRenderer.set_gatewayc             C   s   t     d  S)N)r'   )r   r-   r,   r   r   r   r&      s    zBSDRenderer.rename_interfacec             C   s   t     d  S)N)r'   )r   r3   r    r0   r   r   r   r9      s    zBSDRenderer.set_route)__name__
__module____qualname__r>   r   r   r   r   r/   r:   rC   rG   rM   rF   rE   rN   r&   r9   r   r   r   r   r
      s   -&r
   )r"   Z	cloudinitr   Zloggingr   r   r   Z%cloudinit.distros.parsers.resolv_confr   Zcloudinit.distrosr   r<   r	   Z	getLoggerrO   r$   ZRendererr
   r   r   r   r   <module>   s   