
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me"  ã               @   s¢   d dl Z 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 d dlmZ d dlmZ e jeƒZG dd	„ d	ejƒZddd„Zdd„ Zdd„ ZdS )é    N)ÚdistrosÚhelpersÚsubpÚutil)ÚPackageListÚnet_util)ÚHostnameConf)ÚRenderer)ÚRendererNotFoundError)ÚPER_INSTANCEc                   s¼   e Zd ZdZdZdgZdddddœiZd	d
„ Zd*dd„Ze	dœdd„Z
edœ‡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd+d d!„Zd"d#„ Zd$d%„ Zd,d&d'„Zd(d)„ Z‡  ZS )-ÚDistroz/etc/locale.genz/etc/netctlZ	systemctlZnetplanz/etc/netplan/50-cloud-init.yamlz# generated by cloud-init
T)Znetplan_pathZnetplan_headerZpostcmdsc             C   s0   t jj| |||ƒ tj|ƒ| _d| _d|d< d S )NZarchZsshdZssh_svcname)r   r   Ú__init__r   ZRunnersÚ_runnerZosfamily)ÚselfÚnameZcfgÚpaths© r   ú/usr/lib/python3.6/arch.pyr       s    zDistro.__init__Nc             C   sj   |d k	r|dkrt jd|ƒ tjƒ d| dg}tj| jdj|ƒƒ tjdgdd� tjd	d
|gdd� d S )Nz/etc/locale.confzFInvalid locale_configfile %s, only supported value is /etc/locale.confz%s UTF-8Ú Ú
z
locale-genF)ÚcaptureZ	localectlz
set-locale)ÚLOGÚwarningr   Zmake_headerÚ
write_fileÚlocale_gen_fnÚjoinr   )r   ZlocaleZout_fnÚlinesr   r   r   Úapply_locale)   s    zDistro.apply_locale)Úpkglistc             C   s   | j ƒ  | jd|d� d S )Nr   )Úpkgs)Úupdate_package_sourcesÚpackage_command)r   r   r   r   r   Úinstall_packages<   s    zDistro.install_packages)Úreturnc                s8   y
t ƒ jƒ S  tk
r2 } zt|‚W Y d d }~X nX d S )N)ÚsuperÚ_get_rendererr
   ÚNotImplementedError)r   Úe)Ú	__class__r   r   r%   @   s    
