U
    LdY!                     @   s   d dl Z 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 d dlmZ d d	lmZ eeZG d
d dejZdddZdd Zdd ZdS )    N)distroshelpers)log)subputil)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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| ||| t|| _d| _d|d< d S )NZarchZsshdZssh_svcname)r   r   __init__r   ZRunners_runnerZosfamily)selfnameZcfgpaths r   8/usr/lib/python3/dist-packages/cloudinit/distros/arch.pyr   !   s    zDistro.__init__Nc                 C   sj   |d k	r|dkrt d| t d| dg}t| jd| 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Z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_localec                 C   s   |    | jd|d d S )Nr   )pkgs)update_package_sourcespackage_command)r   pkglistr   r   r   install_packages=   s    zDistro.install_packages)returnc              
      s:   zt   W S  tk
r4 } z
t|W 5 d }~X Y nX d S N)super_get_rendererr
   NotImplementedError)r   e	__class__r   r   r&   A   s    zDistro._get_rendererc                 C   s.   t |}t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_networkH   s    
zDistro._write_networkc                 C   s\   dd|g}z(t  |\}}t|r0td|| W n$ t jk
rV   ttd| Y nX d S )NnetctlZreenable(Running %s resulted in stderr output: %s#Running interface command %s failed)r   lenr   r   ProcessExecutionErrorr   logexcr   Zdevice_namecmdZ_outerrr   r   r   r1   V   s    
  zDistro._enable_interfacec                 C   sn   dd|g}t d|| z*t|\}}t|r>t d|| W dS  tjk
rh   tt d| Y dS X d S )Nr5   Zrestartz8Attempting to run bring up interface %s using command %sr6   Tr7   F)r   r.   r   r8   r   r9   r   r:   r;   r   r   r   _bring_up_interfacea   s$    
  zDistro._bring_up_interfacec                 C   sX   d }z|  |}W n tk
r&   Y nX |s4td}|| tj|t|ddd d S )Nr   wi  )Zomodemode)_read_hostname_confIOErrorr   Zset_hostnamer   r   str)r   hostnamefilenameconfr   r   r   _write_hostnames   s    
zDistro._write_hostnamec                 C   s   |  | j}| j|fS r$   )_read_hostnameZhostname_conf_fn)r   Zsys_hostnamer   r   r   _read_system_hostname   s    zDistro._read_system_hostnamec                 C   s   t t|}|  |S r$   )r   r   Z	load_fileparse)r   rE   rF   r   r   r   rA      s    zDistro._read_hostname_confc                 C   s:   d }z|  |}|j}W n tk
r,   Y nX |s6|S |S r$   )rA   rD   rB   )r   rE   defaultrD   rF   r   r   r   rH      s    

zDistro._read_hostnamec                 C   sL   t d| ztddd|g W n$ tjk
rF   t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   r9   r   r:   )r   rD   r   r   r   _apply_hostname   s     zDistro._apply_hostnamec                 C   s   t j|| |d d S )N)tzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rM   r   r   r   set_timezone   s    zDistro.set_timezonec                 C   s   |d krg }ddddg}|r2t |tr2|| n|rJt |trJ|| |dkrVd}|rd|| td|}|| tj|dd	 d S )
NZpacmanz-Syz--quietz--noconfirmZupgradez-uz%s-%sFr   )
isinstancerC   appendlistextendr   Zexpand_package_listr   )r   Z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-y)Zfreq)r   runr    r   )r   r   r   r   r      s       zDistro.update_package_sources)N)N)NN)__name__
__module____qualname__r   r0   Zinit_cmdZrenderer_configsr   r   r"   r	   r&   r4   r1   r>   rG   rI   rA   rH   rL   rN   r    r   __classcell__r   r   r)   r   r      s0   	


r   /
etc/netctletc/resolv.confc              
   C   s   g }g }t ||}t ||}|  D ]\}}|dkr:q(|| tj||}	d||dd|d|df |d|dg d	}
t	|	t
|
 |r|d
r|| d|kr(||d  q(|rt	|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itemsrP   ospathr   getr   r   convert_netctlrR   convert_resolv_conf)r3   targetr,   r+   r-   ZdevsZnameserversZdevinfoZnet_fnZnet_cfgr   r   r   r/      s0    

r/   c                 C   sn   g }t | D ]V}| | }|dkr&d}n*t|ttfrPdddd |D  d }|d||f  qd|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
)sortedrO   tuplerQ   r   rP   )r2   resultkeyvalr   r   r   rb      s    rb   c                 C   s(   d}t | tr$| D ]}|d|  }q|S )z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)rO   rQ   )r2   rn   nsr   r   r   rc      s
    
rc   )rY   rZ   r[   N)r_   Z	cloudinitr   r   r   Zloggingr   r   Zcloudinit.distrosr   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.net.rendererr	   Zcloudinit.net.renderersr
   Zcloudinit.settingsr   Z	getLoggerrU   r   r   r/   rb   rc   r   r   r   r   <module>   s$   
 1    
)