
    ܍~cp5                         d dl Z d dlZ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  ej        e          ZdZdZd	d
dZdZdZdZg dZ G d dej                  Zd ZddZedfdZddZddZdS )    N)distroshelpers)log)subputil)HostnameConf)PER_INSTANCE   )zapt-getz(--option=Dpkg::Options::=--force-confoldz*--option=Dpkg::options::=--force-unsafe-ioz--assume-yesz--quiet	eatmydataauto)commandenableda8  # 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}
'/etc/network/interfaces.d/50-cloud-initz/etc/default/locale)z/var/lib/dpkg/lock-frontendz/var/lib/dpkg/lockz/var/cache/apt/archives/lockz/var/lib/apt/lists/lockc                        e Zd ZdZdddZed         eded         edd	dZd
 Zd ZddZ	d Z
 fdZd Zd Zd ZddZd Zd ZddZefdZddZd Zd Zd Z xZS ) Distroz/etc/hostnamer   z/etc/netplan/50-cloud-init.yaml)eninetplanr   )eni_path
eni_headerr   T)netplan_pathnetplan_headerpostcmdsc                     t           j                            | |||           t          j        |          | _        d| _        d| _        d | _        d S )Ndebianzen_US.UTF-8)	r   r   __init__r   Runners_runnerosfamilydefault_localesystem_locale)selfnamecfgpathss       :/usr/lib/python3/dist-packages/cloudinit/distros/debian.pyr   zDistro.__init__N   sN    dC777 u-- +!    c                 `    | j         st                      | _         | j         r| j         n| j        S )z9Return the default locale if set, else use default locale)r    read_system_localer   r!   s    r%   
get_localezDistro.get_localeX   s:     ! 	6!3!5!5D #'"4MD$:M	
r&   NLANGc                    |st           }|st          d          |                                 }t          j                            |          }| j        rdnd}|                                |                                k    p| p|}| p|p|}|rt          |||           n"t          
                    d|| j        |           |rt          |||           d| _        dS dS )zeApply 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-   distro_localeconf_fn_existssys_locale_unset
need_regen	need_confs	            r%   apply_localezDistro.apply_localed   s$     	$#F 	@>??? ))//$($6@55DLLNNm11333  !!  	
 '&H*H8H	 	ffg>>>>>IIK"	    	&vvw????!%D	& 	&r&   c                 \    |                                   |                     d|           d S )Ninstall)pkgs)update_package_sourcespackage_command)r!   pkglists     r%   install_packageszDistro.install_packages   s3    ##%%%YW55555r&   c                 R    t                        t                      j        |i |S N)_maybe_remove_legacy_eth0super_write_network_state)r!   argskwargs	__class__s      r%   rK   zDistro._write_network_state   s+    !###+uww+T<V<<<r&   c                     d }	 |                      |          }n# t          $ r Y nw xY w|st          d          }|                    |           t	          j        |t          |          d           d S )N i  )_read_hostname_confIOErrorr   set_hostnamer   
write_filestr)r!   hostnamefilenameconfs       r%   _write_hostnamezDistro._write_hostname   s    	 ++H55DD 	 	 	D	 	$##D(####d))U33333s    
''c                 H    |                      | j                  }| j        |fS rH   )_read_hostnamehostname_conf_fn)r!   sys_hostnames     r%   _read_system_hostnamezDistro._read_system_hostname   s&    **4+@AA%|44r&   c                 p    t          t          j        |                    }|                                 |S rH   )r   r   	load_fileparse)r!   rW   rX   s      r%   rQ   zDistro._read_hostname_conf   s+    DN84455

r&   c                 n    d }	 |                      |          }|j        }n# t          $ r Y nw xY w|s|S |S rH   )rQ   rV   rR   )r!   rW   defaultrV   rX   s        r%   r[   zDistro._read_hostname   sZ    	++H55D}HH 	 	 	D	 	Ns   ! 
..c                     dS )Nz	127.0.1.1 r)   s    r%   _get_localhost_ipzDistro._get_localhost_ip   s    {r&   c                 X    t          j        ||                     |                     d S )N)tztz_file)r   set_etc_timezone_find_tz_file)r!   rh   s     r%   set_timezonezDistro.set_timezone   s,     B0B0B20F0FGGGGGGr&   c                 J   |t           }|D ]}t          j                            |          s"t	          |d          5 }	 t          j        |t
          j        t
          j        z             n# t          $ r Y ddd            dS w xY w	 ddd           n# 1 swxY w Y   dS )ztDetermines if another process holds any apt locks.

        If all locks are clear, return True else False.
        NwFT)
APT_LOCK_FILESr0   r1   r2   openfcntllockfLOCK_EXLOCK_NBOSError)r!   
lock_fileslockhandles       r%   _apt_lock_availablezDistro._apt_lock_available   s   
 'J 	! 	!D7>>$'' dC !F!K(EFFFF ! ! ! 	! ! ! ! ! ! ! ! !! G! ! ! ! ! ! ! ! ! ! ! ! ! ! !
 ts5   B ,A-,B-
B7BBBB	B	c                    t          j                     }t                              d           t          j                     |z
  |k     r|                                 st          j        d           Dt                              d           d|dd                    |d                   d}t          j        t          j        |t          j        |	          S # t          j	        $ rF |                                 r t                              d
           t          j        d           Y nw xY wt          j                     |z
  |k     t          d          )zWait for apt install to complete.

        short_cmd: Name of command like "upgrade" or "install"
        subp_kwargs: kwargs to pass to subp
        zWaiting for apt lock   zapt lock availablezapt-z [ rL   ])logfuncmsgfuncrM   z*Another process holds apt lock. Waiting...zCould not get apt lock)timer5   r6   ry   sleepjoinr   log_timer   ProcessExecutionErrorTimeoutError)r!   	short_cmdsubp_kwargstimeout
start_timelog_msgs         r%   _wait_for_apt_commandzDistro._wait_for_apt_command   sP    Y[[
		()))ikkJ&00++-- 
1II*+++ IIHH[01111 }I&	    -    ++-- 		FGGG
1# ikkJ&00@ 3444s   AC AD/.D/c                 >   |g }t           j                                        }d|d<   |                     dt                    }t          |                    dt          d                   |                    dt          d                             }|                    t          |                     dt                                         |r+t          |t                    r|                    |           n,|r*t          |t                    r|                    |           |}|dk    r|                     d	d
          }|                    |           t          j        d|          }|                    |           |                     |||dd           dS )aY  Run the given package command.

        On Debian, this will run apt-get (unless APT_GET_COMMAND is set).

        command: The command to run, like "upgrade" or "install"
        args: Arguments passed to apt itself in addition to
              any specified in APT_GET_COMMAND
        pkgs: Apt packages that the command will apply to
        NnoninteractiveDEBIAN_FRONTENDapt_get_wrapperr   r   apt_get_commandupgradeapt_get_upgrade_subcommandzdist-upgradez%s=%sF)rL   envcapture)r   r   )r0   environcopy
get_optionAPT_GET_WRAPPER_get_wrapper_prefixgetextendlistAPT_GET_COMMAND
isinstancerU   appendr   expand_package_listr   )	r!   r   rL   rB   ewcfgcmdsubcmdrE   s	            r%   rD   zDistro.package_command   s    <DJOO/
0/BB!HHY	 :;;HHY	 :;;
 

 	

4(9?KKLLMMM 	JtS)) 	JJt 	jt,, 	JJti__,n F 	

6*7D99

7""!$Q5AA 	# 	
 	
 	
 	
 	
r&   c                 X    | j                             d| j        dgt                     d S )Nzupdate-sourcesupdate)freq)r   runrD   r	   r)   s    r%   rC   zDistro.update_package_sources$  s<     J	 	 	
 	
 	
 	
 	
r&   c                 (    t          j                    S rH   )r   get_dpkg_architecturer)   s    r%   get_primary_archzDistro.get_primary_arch,  s    )+++r&   c                 x    t           j                            | ||||           |                     dd           d S )Nrestartzconsole-setup)r   r   
set_keymapmanage_service)r!   layoutmodelvariantoptionss        r%   r   zDistro.set_keymap/  s>    !!$wHHH 	I77777r&   )Nr+   rH   )NN)__name__
__module____qualname__r\   network_conf_fnNETWORK_FILE_HEADERrenderer_configsr   r*   r?   rF   rK   rY   r^   rQ   r[   rf   rl   ry   APT_LOCK_WAIT_TIMEOUTr   rD   rC   r   r   __classcell__)rN   s   @r%   r   r   <   s       &84 O (.-
 

 ,I61
 

 
" " "

 

 

"& "& "& "&H6 6 6= = = = =4 4 45 5 5  
	 	 	 	  H H H   & /D*5 *5 *5 *5X,
 ,
 ,
 ,
\
 
 
, , ,8 8 8 8 8 8 8r&   r   c                 
   t          | t                    rt          |           g} t          j        |          sGt          |                                          dk    r$| d         rt          j        | d                   r| S g S )Nr   r   )r   rU   r   is_truer3   r   which)r   modes     r%   r   r   7  st    #s 3xxj|D D		V##A#4:c!f3E3E#
	r&   "/etc/network/interfaces.d/eth0.cfgc                 p   t           j                            |           sdS d}	 t          j        |           }ddg}d |                                D             }||k    rt          j        |            d| z  }n|d| z  z   }n# t          $ r |d| z  z   }Y nw xY wt          	                    |           dS )	aO  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                 `    g | ]+}|                     d           |                                ,S )#)
