
    x[h                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZ d dlmZmZmZ d dlmZmZ d dlmZmZ  ej0                  e      ZdZg dZdZd	ee   d
e	e   fdZ  G d de      Z!y)    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                 |   | sd}dg}nQ| j                  d      }| j                  d      }t        |t              r|g}nt        |t              st	        d      t        j                  |      s6t        |      j                         dk(  r1|r/t        j                  |d         rt        t        t           |      S g S )a9  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'!*7MDIw''	    c            
            e Zd ZdZdddddej
                  dee   deee      dee   f fd	Z	e
dej
                  d
edd fd       ZdefdZdddZ ej"                  d      d        Zdee   fdZdedefdZddZd ZefdZ xZS )Aptapt Napt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommandrunnerr)   r*   r+   c                    t         |   |       |t        | _        |d}t	        |      t	        | j                        z   | _        || _        ddi| _        y )Nzdist-upgradeDEBIAN_FRONTENDnoninteractive)super__init__APT_GET_COMMANDr*   tupleapt_commandr+   environment)selfr,   r)   r*   r+   	__class__s        r!   r1   zApt.__init__M   sh     	 "#2D %-)7& !89E  =
 
 +E'-/?@r#   r   r   c                     t        |t        |j                  d            |j                  d      |j                  d            S )Napt_get_wrapperr*   r+   r(   )r%   r"   r   )clsr,   r   s      r!   from_configzApt.from_configa   sC    $3)*%  GG$56'*ww/K'L
 	
r#   c                 X    t        t        j                  | j                  d               S )Nr   )boolr   r    r*   )r6   s    r!   	availablezApt.availablel   s!    DJJt33A6788r#   F)forcec                |    | j                   j                  d| j                  dg|rt               y t               y )Nzupdate-sourcesupdate)freq)r,   runrun_package_commandr   r   )r6   r?   s     r!   update_package_sourceszApt.update_package_sourceso   s<    $$J$	 	 	
 +7	 	 	
r#      )maxsizec                 v    t        j                   ddg      j                  }t        |j                               S )Nz	apt-cachepkgnames)r   stdoutset
splitlines)r6   resps     r!   get_all_packageszApt.get_all_packagesw   s/    II{J78?? 4??$%%r#   pkglistc                     |D cg c]<  }t        j                  d|      d   j                  d      | j                         vr|> c}S c c}w )Nz/|=r   z-^)resplitrstriprN   )r6   rO   pkgs      r!   get_unavailable_packageszApt.get_unavailable_packages   sS     
xxs#A&--d3((*+ 
 	
 
s   AA	c                 \   | j                          t        j                  dt        |            }| j	                  |D cg c]  }|j                  d      d    c}      }|rt        j                  d|       |D cg c]	  }||vs| }}|r| j                  d|       |S c c}w c c}w )N%s=%s=r   zXThe following packages were not found by APT so APT will not attempt to install them: %sinstall)pkgs)	rE   r   expand_package_listr   rU   rR   LOGdebugrD   )r6   rO   xunavailablep
to_installs         r!   install_packageszApt.install_packages   s    ##%**7DMB33&-.QWWS\!_.
 II2
 ")AAA[,@aA
A$$YZ$@ / Bs   B$=	B)B)c                    |g }t        | j                        }|r"t        |t              r|j	                  |       n#|r!t        |t               r|j                  |       |dk(  r| j                  }|j	                  |       t        j                  d|      }|j                  |       | j                  || j                  dd       y )NupgraderW   F)args
update_envcapture)subp_kwargs)r   r4   r   r   appendextendr+   r   r[   _wait_for_apt_commandr5   )r6   r   re   rZ   full_commandrO   s         r!   rD   zApt.run_package_command   s    <DD,,-JtS)%jt,%i55GG$**7D9G$""$"..  	# 	
r#   c                 :   t         D ]n  }t        j                  j                  |      s#t	        |d      5 }	 t        j                  |t
        j                  t
        j                  z         	 ddd       p y# t        $ r Y ddd        yw xY w# 1 sw Y   xY w)ztDetermines 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)r6   lockhandles      r!   _apt_lock_availablezApt._apt_lock_available   s    
 # 	!D77>>$'dC !F!KK(EF! !		!   ! 	! !!! !s(   B5A99	BBBBB	c                     t        j                         }t        j                  d       t        j                         |z
  |k  rQ| j	                         st        j
                  d       @t        j                  d       	 t        j                  di |S t        d      # t        j                  $ r> | j	                         r t        j                  d       t        j
                  d       Y nw xY wt        j                         |z
  |k  rˌ{)zWWait for apt install to complete.

        subp_kwargs: kwargs to pass to subp
        zWaiting for APT lockrF   zAPT lock availablez*Another process holds APT lock. Waiting...zCould not get APT lockr'   )	time	monotonicr\   r]   r{   sleepr   ProcessExecutionErrorTimeoutError)r6   rh   timeout
start_times       r!   rk   zApt._wait_for_apt_command   s     ^^%
		()nn+g5++-

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

1 nn+g5s    B   AC10C1)NN)__name__
__module____qualname__namer
   Runnersr   r   r   r1   classmethodr   r;   r=   r>   rE   	functools	lru_cacherN   r   rU   r   rb   rD   r{   APT_LOCK_WAIT_TIMEOUTrk   __classcell__)r7   s   @r!   r%   r%   J   s    D 243748AA "*#	A
 "(3-0A %-SMA( 
 
w 
5 
 
94 9 /4 
 Y#& $&
 
 5H "
0" $95r#   r%   )"rt   r   loggingrp   rQ   r}   typingr   r   r   r   r   r   r	   	cloudinitr
   r   r   4cloudinit.distros.package_management.package_managerr   r   cloudinit.settingsr   r   	getLoggerr   r\   r2   ro   r   dictr   r"   r%   r'   r#   r!   <module>r      s       	 	  I I I ) ) 8g!  $ DI B]5. ]5r#   