
    x[h                         S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
JrJrJr  S SKJrJrJr  S SKJrJr  S SKJrJr  \R0                  " \5      rSr/ SQrSrS	\\   S
\	\   4S jr  " S S\5      r!g)    N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages)
PER_ALWAYSPER_INSTANCE)zapt-getz(--option=Dpkg::Options::=--force-confoldz*--option=Dpkg::options::=--force-unsafe-ioz--assume-yesz--quiet)z/var/lib/dpkg/lock-frontendz/var/lib/dpkg/lockz/var/cache/apt/archives/lockz/var/lib/apt/lists/lock   cfgreturnc                    U (       d  SnS/nO[U R                  S5      nU R                  S5      n[        U[        5      (       a  U/nO [        U[        5      (       d  [	        S5      e[
        R                  " U5      (       dB  [        U5      R                  5       S:X  a<  U(       a5  [        R                  " US   5      (       a  [        [        [           U5      $ / $ )a  Parse the 'apt_get_wrapper' section of cloud-config.

apt_get_wrapper may be defined in cloud-config:
  apt_get_wrapper:
    enabled: true
    command: ["eatmydata"]

The function takes the value of "apt_get_wrapper" and returns the list
of arguments to prefix to the apt-get command.
auto	eatmydataenabledcommandz,apt_wrapper command must be a string or listr   )get
isinstancestrlist	TypeErrorr   is_truelowerr   whichr	   r   )r   r   r   s      J/usr/lib/python3/dist-packages/cloudinit/distros/package_management/apt.pyget_apt_wrapperr"   )   s     -'')$'')$gs##iGGT**JKK||GG&7tzz'!*7M7MDIw''	    c            
       6  ^  \ rS rSrSrSSSS.S\R                  S\\   S\	\\      S	\	\   4U 4S
 jjjr
\S\R                  S\SS 4S j5       rS\4S jrSS.S jr\R$                  " SS9S 5       rS\\   4S jrS\S\4S jrSS jrS r\4S jrSrU =r$ )AptJ   apt Napt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommandrunnerr*   r+   r,   c                   > [         TU ]  U5        Uc  [        U l        Uc  Sn[	        U5      [	        U R                  5      -   U l        X@l        SS0U l        g )Nzdist-upgradeDEBIAN_FRONTENDnoninteractive)super__init__APT_GET_COMMANDr+   tupleapt_commandr,   environment)selfr-   r*   r+   r,   	__class__s        r!   r2   Apt.__init__M   sf     	 "#2D %-)7& !89E  =
 
 +E'-/?@r#   r   r   c                     [        U[        UR                  S5      5      UR                  S5      UR                  S5      S9$ )Napt_get_wrapperr+   r,   r)   )r%   r"   r   )clsr-   r   s      r!   from_configApt.from_configa   sC    $3)*%  GG$56'*ww/K'L
 	
r#   c                 Z    [        [        R                  " U R                  S   5      5      $ )Nr   )boolr   r    r+   )r7   s    r!   	availableApt.availablel   s!    DJJt33A6788r#   F)forcec                t    U R                   R                  SU R                  S/U(       a  [        O[        S9  g )Nzupdate-sourcesupdate)freq)r-   runrun_package_commandr   r   )r7   rC   s     r!   update_package_sourcesApt.update_package_sourceso   s/    $$J$,	 	 	
r#      )maxsizec                 x    [         R                   " SS/5      R                  n[        UR                  5       5      $ )Nz	apt-cachepkgnames)r   stdoutset
splitlines)r7   resps     r!   get_all_packagesApt.get_all_packagesw   s/    II{J78?? 4??$%%r#   pkglistc                     U Vs/ s HB  n[         R                  " SU5      S   R                  S5      U R                  5       ;  d  M@  UPMD     sn$ s  snf )Nz/|=r   z-^)resplitrstriprS   )r7   rU   pkgs      r!   get_unavailable_packagesApt.get_unavailable_packages   sX     
xxs#A&--d3((*+ 
 	
 
s   ?AAc                 z   U R                  5         [        R                  " S[        U5      5      nU R	                  U Vs/ s H  o"R                  S5      S   PM     sn5      nU(       a  [        R                  SU5        U Vs/ s H  oDU;  d  M
  UPM     nnU(       a  U R                  SUS9  U$ s  snf s  snf )N%s=%s=r   zXThe following packages were not found by APT so APT will not attempt to install them: %sinstall)pkgs)	rI   r   expand_package_listr   r[   rX   LOGdebugrH   )r7   rU   xunavailablep
to_installs         r!   install_packagesApt.install_packages   s    ##%**7DMB33&-.gWWS\!_g.
 II2
 ")AA[,@a
A$$YZ$@ / Bs    B3	B8B8c                    Uc  / n[        U R                  5      nU(       a'  [        U[        5      (       a  UR	                  U5        O-U(       a&  [        U[         5      (       a  UR                  U5        US:X  a  U R                  nUR	                  U5        [        R                  " SU5      nUR                  U5        U R                  UU R                  SS.S9  g )Nupgrader^   F)args
update_envcapture)subp_kwargs)r   r5   r   r   appendextendr,   r   rb   _wait_for_apt_commandr6   )r7   r   rm   ra   full_commandrU   s         r!   rH   Apt.run_package_command   s    <DD,,-JtS))%jt,,%i55GG$**7D9G$""$"..  	# 	
r#   c                 Z   [          Hv  n[        R                  R                  U5      (       d  M)  [	        US5       n [
        R                  " U[
        R                  [
        R                  -  5         SSS5        Mx     g! [         a     SSS5          gf = f! , (       d  f       M  = f)zdDetermines if another process holds any apt locks.

If all locks are clear, return True else False.
wNFT)
APT_LOCK_FILESospathexistsopenfcntllockfLOCK_EXLOCK_NBOSError)r7   lockhandles      r!   _apt_lock_availableApt._apt_lock_available   s~    
 #D77>>$''dCF!KK(EF !	 #   ! 	 !! !s(   B6B
BBBB
B*	c                 J   [         R                  " 5       n[        R                  S5        [         R                  " 5       U-
  U:  aY  U R	                  5       (       d  [         R
                  " S5        MI  [        R                  S5         [        R                  " S0 UD6$ [        S5      e! [        R                   aD    U R	                  5       (       a  e [        R                  S5        [         R
                  " S5         Of = f[         R                  " 5       U-
  U:  a  M  N)zGWait for apt install to complete.

subp_kwargs: kwargs to pass to subp
zWaiting for APT lockrK   zAPT lock availablez*Another process holds APT lock. Waiting...zCould not get APT lockr(   )	time	monotonicrc   rd   r   sleepr   ProcessExecutionErrorTimeoutError)r7   rp   timeout
start_times       r!   rs   Apt._wait_for_apt_command   s     ^^%
		()nn+g5++--

1II*+yy/;//  344 --  ++--		FG

1 nn+g5s   
B+ +ADD)r5   r+   r,   r6   )NN)__name__
__module____qualname____firstlineno__namer
   Runnersr   r   r   r2   classmethodr   r=   r@   rA   rI   	functools	lru_cacherS   r   r[   r   ri   rH   r   APT_LOCK_WAIT_TIMEOUTrs   __static_attributes____classcell__)r8   s   @r!   r%   r%   J   s    D 243748AA "*#	A
 "(3-0A %-SMA A( 
 
w 
5 
 
94 9 /4 
 #& $&
 
 5H "
0" $95 5r#   r%   )"r}   r   loggingry   rW   r   typingr   r   r   r   r   r   r	   	cloudinitr
   r   r   4cloudinit.distros.package_management.package_managerr   r   cloudinit.settingsr   r   	getLoggerr   rc   r3   rx   r   dictr   r"   r%   r(   r#   r!   <module>r      s       	 	  I I I ) ) 8!  $ DI B]5. ]5r#   