
"T`i'                 @   s  d  d l  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 e j e  Z d# Z d d d d i Z d Z d Z d Z Gd d   d e j  Z d d   Z d d d  Z e d d d  Z d d d   Z d d! d"  Z d S)$    N)distros)helpers)log)subp)util)HostnameConf)PER_INSTANCEapt-get(--option=Dpkg::Options::=--force-confold*--option=Dpkg::options::=--force-unsafe-io--assume-yes--quietcommandZ	eatmydataenabledautoa8  # This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
z'/etc/network/interfaces.d/50-cloud-initz/etc/default/localec            	   @   s#  e  Z d  Z d Z d d d d i Z d d e d d e i d d e d d	 e d
 d i i Z d d   Z d d   Z d d 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* d+   Z d S),Distroz/etc/hostnameZeniz'/etc/network/interfaces.d/50-cloud-initZnetplanz/etc/netplan/50-cloud-init.yamlZeni_pathZ
eni_headerZnetplan_pathZnetplan_headerZpostcmdsTc             C   sJ   t  j j |  | | |  t j |  |  _ d |  _ d |  _ d  |  _ d  S)NZdebianzen_US.UTF-8)	r   r   __init__r   ZRunners_runnerZosfamilydefault_localesystem_locale)selfnameZcfgpaths r   :/usr/lib/python3/dist-packages/cloudinit/distros/debian.pyr   ;   s
    		zDistro.__init__c             C   s,   |  j  s t   |  _  |  j  r% |  j  S|  j S)z9Return the default locale if set, else use default locale)r   read_system_localer   )r   r   r   r   
get_localeE   s    	zDistro.get_localeNLANGc       	      C   s   | s t  } | s t d   |  j   } t j j |  } |  j rK d n d } | j   | j   k ps | ps | } | p | p | } | r t | | d | n t	 j
 d | |  j |  | r t | | d | d |  _ d S)ziApply specified locale to system, regenerate if specified locale
            differs from system default.zFailed to provide locale value.FTkeynamez9System has '%s=%s' requested '%s', skipping regeneration.N)LOCALE_CONF_FN
ValueErrorr   ospathexistsr   lowerregenerate_localeLOGdebugupdate_locale_conf)	r   localeout_fnr   Zdistro_localeZconf_fn_existsZsys_locale_unsetZ
need_regenZ	need_confr   r   r   apply_localeP   s$    zDistro.apply_localec             C   s!   |  j    |  j d d | d  S)Ninstallpkgs)update_package_sourcespackage_command)r   pkglistr   r   r   install_packagesn   s    
zDistro.install_packagesc             C   s   t    |  j |  S)N)_maybe_remove_legacy_eth0Z_supported_write_network_config)r   Z	netconfigr   r   r   _write_network_configr   s    zDistro._write_network_configc             C   sY   d } x  | D] } | d k r d } q W| rB t  j j |  d  St  j j |  |  Sd  S)NFallTz--all)r   r   Z_bring_up_interface_bring_up_interfaces)r   Zdevice_namesZuse_alldr   r   r   r5   v   s    
zDistro._bring_up_interfacesc             C   sj   d  } y |  j  |  } Wn t k
 r- Yn X| s@ t d  } | j |  t j | t |  d  d  S)N i  )_read_hostname_confIOErrorr   Zset_hostnamer   Z
write_filestr)r   Zyour_hostnamer*   confr   r   r   _write_hostname   s    zDistro._write_hostnamec             C   s   |  j  |  j  } |  j | f S)N)_read_hostname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   	load_fileparse)r   filenamer;   r   r   r   r8      s    
zDistro._read_hostname_confc             C   sE   d  } y |  j  |  } | j } Wn t k
 r6 Yn X| sA | S| S)N)r8   hostnamer9   )r   rB   defaultrC   r;   r   r   r   r=      s    zDistro._read_hostnamec             C   s   d S)Nz	127.0.1.1r   )r   r   r   r   _get_localhost_ip   s    zDistro._get_localhost_ipc             C   s#   t  j d | d |  j |   d  S)NtzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rF   r   r   r   set_timezone   s    zDistro.set_timezonec       	      C   sv  | d  k r g  } t  j j   } d | d <|  j d t  } t | j d t d  | j d t d   } | j t |  j d t	    | r t
 | t  r | j |  n" | r t
 | t  r | j |  | } | d k r |  j d d	  } | j |  t j d
 |  } | j |  t j d t j d d | d j |  f d t j d | f d d | d d i  d  S)NZnoninteractiveZDEBIAN_FRONTENDZapt_get_wrapperr   r   Zapt_get_commandZupgradeZapt_get_upgrade_subcommandzdist-upgradez%s=%sZlogfuncmsgzapt-%s [%s] funcargskwargsenvcaptureF)r!   environcopyZ
