
­­­­­­­­­­­­­­­­­­
<!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 |rt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 )	zGiven 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   
$