U
    Ld#                     @   sx   d dl mZmZ d dl mZ d dl mZ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	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Zd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#Zd$d% ZdS ))Distroz/etc/env.d/02localez/etc/locale.genz/etc/conf.d/netz/etc/conf.d/hostnamez
rc-servicezen_US.UTF-8zC.UTF8 UTF-8zen_US.UTF-8 UTF-8c                 C   sB   t j| ||| t|| _d| _d|d< t  r>t	d d S )NZgentooz/etc/init.d/sshdZssh_svcnamez/Cloud-init does not support systemd with gentoo)
r   r
   __init__r   ZRunners_runnerZosfamilyZuses_systemdLOGerror)selfnameZcfgpaths r   :/usr/lib/python3/dist-packages/cloudinit/distros/gentoo.pyr      s    zDistro.__init__Nc                 C   sF   t j| jd| jdd tjdgdd tjddd	| jgdd d
S )zrc-only - not compatible with systemd

        Locales need to be added to /etc/locale.gen and generated prior
        to selection. Default to en_US.UTF-8 for simplicity.
        
i  )modez
locale-genFZcaptureZeselectZlocalesetN)r   
write_filelocale_gen_fnjoinlocalesr   default_locale)r   _Zout_fnr   r   r   apply_locale+   s     zDistro.apply_localec                 C   s   |    | jd|d d S )N )pkgs)update_package_sourcespackage_command)r   pkglistr   r   r   install_packages;   s    zDistro.install_packagesc              	   C   s  t |}td|| | }g }| D ]j\}}d|krL||d  |dkrVq,| jd | }|d}t	|t
tfrtt|dd}d}	|ddkr|	d	j|d
7 }	n@|	dj||d|d|dd7 }	|	dj||dd7 }	|dr|	dj||d7 }	t||	 | | |dr,dddj|d
dg}
z*t|
\}}t|rntd|
| W q, tjk
r   ttd|
 Y q,X q,|rt| 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addressnetmaskZ	hwaddress)r   Z
ip_addressr)   Zhwaddrz&routes_{name}="default via {gateway}"
gateway)r   r*   z"dns_servers_{name}="{dnsservers}"
)r   Z
dnsserversautoz	rc-updateaddz
net.{name}default(Running %s resulted in stderr output: %s#Running interface command %s failed)r   Ztranslate_networkr   debugkeysitemsextendnetwork_conf_fnget
isinstancelisttuplestrreplaceformatr   r   _create_network_symlinkr   lenwarningProcessExecutionErrorlogexcZ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_network?   s    

	  



   zDistro._write_networkc                 C   s&   dj | d}t|s"td| d S )Nz/etc/init.d/net.{name}r(   z/etc/init.d/net.lo)r;   r   Zis_linkZsym_link)Zinterface_nameZ	file_pathr   r   r   r<      s    
zDistro._create_network_symlinkc                 C   sp   d| dg}t d|| z*t|\}}t|r@t d|| W dS  tjk
rj   tt d| Y dS X d S )Nz/etc/init.d/net.%sZrestartz8Attempting to run bring up interface %s using command %sr.   Tr/   F)r   r0   r   r=   r>   r?   r   r@   )r   Zdevice_namerE   rF   rG   r   r   r   _bring_up_interface   s$      zDistro._bring_up_interfacec                 C   s   d}|D ]}|dkrd}q|rddg}z(t  |\}}t|rLtd|| W n& t jk
rt   ttd| Y dS X dd	 |d
D }tj	
| |S tj	
| |S d S )NFallTZlsz/etc/init.d/net.*r.   r/   c                 S   s   g | ]}| d d qS )r&      )split).0xr   r   r   
<listcomp>   s     z/Distro._bring_up_interfaces.<locals>.<listcomp>z  )r   r=   r   r>   r?   r   r@   rL   r   r
   _bring_up_interfaces)r   Zdevice_namesZuse_alldrE   rF   rG   Zdevicesr   r   r   rP      s(      zDistro._bring_up_interfacesc                 C   sX   d }z|  |}W n tk
r&   Y nX |s4td}|d|  t|t|d d S )Nr   zhostname="%s"i  )_read_hostname_confIOErrorr   Zset_hostnamer   r   r9   )r   hostnamefilenameconfr   r   r   _write_hostname   s    zDistro._write_hostnamec                 C   s   |  | 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| }|  |S rX   )r   r   Z	load_fileparse)rU   rV   r   r   r   rR      s    zDistro._read_hostname_confc                 C   s:   d }z|  |}|j}W n tk
r,   Y nX |s6|S |S rX   )rR   rT   rS   )r   rU   r-   rT   rV   r   r   r   rY      s    

zDistro._read_hostnamec                 C   s   t j|| |d d S )N)tzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   r]   r   r   r   set_timezone   s    zDistro.set_timezonec                 C   s   t d}|d |dkr*|ddg nb|d kr6g }|rPt|trP|| n|rht|t rh|| |rv|| td|}|| tj|dd d S )	NZemergez--quietZupgradez--updateZworldz%s-%sFr   )r7   appendr3   r6   r9   r   Zexpand_package_listr   )r   Zcommandargsr    rE   r#   r   r   r   r"      s    



zDistro.package_commandc                 C   s   | j jd| jdgtd d S )Nzupdate-sourcesz--sync)Zfreq)r   runr"   r	   )r   r   r   r   r!      s    zDistro.update_package_sources)N)N)NN)__name__
__module____qualname__Zlocale_conf_fnr   r4   rZ   Zinit_cmdr   r   r   r   r$   rH   staticmethodr<   rI   rP   rW   r[   rR   rY   r^   r"   r!   r   r   r   r   r
      s.   
F



r
   c                 C   s(   d}t | tr$| D ]}|d| 7 }q|S )z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)r6   r7   )rB   resultnsr   r   r   rA      s
    
rA   N)Z	cloudinitr   r   r   Zloggingr   r   Zcloudinit.distrosr   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.settingsr	   Z	getLoggerrb   r   r
   rA   r   r   r   r   <module>	   s   
 l