zDistro._get_rendererc             C   s.   t j|ƒ}tjd||ƒ t|| j| j| jd�S )Nz3Translated ubuntu style network settings %s into %s)Úresolv_confÚconf_dirÚenable_func)r   Ztranslate_networkr   ÚdebugÚ_render_networkZresolve_conf_fnÚnetwork_conf_dirÚ_enable_interface)r   ÚsettingsÚentriesr   r   r   Ú_write_networkG   s    
zDistro._write_networkc             C   s\   dd|g}y(t j |ƒ\}}t|ƒr0tjd||ƒ W n$ t jk
rV   tjtd|ƒ Y nX d S )NÚnetctlZreenablez(Running %s resulted in stderr output: %sz#Running interface command %s failed)r   Úlenr   r   ÚProcessExecutionErrorr   Úlogexc)r   Údevice_nameÚcmdÚ_outÚerrr   r   r   r/   U   s    
zDistro._enable_interfacec             C   sj   dd|g}t jd||ƒ y(tj|ƒ\}}t|ƒr>t jd||ƒ dS  tjk
rd   tjt d|ƒ dS X d S )Nr3   Z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   r4   r   r5   r   r6   )r   r7   r8   r9   r:   r   r   r   Ú_bring_up_interface`   s    

zDistro._bring_up_interfacec             C   sr   d }y| j |ƒ}W n. tk
r@   tj| jddƒ}|r8nd S Y nX |sNtdƒ}|j|ƒ tj|t|ƒddd� d S )NÚcreate_hostname_fileTr   Úwi¤  )ZomodeÚmode)	Ú_read_hostname_confÚIOErrorr   Zget_cfg_option_boolZ_cfgr   Zset_hostnamer   Ústr)r   ÚhostnameÚfilenameÚconfr<   r   r   r   Ú_write_hostnamer   s    

zDistro._write_hostnamec             C   s   | j | jƒ}| j|fS )N)Ú_read_hostnameZ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)r   rC   rD   r   r   r   r?   ‰   s    zDistro._read_hostname_confc             C   s:   d }y| j |ƒ}|j}W n tk
r,   Y nX |s6|S |S )N)r?   rB   r@   )r   rC   ÚdefaultrB   rD   r   r   r   rF   Ž   s    

zDistro._read_hostnamec             C   sL   t jd|ƒ ytjddd|gƒ W n$ tjk
rF   tjt d|ƒ Y nX d S )Nz2Non-persistently setting the system hostname to %sZhostnamectlz--transientzset-hostnamez;Failed to non-persistently adjust the system hostname to %s)r   r,   r   r5   r   r6   )r   rB   r   r   r   Ú_apply_hostname›   s    zDistro._apply_hostnamec             C   s   t j|| j|ƒd� d S )N)ÚtzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rK   r   r   r   Úset_timezone¨   s    zDistro.set_timezonec             C   sŒ   |d krg }ddddg}|r2t |tƒr2|j|ƒ n|rJt |tƒrJ|j|ƒ |dkrVd}|rd|j|ƒ tjd|ƒ}|j|ƒ tj|dd	� d S )
NZpacmanz-Syz--quietz--noconfirmZupgradez-uz%s-%sF)r   )Ú
isinstancerA   ÚappendÚlistÚextendr   Zexpand_package_listr   )r   ZcommandÚargsr   r8   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-y)Zfreq)r   Zrunr!   r   )r   r   r   r   r    Â   s    zDistro.update_package_sources)N)N)NN)Ú__name__Ú
__module__Ú__qualname__r   r.   Zinit_cmdZrenderer_configsr   r   r   r"   r	   r%   r2   r/   r;   rE   rG   r?   rF   rJ   rL   r!   r    Ú__classcell__r   r   )r(   r   r      s,   
	


r   ú/ú
etc/netctlúetc/resolv.confc          	   C   sæ   g }g }t j||ƒ}t j||ƒ}x¬| jƒ D ] \}}|dkr<q*|j|ƒ tjj||ƒ}	d||jdƒd|jdƒ|jdƒf |jdƒ|jdg ƒd	œ}
tj	|	t
|
ƒƒ |r´|jd
ƒr´||ƒ d|kr*|j|d ƒ q*W |râtj	|t|ƒƒ |S )znRender the translate_network format into netctl files in target.
    Paths will be rendered under target.
    ÚloZethernetZ	bootprotoz%s/%sZaddressZnetmaskZgatewayzdns-nameservers)Z
ConnectionZ	InterfaceZIPZAddressZGatewayZDNSÚauto)r   Ztarget_pathÚitemsrN   ÚosÚpathr   Úgetr   r   Úconvert_netctlrP   Úconvert_resolv_conf)r1   Útargetr*   r)   r+   ZdevsZnameserversZdevÚinfoZnet_fnZnet_cfgr   r   r   r-   È   s.    
r-   c             C   sr   g }xbt | ƒD ]V}| | }|dkr(d}n*t|ttfƒrRddjdd„ |D ƒƒ d }|jd||f ƒ qW dj|ƒS )	zìGiven a dictionary, returns a string in netctl profile format.

    netctl profile is described at:
    https://git.archlinux.org/netctl.git/tree/docs/netctl.profile.5.txt

    Note that the 'Special Quoting Rules' are not handled here.Nr   ú(ú c             s   s   | ]}d | V  qdS )z'%s'Nr   )Ú.0Úvr   r   r   ú	<genexpr>þ   s    z!convert_netctl.<locals>.<genexpr>ú)z%s=%s
)ÚsortedrM   ÚtuplerO   r   rN   )r0   ÚresultÚkeyÚvalr   r   r   r_   ñ   s    r_   c             C   s,   d}t | tƒr(x| D ]}|d|  }qW |S )z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)rM   rO   )r0   rk   Únsr   r   r   r`     s
    

r`   )rV   rW   rX   N)Zloggingr\   Z	cloudinitr   r   r   r   Zcloudinit.distrosr   r   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.net.rendererr	   Zcloudinit.net.renderersr
   Zcloudinit.settingsr   Z	getLoggerrR   r   r   r-   r_   r`   r   r   r   r   Ú<module>   s    
 7   
$