
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\met$                 @   sp   d dl Z d dlmZmZmZmZ d dlmZmZ d dl	m
Z
 d dlmZ e jeZG dd dejZdd	 ZdS )
    N)distroshelperssubputil)PackageList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ed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j| ||| tj|| _d| _d|d< t j r>tj	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.6/gentoo.pyr      s    zDistro.__init__Nc             C   sF   t j| jdj| 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)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_locale)pkglistc             C   s   | j   | jd|d d S )N )pkgs)update_package_sourcespackage_command)r   r   r   r   r   install_packages;   s    zDistro.install_packagesc             C   s  t j|}tjd|| |j }g }xx|j D ]j\}}d|krP|j|d  |dkrZq0| jd | }|jd}t	|t
tfrtt|jdd}d}	|jddkr|	d	j|d
7 }	n@|	dj||jd|jd|jdd7 }	|	dj||jdd7 }	|jdr|	dj||d7 }	tj||	 | j| |jdr0dddj|d
dg}
y*tj|
\}}t|rrtjd|
| W q0 tjk
r   tjtd|
 Y q0X q0W |rt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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}defaultz(Running %s resulted in stderr output: %sz#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   settingsZentriesZ	dev_namesZnameserversZdevinfoZnet_fnZdns_nameserversresultscmd_outerrr   r   r   _write_network?   sf    






zDistro._write_networkc             C   s&   dj | d}tj|s"tjd| d S )Nz/etc/init.d/net.{name})r   z/etc/init.d/net.lo)r8   r   is_linkZsym_link)Zinterface_nameZ	file_pathr   r   r   r9      s    
zDistro._create_network_symlinkc             C   sl   d| dg}t jd|| y(tj|\}}t|r@t jd|| dS  tjk
rf   tjt d| dS X d 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   r:   r;   r<   r   r=   )r   Zdevice_namerB   rC   rD   r   r   r   _bring_up_interface   s    
zDistro._bring_up_interfacec             C   s   d}x|D ]}|dkr
d}q
W |rddg}y(t j |\}}t|rPtjd|| W n$ t jk
rv   tjtd| dS X dd	 |jd
D }tj	j
| |S tj	j
| |S d 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   r:   r   r;   r<   r   r=   rJ   r   r
   _bring_up_interfaces)r   Zdevice_namesZuse_alldrB   rC   rD   Zdevicesr   r   r   rN      s"    
zDistro._bring_up_interfacesc             C   sr   d }y| j |}W n. tk
r@   tj| jdd}|r8nd S Y nX |sNtd}|jd|  tj|t|d d S )Ncreate_hostname_fileTr    zhostname="%s"i  )	_read_hostname_confIOErrorr   Zget_cfg_option_boolZ_cfgr   Zset_hostnamer   r6   )r   hostnamefilenameconfrP   r   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)rT   rU   r   r   r   rQ      s    zDistro._read_hostname_confc             C   s:   d }y| j |}|j}W n tk
r,   Y nX |s6|S |S )N)rQ   rS   rR   )r   rT   r,   rS   rU   r   r   r   rW      s    

zDistro._read_hostnamec             C   s   t j|| 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   dg}|j d |dkr(|jddg nb|d kr4g }|rNt|trN|j | n|rft|trf|j| |rt|j | tjd|}|j| tj|dd d S )	NZemergez--quietZupgradez--updateZworldz%s-%sF)r   )appendr0   r3   r6   r4   r   Zexpand_package_listr   )r   Zcommandargsr!   rB   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   Zrunr#   r	   )r   r   r   r   r"      s
    zDistro.update_package_sources)N)N)NN)__name__
__module____qualname__Zlocale_conf_fnr   r1   rX   Zinit_cmdr   r   r   r   r   r$   rE   staticmethodr9   rG   rN   rV   rY   rQ   rW   r\   r#   r"   r   r   r   r   r
      s*   
F

r
   c             C   s,   d}t | tr(x| D ]}|d| 7 }qW |S )z4Returns a settings string formatted for resolv.conf.r    znameserver %s
)r3   r4   )r?   resultnsr   r   r   r>     s
    

r>   )ZloggingZ	cloudinitr   r   r   r   Zcloudinit.distrosr   r   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.settingsr	   Z	getLoggerr_   r   r
   r>   r   r   r   r   <module>	   s   
 r