o
    w7eY!                     @   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	de
f 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/netctl	systemctlnetplanz/etc/netplan/50-cloud-init.yamlz# generated by cloud-init
T)netplan_pathnetplan_headerpostcmdsc                 C   s0   t j| ||| t|| _d| _d|d< d S )Narchsshdssh_svcname)r   r   __init__r   Runners_runnerosfamily)selfnamecfgpaths r   8/usr/lib/python3/dist-packages/cloudinit/distros/arch.pyr   !   s   zDistro.__init__Nc                 C   sj   |d u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capture	localectlz
set-locale)LOGwarningr   make_header
write_filelocale_gen_fnjoinr   )r   locale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y } zt|d }~ww N)super_get_rendererr
   NotImplementedError)r   e	__class__r   r   r6   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   translate_networkr$   debug_render_network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|rtd|| W d S W d S  t jy/   ttd| Y d S w )Nnetctlreenable(Running %s resulted in stderr output: %s#Running interface command %s failed)r   lenr$   r%   ProcessExecutionErrorr   logexcr   device_namecmd_outerrr   r   r   rC   V   s   

zDistro._enable_interfacec                 C   sh   dd|g}t d|| zt|\}}t|rt d|| W dS  tjy3   tt d| Y dS w )NrG   restartz8Attempting to run bring up interface %s using command %srI   TrJ   F)r$   r?   r   rK   r%   rL   r   rM   rN   r   r   r   _bring_up_interfacea   s"   
zDistro._bring_up_interfacec                 C   sV   d }z|  |}W n	 ty   Y nw |std}|| tj|t|ddd d S )Nr   wi  )omodemode)_read_hostname_confIOErrorr   set_hostnamer   r'   str)r   hostnamefilenameconfr   r   r   _write_hostnames   s   
zDistro._write_hostnamec                 C   s   |  | j}| j|fS r4   )_read_hostnamehostname_conf_fn)r   sys_hostnamer   r   r   _read_system_hostname   s   
zDistro._read_system_hostnamec                 C   s   t t|}|  |S r4   )r   r   	load_fileparse)r   r]   r^   r   r   r   rX      s   zDistro._read_hostname_confc                 C   s8   d }z
|  |}|j}W n	 ty   Y nw |s|S |S r4   )rX   r\   rY   )r   r]   defaultr\   r^   r   r   r   r`      s   

zDistro._read_hostnamec                 C   sJ   t d| ztddd|g W d S  tjy$   tt d| Y d S w )Nz2Non-persistently setting the system hostname to %shostnamectlz--transientzset-hostnamez;Failed to non-persistently adjust the system hostname to %s)r$   r?   r   rL   r   rM   )r   r\   r   r   r   _apply_hostname   s   
zDistro._apply_hostnamec                 C   s   t j|| |d d S )N)tztz_file)r   set_etc_timezone_find_tz_file)r   ri   r   r   r   set_timezone   s   zDistro.set_timezonec                 C   s   |d u rg }g d}|rt |tr|| n|r#t |tr#|| |dkr)d}|r0|| td|}|| tj|dd d S )N)pacmanz-Syz--quietz--noconfirmupgradez-uz%s-%sFr!   )
isinstancer[   appendlistextendr   expand_package_listr   )r   commandargsr.   rP   r1   r   r   r   r0      s   


zDistro.package_commandc                 C   s   | j jd| jdgtd d S )Nzupdate-sourcesz-y)freq)r   runr0   r   )r   r   r   r   r/      s   
zDistro.update_package_sourcesr4   )NN)__name__
__module____qualname__r(   rB   init_cmdrenderer_configsr   r-   r2   r	   r6   rF   rC   rT   r_   rc   rX   r`   rh   rm   r0   r/   __classcell__r   r   r9   r   r      s2    
	

r   /
etc/netctletc/resolv.confc              
   C   s   g }g }t ||}t ||}|  D ]P\}}|dkrq|| tj||}	d||dd|d|df |d|dg d	}
t	|	t
|
 |rY|d
rY|| d|v rd||d  q|rot	|t| |S )znRender the translate_network format into netctl files in target.
    Paths will be rendered under target.
    loethernet	bootprotoz%s/%saddressnetmaskgatewayzdns-nameservers)
Connection	InterfaceIPAddressGatewayDNSauto)r   target_pathitemsrq   ospathr)   getr   r'   convert_netctlrs   convert_resolv_conf)rE   targetr<   r;   r=   devsnameserversdevinfonet_fnnet_cfgr   r   r   r@      s2   

r@   c                 C   sn   g }t | D ]+}| | }|du rd}nt|ttfr(d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
)sortedrp   tuplerr   r)   rq   )rD   resultkeyvalr   r   r   r      s   
r   c                 C   s(   d}t | tr| D ]}|d|  }q	|S )z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)rp   rr   )rD   r   nsr   r   r   r      s
   
r   )r   r   r   N)r   	cloudinitr   r   r   loggingr   r   cloudinit.distrosr   "cloudinit.distros.parsers.hostnamer   cloudinit.net.rendererr	   cloudinit.net.renderersr
   cloudinit.settingsr   	getLoggerry   r$   r   r@   r   r   r   r   r   r   <module>   s&   
 1
)