
"T`!                 @   s   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 d  d l m Z d  d l	 m
 Z
 d  d l m Z d  d	 l m Z d  d
 l Z e j e  Z Gd d   d e j  Z d d d d
 d d  Z d d   Z d d   Z d
 S)    )distros)helpers)log)util)subp)net_util)HostnameConf)RendererNotFoundError)PER_INSTANCENc               @   s  e  Z d  Z d Z d Z d Z d g Z d d d d d	 d
 d i i Z d d   Z d d d  Z	 d d   Z
 d d   Z 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) d*  Z d+ d,   Z d S)-Distroz/etc/locale.genz/etc/netctlz/etc/resolv.confZ	systemctlZnetplanZnetplan_pathz/etc/netplan/50-cloud-init.yamlZnetplan_headerz# generated by cloud-init
ZpostcmdsTc             C   sB   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   8/usr/lib/python3/dist-packages/cloudinit/distros/arch.pyr   $   s    	zDistro.__init__Nc             C   s   | 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-gencaptureFZ	localectlz
set-locale)LOGwarningr   Zmake_header
write_filelocale_gen_fnjoinr   )r   Zlocaleout_fnlinesr   r   r   apply_locale-   s    			zDistro.apply_localec             C   s!   |  j    |  j d d | d  S)Nr   pkgs)update_package_sourcespackage_command)r   pkglistr   r   r   install_packages=   s    
zDistro.install_packagesc             C   sF   y |  j  |  SWn. t k
 rA } z t |  WYd  d  } ~ Xn Xd  S)N)Z_supported_write_network_configr	   NotImplementedError)r   Z	netconfiger   r   r   _write_network_configA   s    zDistro._write_network_configc             C   sG   t  j |  } t j d | |  t | d |  j d |  j d |  j S)Nz3Translated ubuntu style network settings %s into %sresolv_confconf_direnable_func)r   Z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   sv   d d | g } y8 t  j  |  \ } } t |  rF t j d | |  Wn( t  j k
 rq t j t d |  Yn Xd  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-   Q   s    	zDistro._enable_interfacec             C   s   d d | g } t  j d | |  y< t j |  \ } } t |  rY t  j d | |  d SWn, t j k
 r t j t  d |  d SYn Xd  S)Nr1   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   r2   r   r3   r   r4   )r   r5   r6   r7   r8   r   r   r   _bring_up_interface[   s    	
	
zDistro._bring_up_interfacec             C   s(   x! | D] } |  j  |  s d Sq Wd S)NFT)r9   )r   Zdevice_namesdr   r   r   _bring_up_interfacesi   s    zDistro._bring_up_interfacesc             C   ss   d  } y |  j  |  } Wn t k
 r- Yn X| s@ t d  } | j |  t j | t |  d d d d d  S)Nr   Zomodewmodei  )_read_hostname_confIOErrorr   Zset_hostnamer   r   str)r   Zyour_hostnamer   confr   r   r   _write_hostnameo   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   filenamerA   r   r   r   r>      s    
zDistro._read_hostname_confc             C   sE   d  } y |  j  |  } | j } Wn t k
 r6 Yn X| sA | S| S)N)r>   hostnamer?   )r   rF   defaultrG   rA   r   r   r   rC      s    zDistro._read_hostnamec             C   s\   t  j d |  y t j d d d | g  Wn( t j k
 rW t j t  d |  Yn Xd  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   r3   r   r4   )r   rG   r   r   r   _apply_hostname   s    	zDistro._apply_hostnamec             C   s#   t  j d | d |  j |   d  S)NtzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rJ   r   r   r   set_timezone   s    zDistro.set_timezonec             C   s   | d  k r g  } d d d d g } | rI t  | t  rI | j |  n" | rk t  | t  rk | j |  | d k r} d } | r | j |  t j d |  } | j |  t j | d d	 d  S)
NZpacmanz-Syz--quietz--noconfirmZupgradez-uz%s-%sr   F)
isinstancer@   appendlistextendr   Zexpand_package_listr   )r   Zcommandargsr   r6   r!   r   r   r   r       s    zDistro.package_commandc             C   s&   |  j  j d |  j d g d t d  S)Nzupdate-sourcesz-yZfreq)r   Zrunr    r
   )r   r   r   r   r      s    zDistro.update_package_sources)__name__
__module____qualname__r   r,   r+   Zinit_cmdZrenderer_configsr   r   r"   r%   r0   r-   r9   r;   rB   rD   r>   rC   rI   rK   r    r   r   r   r   r   r      s.   				
	r   /z
etc/netctlzetc/resolv.confc             C   sT  g  } g  } t  j | |  } t  j | |  } x|  j   D] \ } } | d k rX q= | j |  t j j | |  }	 d d d | d | j d  d d | j d	  | j d
  f d | j d  d | j d g   i }
 t j	 |	 t
 |
   | r| j d  r| |  d | k r= | j | d  q= W| rPt j	 | t |   | S)znRender the translate_network format into netctl files in target.
    Paths will be rendered under target.
    loZ
ConnectionZethernetZ	InterfaceZIPZ	bootprotoZAddressz%s/%sZaddressZnetmaskZGatewayZgatewayZDNSzdns-nameserversZauto)r   Ztarget_pathitemsrM   ospathr   getr   r   convert_netctlrO   convert_resolv_conf)r/   targetr'   r&   r(   ZdevsZnameserversZdevinfoZnet_fnZnet_cfgr   r   r   r*      s2    
	r*   c             C   s   g  } x t  |   D]u } |  | } | d k r8 d } n9 t | t t f  rq d d j d d   | D  d } | j d | | f  q Wd 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
)sortedrL   tuplerN   r   rM   )r.   resultkeyvalr   r   r   rZ      s    
	$rZ   c             C   s8   d } t  |  t  r4 x |  D] } | d | } q W| S)z4Returns a settings string formatted for resolv.conf.r   znameserver %s
)rL   rN   )r.   rf   nsr   r   r   r[      s
    r[   )Z	cloudinitr   r   r   Zloggingr   r   Zcloudinit.distrosr   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.net.renderersr	   Zcloudinit.settingsr
   rW   Z	getLoggerrQ   r   r   r*   rZ   r[   r   r   r   r   <module>   s   %