
"T`s                  @   s   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
 d  d l m Z e j e  Z Gd	 d
   d
 e j  Z d d   Z d S)    )distros)helpers)log)subp)util)net_util)HostnameConf)PER_INSTANCEc               @   s   e  Z d  Z d Z d Z d Z d Z d g Z d d   Z d d	 d
  Z	 d d   Z
 d d   Z e d d    Z d d   Z d d   Z d d   Z d d   Z e d d    Z d d d  Z d d   Z d d d d   Z d! d"   Z d S)#Distroz/etc/locale.genz/etc/conf.d/netz/etc/resolv.confz/etc/conf.d/hostnamez
rc-servicec             C   sB   t  j j |  | | |  t j |  |  _ d |  _ d | d <d  S)NZgentooz/etc/init.d/sshdZssh_svcname)r   r
   __init__r   ZRunners_runnerZosfamily)selfnameZcfgpaths r   :/usr/lib/python3/dist-packages/cloudinit/distros/gentoo.pyr      s    	zDistro.__init__Nc             C   sa   | s |  j  } t j d d | g d d t j   d | d g } t j | d j |   d  S)Nz
locale-genz-GcaptureFz	LANG="%s" 
)locale_conf_fnr   r   Zmake_header
write_filejoin)r   Zlocaleout_fnlinesr   r   r   apply_locale(   s    			zDistro.apply_localec             C   s!   |  j    |  j d d | d  S)Nr   pkgs)update_package_sourcespackage_command)r   pkglistr   r   r   install_packages4   s    
zDistro.install_packagesc             C   sg  t  j |  } t j d | |  | j   } g  } x| j   D]\ } } d | k rj | j | d  | d k ry qA |  j d | } | j d  } t	 | t
 t f  r t t |   j d d  } d }	 | j d  d k r |	 d	 j d
 |  7}	 nh |	 d j d
 | d | j d  d | j d  d | j d   7}	 |	 d j d
 | d | j d   7}	 | j d  r|	 d j d
 | d |  7}	 t j | |	  |  j |  | j d  rA d d d j d
 |  d g }
 y8 t j |
  \ } } t |  rt j d |
 |  WqA t j k
 r?t j t d |
  YqA XqA W| rct j |  j t |   | S)Nz3Translated ubuntu style network settings %s into %szdns-nameserverslo.,r   Z	bootprotoZdhcpzconfig_{name}="dhcp"r   zEconfig_{name}="{ip_address} netmask {netmask}"
mac_{name}="{hwaddr}"
Z
ip_addressZaddressZnetmaskZhwaddrZ	hwaddressz&routes_{name}="default via {gateway}"
Zgatewayz"dns_servers_{name}="{dnsservers}"
Z
dnsserversZautoz	rc-updateaddz
net.{name}defaultz(Running %s resulted in stderr output: %sz#Running interface command %s failed)r   Ztranslate_networkLOGdebugkeysitemsextendnetwork_conf_fnget
isinstancelisttuplestrreplaceformatr   r   _create_network_symlinkr   lenwarningProcessExecutionErrorlogexcresolve_conf_fnconvert_resolv_conf)r   settingsentriesZ	dev_namesZnameserversZdevinfoZnet_fnZdns_nameserversZresultscmd_outerrr   r   r   _write_network8   s\    	
	
		zDistro._write_networkc             C   s5   d j  d |   } t j |  s1 t j d |  d  S)Nz/etc/init.d/net.{name}r   z/etc/init.d/net.lo)r1   r   Zis_linkZsym_link)Zinterface_nameZ	file_pathr   r   r   r2   p   s    zDistro._create_network_symlinkc             C   s   d | d g } t  j d | |  y< t j |  \ } } t |  rZ t  j d | |  d SWn, t j k
 r t j t  d |  d SYn Xd  S)Nz/etc/init.d/net.%sZrestartz8Attempting to run bring up interface %s using command %sz(Running %s resulted in stderr output: %sTz#Running interface command %s failedF)r%   r&   r   r3   r4   r5   r   r6   )r   Zdevice_namer<   r=   r>   r   r   r   _bring_up_interfacev   s    	
	
zDistro._bring_up_interfacec             C   s   d } x  | D] } | d k r d } q W| r d d g } y8 t  j  |  \ } } t |  rr t j d | |  Wn, t  j k
 r t j t d |  d SYn Xd d	   | j d
  D } t j	 j
 |  |  St j	 j
 |  |  Sd  S)NFallTZlsz/etc/init.d/net.*z(Running %s resulted in stderr output: %sz#Running interface command %s failedc             S   s#   g  |  ] } | j  d   d  q S)r!      )split).0xr   r   r   
<listcomp>   s   	 z/Distro._bring_up_interfaces.<locals>.<listcomp>z  )r   r3   r%   r4   r5   r   r6   rC   r   r
   _bring_up_interfaces)r   Zdevice_namesZuse_alldr<   r=   r>   Zdevicesr   r   r   rG      s"    
		zDistro._bring_up_interfacesc             C   sn   d  } y |  j  |  } Wn t k
 r- Yn X| s@ t d  } | j d |  t j | t |  d  d  S)Nr   zhostname="%s"i  )_read_hostname_confIOErrorr   Zset_hostnamer   r   r/   )r   Zyour_hostnamer   confr   r   r   _write_hostname   s    zDistro._write_hostnamec             C   s   |  j  |  j  } |  j | f S)N)_read_hostnamehostname_conf_fn)r   Zsys_hostnamer   r   r   _read_system_hostname   s    zDistro._read_system_hostnamec             C   s#   t  t j |    } | j   | S)N)r   r   Z	load_fileparse)filenamerK   r   r   r   rI      s    
zDistro._read_hostname_confc             C   sE   d  } y |  j  |  } | j } Wn t k
 r6 Yn X| sA | S| S)N)rI   hostnamerJ   )r   rQ   r$   rR   rK   r   r   r   rM      s    zDistro._read_hostnamec             C   s#   t  j d | d |  j |   d  S)NtzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rS   r   r   r   set_timezone   s    zDistro.set_timezonec             C   s   | d  k r g  } t  d  } | j d  | rP t | t  rP | j |  n" | rr t | t   rr | j |  | r | j |  t j d |  } | j |  t j | d d d  S)NZemergez--quietz%s-%sr   F)r-   appendr,   r/   r)   r   Zexpand_package_listr   )r   Zcommandargsr   r<   r   r   r   r   r      s    zDistro.package_commandc             C   s)   |  j  j d |  j d d g d t d  S)Nzupdate-sourcesz-uZworldZfreq)r   Zrunr   r	   )r   r   r   r   r      s    zDistro.update_package_sources)__name__
__module____qualname__r   r*   r7   rN   Zinit_cmdr   r   r   r?   staticmethodr2   r@   rG   rL   rO   rI   rM   rT   r   r   r   r   r   r   r
      s&   	
8r
   c             C   s8   d } t  |  t  r4 x |  D] } | d | 7} q W| S)z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)r,   r-   )r9   resultnsr   r   r   r8      s
    r8   N)Z	cloudinitr   r   r   Zloggingr   r   Zcloudinit.distrosr   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.settingsr	   Z	getLoggerrW   r%   r
   r8   r   r   r   r   <module>	   s   