get_optionAPT_GET_WRAPPER_get_wrapper_prefixgetextendlistAPT_GET_COMMAND
isinstancer:   appendr   Zexpand_package_listZlog_timer&   r'   joinr   )	r   r   rK   r-   eZwcfgcmdZsubcmdr0   r   r   r   r/      s0    
			zDistro.package_commandc             C   s&   |  j  j d |  j d g d t d  S)Nzupdate-sourcesupdateZfreq)r   Zrunr/   r   )r   r   r   r   r.      s    zDistro.update_package_sourcesc             C   s
   t  j   S)N)r   Zget_dpkg_architecture)r   r   r   r   get_primary_arch   s    zDistro.get_primary_arch)__name__
__module____qualname__r>   Znetwork_conf_fnNETWORK_FILE_HEADERZrenderer_configsr   r   r+   r1   r3   r5   r<   r?   r8   r=   rE   rG   r/   r.   r]   r   r   r   r   r   -   s.   	

$r   c             C   sn   t  |  t  r t |   g }  t j |  sb t |  j   d k rf |  d rf t j |  d  rf |  Sg  Sd  S)Nr   r   )rW   r:   r   Zis_truer$   r   Zwhich)r[   moder   r   r   rR      s    "rR   z"/etc/network/interfaces.d/eth0.cfgc             C   s   t  j j |   s d Sd } yl t j |   } d d g } d d   | j   D } | | k ry t j |   d |  } n | d |  } Wn  t k
 r | d	 |  } Yn Xt j	 |  d S)
aa  Ubuntu cloud images previously included a 'eth0.cfg' that had
       hard coded content.  That file would interfere with the rendered
       configuration if it was present.

       if the file does not exist do nothing.
       If the file exists:
         - with known content, remove it and warn
         - with unknown content, leave it and warn
    Nz(Dynamic networking config may not apply.z	auto eth0ziface eth0 inet dhcpc             S   s+   g  |  ]! } | j  d   s | j    q S)#)
startswithstrip).0fr   r   r   
<listcomp>   s   	 z-_maybe_remove_legacy_eth0.<locals>.<listcomp>zremoved %s with known contentsz* '%s' exists with user configured content.z" %s exists, but could not be read.)
r!   r"   r#   r   r@   
splitlinesZdel_file	Exceptionr&   Zwarning)r"   ZbmsgcontentsZknown_contentslinesrH   r   r   r   r2      s    r2   r   c             C   sb   d } |  s t  d |    t j j |   r^ t j |   } t j |  } | j | d  } | S)z.Read system default locale setting, if presentr7   zInvalid path: %s)r    r!   r"   r#   r   r@   Zload_shell_contentrS   )sys_pathr   Zsys_valZlocale_contentZsys_defaultsr   r   r   r      s    r   c             C   sD   t  j d | | |   t j d d | d | |  f g d d d S)zUpdate system locale configz%Updating %s with locale setting %s=%szupdate-localez--locale-file=z%s=%srN   FN)r&   r'   r   )r)   rm   r   r   r   r   r(     s
    	
r(   c             C   sV   |  j    d
 k r) t j d | |   d St j d |   t j d |  g d d	 d S)z
    Run locale-gen for the provided locale and set the default
    system variable `keyname` appropriately in the provided `sys_path`.

    cc.utf-8posixz$%s=%s does not require rengenerationNzGenerating locales for %sz
locale-genrN   F)rn   ro   zposix)r$   r&   r'   r   )r)   rm   r   r   r   r   r%     s
    r%   )r	   r
   r   r   r   )r!   Z	cloudinitr   r   r   Zloggingr   r   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.settingsr   Z	getLoggerr^   r&   rV   rQ   ra   ZNETWORK_CONF_FNr   r   rR   r2   r   r(   r%   r   r   r   r   <module>   s,     		