startswithstrip).0fs     r%   
<listcomp>z-_maybe_remove_legacy_eth0.<locals>.<listcomp>U  sA     
 
 
ALL<M<M
GGII
 
 
r&   zremoved %s with known contentsz* '%s' exists with user configured content.z" %s exists, but could not be read.)
r0   r1   r2   r   r`   
splitlinesdel_file	Exceptionr5   warning)r1   bmsgcontentsknown_contentslinesr   s         r%   rI   rI   C  s     7>>$ 5DA>$''%'=>
 
'2244
 
 
 N""M$2T9CCELLC A A A9D@@A KKs   AB BBr+   c                     d}| st          d| z            t          j                            |           r>t	          j        |           }t	          j        |          }|                    |d          }|S )z.Read system default locale setting, if presentrP   zInvalid path: %s)r/   r0   r1   r2   r   r`   load_shell_contentr   )sys_pathr-   sys_vallocale_contentsys_defaultss        r%   r(   r(   c  sr    G 8+h6777	w~~h 011.~>>""7B//Nr&   c                     t                               d|||            t          j        dd|z   |d| gd           dS )zUpdate system locale configz%Updating %s with locale setting %s=%szupdate-localez--locale-file==Fr   N)r5   r6   r   r8   r   r-   s      r%   r7   r7   q  si    II/7F   	Ix'ww'	

      r&   c                     |                                  dv rt                              d||            dS t                              d|            t          j        d| gd           dS )z
    Run locale-gen for the provided locale and set the default
    system variable `keyname` appropriately in the provided `sys_path`.

    )czc.utf-8posixz$%s=%s does not require rengenerationNzGenerating locales for %sz
locale-genFr   )r3   r5   r6   r   r   s      r%   r4   r4     sk     ||~~222		8'6JJJ II)6222I|V$e444444r&   )r   )r+   )rq   r0   r   	cloudinitr   r   r   loggingr   r   "cloudinit.distros.parsers.hostnamer   cloudinit.settingsr	   	getLoggerr   r5   r   r   r   r   NETWORK_CONF_FNr.   ro   r   r   rI   r(   r7   r4   re   r&   r%   <module>r      s    				  & & & & & & & & $ $ $ $ $ $                 ; ; ; ; ; ; + + + + + +g!!   
  <&  x8 x8 x8 x8 x8W^ x8 x8 x8v	 	 	   @ !/       5 5 5 5 5 5r&   