o
    w7e#                     @   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   sF   t j| ||| t|| _d| _d|d< t  r!t	d d S d S )Ngentooz/etc/init.d/sshdssh_svcnamez/Cloud-init does not support systemd with gentoo)
r   r
   __init__r   Runners_runnerosfamilyuses_systemdLOGerror)selfname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captureeselectlocalesetN)r   
write_filelocale_gen_fnjoinlocalesr   default_locale)r   _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 ]\}}d|v r%||d  |dkr*q| jd | }|d}t	|t
tfrGtt|dd}d}	|ddkrY|	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rdddj|d
dg}
zt|
\}}t|rtd|
| W q tjy   ttd|
 Y qw q|rt| jt| |S )Nz3Translated ubuntu style network settings %s into %szdns-nameserverslo.,r)   	bootprotodhcpzconfig_{name}="dhcp"r   zEconfig_{name}="{ip_address} netmask {netmask}"
mac_{name}="{hwaddr}"
addressnetmask	hwaddress)r   
ip_addressr6   hwaddrz&routes_{name}="default via {gateway}"
gateway)r   r:   z"dns_servers_{name}="{dnsservers}"
)r   
dnsserversautoz	rc-updateaddz
net.{name}default(Running %s resulted in stderr output: %s#Running interface command %s failed)r   translate_networkr   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entries	dev_namesnameserversdevinfonet_fndns_nameserversresultscmd_outerrr   r   r   _write_network?   s~   

	





zDistro._write_networkc                 C   s*   dj | d}t|std| d S d S )Nz/etc/init.d/net.{name}r4   z/etc/init.d/net.lo)rM   r   is_linksym_link)interface_name	file_pathr   r   r   rN      s   
zDistro._create_network_symlinkc                 C   sj   d| dg}t d|| zt|\}}t|r t d|| W dS  tjy4   tt d| Y dS w )Nz/etc/init.d/net.%srestartz8Attempting to run bring up interface %s using command %sr?   Tr@   F)r   rB   r   rO   rP   rQ   r   rR   )r   device_namer^   r_   r`   r   r   r   _bring_up_interface   s"   zDistro._bring_up_interfacec                 C   s   d}|D ]}|dkrd}q|rKddg}zt  |\}}t|r&td|| W n t jy9   ttd| Y dS w dd	 |d
D }tj	
| |S tj	
| |S )NFallTlsz/etc/init.d/net.*r?   r@   c                 S   s   g | ]	}| d d qS )r0      )split).0xr   r   r   
<listcomp>   s    z/Distro._bring_up_interfaces.<locals>.<listcomp>z  )r   rO   r   rP   rQ   r   rR   rl   r   r
   _bring_up_interfaces)r   device_namesuse_alldr^   r_   r`   devicesr   r   r   rp      s*   zDistro._bring_up_interfacesc                 C   sV   d }z|  |}W n	 ty   Y nw |std}|d|  t|t|d d S )Nr)   zhostname="%s"i  )_read_hostname_confIOErrorr   set_hostnamer   r!   rK   )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   sys_hostnamer   r   r   _read_system_hostname   s   
zDistro._read_system_hostnamec                 C   s   t t| }|  |S r|   )r   r   	load_fileparse)ry   rz   r   r   r   ru      s   zDistro._read_hostname_confc                 C   s8   d }z
|  |}|j}W n	 ty   Y nw |s|S |S r|   )ru   rx   rv   )r   ry   r>   rx   rz   r   r   r   r}      s   

zDistro._read_hostnamec                 C   s   t j|| |d d S )N)tztz_file)r   set_etc_timezone_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 n1|d u rg }|r(t|tr(|| n|r4t|t r4|| |r;|| td|}|| tj|dd d S )	Nemergez--quietupgradez--updateworldz%s-%sFr   )rI   appendrE   rH   rK   r   expand_package_listr   )r   commandargsr*   r^   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)freq)r   runr,   r	   )r   r   r   r   r+      s   
zDistro.update_package_sourcesr|   )NN)__name__
__module____qualname__locale_conf_fnr"   rF   r~   init_cmdr%   r$   r   r(   r.   ra   staticmethodrN   rh   rp   r{   r   ru   r}   r   r,   r+   r   r   r   r   r
      s0    
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
)rH   rI   )rU   resultnsr   r   r   rT      s
   
rT   N)	cloudinitr   r   r   loggingr   r   cloudinit.distrosr   "cloudinit.distros.parsers.hostnamer   cloudinit.settingsr	   	getLoggerr   r   r
   rT   r   r   r   r   <module>   s   
 l