+
    i                         ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
HtHtHt ^ RIHtHtHt ^ RIHtHt ^ RIHtHt ]P0                  ! ]4      tR
t. ROt^tR R lt ! R R	]4      tR# )    N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages)
PER_ALWAYSPER_INSTANCEc                \    V ^8  d   QhR\         \        ,          R\        \        ,          /# )   cfgreturn)r   dictr   str)formats   "J/usr/lib/python3/dist-packages/cloudinit/distros/package_management/apt.py__annotate__r   )   s"      $ DI     c                   V '       g   RpR.pM]V P                  R4      pV P                  R4      p\        V\        4      '       d   V.pM!\        V\        4      '       g   \	        R4      h\
        P                  ! V4      '       gJ   \        V4      P                  4       R8X  dG   V'       d?   \        P                  ! V^ ,          4      '       d   \        \        \        ,          V4      # . # )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 list)get
isinstancer   list	TypeErrorr   is_truelowerr   whichr	   r   )r   r   r   s   &  r   get_apt_wrapperr'   )   s     -'')$'')$gs##iGGT**JKK||GG&7tzz'!*7M7MDIw''	r   c                      a a ] tR t^Jt oRtRRRRRR/V3R lV 3R lllt]V3R lR	 l4       tV3R
 lR ltRR/R lt	]
P                  ! ^R7      R 4       tV3R lR ltV3R lR ltRR ltR t]3R ltRtVtV ;t# )Aptaptapt_get_wrapper_commandapt_get_commandNapt_get_upgrade_subcommandc          	         < V ^8  d   QhRS[ P                  RS[S[,          RS[S[S[,          ,          RS[S[,          /# )r   runnerr+   r,   r-   )r
   Runnersr   r   r   )r   __classdict__s   "r   r   Apt.__annotate__M   sN     A AA "*#	A
 "(3-0A %-SMAr   c                  < \         SV `  V4       Vf   \        V n        Vf   Rp\	        V4      \	        V P                  4      ,           V n        W@n        RR/V n        R # )Nzdist-upgradeDEBIAN_FRONTENDnoninteractive)super__init__APT_GET_COMMANDr,   tupleapt_commandr-   environment)selfr/   r+   r,   r-   	__class__s   &&$$$r   r7   Apt.__init__M   sf     	 "#2D %-)7& !89E  =
 
 +E'-/?@r   c                >   < V ^8  d   QhRS[ P                  RS[RR/# )r   r/   r   r   r)   )r
   r0   r   )r   r1   s   "r   r   r2   b   s&     
 
 
w 
5 
r   c                    \        V\        VP                  R 4      4      VP                  R4      VP                  R4      R7      # )apt_get_wrapperr,   r-   )r+   r,   r-   )r)   r'   r    )clsr/   r   s   &&&r   from_configApt.from_configa   sC    $3)*%  GG$56'*ww/K'L
 	
r   c                    < V ^8  d   QhRS[ /# )r   r   )bool)r   r1   s   "r   r   r2   l   s     9 94 9r   c                b    \        \        P                  ! V P                  ^ ,          4      4      # )r   )rF   r   r&   r,   )r<   s   &r   	availableApt.availablel   s!    DJJt33A6788r   forceFc               ~    V P                   P                  R V P                  R.V'       d   \        M\        R7       R# )zupdate-sourcesupdate)freqN)r/   runrun_package_commandr   r   )r<   rJ   s   &$r   update_package_sourcesApt.update_package_sourceso   s/    $$J$,	 	 	
r   )maxsizec                x    \         P                   ! R R.4      P                  p\        VP                  4       4      # )z	apt-cachepkgnames)r   stdoutset
splitlines)r<   resps   & r   get_all_packagesApt.get_all_packagesw   s/    II{J78?? 4??$%%r   c                0   < V ^8  d   QhRS[ S[,          /# )r   pkglist)r   r   )r   r1   s   "r   r   r2      s     
 
 
r   c                    V Uu. uFG  p\         P                  ! R V4      ^ ,          P                  R4      V P                  4       9  g   KE  VNKI  	  up# u upi )z/|=z-^)resplitrstriprY   )r<   r\   pkgs   && r   get_unavailable_packagesApt.get_unavailable_packages   sZ     
xxs#A&--d3((*+ C
 	
 
s   AAAc                &   < V ^8  d   QhRS[ RS[/# )r   r\   r   )r   r   )r   r1   s   "r   r   r2      s       5H r   c                   V P                  4        \        P                  ! R \        V4      4      pT P	                  V Uu. uF  q"P                  R4      ^ ,          NK  	  up4      pV'       d   \        P                  RV4       V Uu. uF  qDV9  g   K  VNK  	  ppV'       d   V P                  RVR7       V# u upi u upi )%s=%s=zXThe following packages were not found by APT so APT will not attempt to install them: %sinstall)pkgs)	rP   r   expand_package_listr"   rb   r_   LOGdebugrO   )r<   r\   xunavailablep
to_installs   &&    r   install_packagesApt.install_packages   s    ##%**7DMB33&-.gWWS\!__g.
 II2
 ")AA[,@aa
A$$YZ$@ / Bs     B;	C C c                   Vf   . p\        V P                  4      pV'       d)   \        V\        4      '       d   VP	                  V4       M/V'       d(   \        V\         4      '       d   VP                  V4       VR8X  d   V P                  pVP	                  V4       \        P                  ! RV4      pVP                  V4       V P                  RVRV P                  RR/R7       R # )Nupgraderf   args
update_envcaptureF)subp_kwargs)r"   r:   r!   r   appendextendr-   r   rj   _wait_for_apt_commandr;   )r<   r   ru   ri   full_commandr\   s   &&&&  r   rO   Apt.run_package_command   s    <DD,,-JtS))%jt,,%i55GG$**7D9G$""d..5 	# 	
r   c                ~   \          F  p\        P                  P                  V4      '       g   K*  \	        VR4      ;_uu_ 4       p \
        P                  ! V\
        P                  \
        P                  ,          4        RRR4       K  	  R#   \         d     RRR4        R# i ; i  + '       g   i     K  ; i)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)r<   lockhandles   &  r   _apt_lock_availableApt._apt_lock_available   s    
 #D77>>$''dCF!KK(EF !	 #   ! 	 !! !s*   B+:BB(	B+'B(	(B++B<c                   \         P                  ! 4       p\        P                  R4       \         P                  ! 4       V,
          V8  d[   V P	                  4       '       g   \         P
                  ! ^4       KO  \        P                  R4        \        P                  ! R/ VB # \        R4      h  \        P                   dG    T P	                  4       '       d   h \        P                  R4       \         P
                  ! ^4        K  i ; i)zGWait for apt install to complete.

subp_kwargs: kwargs to pass to subp
zWaiting for APT lockzAPT lock availablez*Another process holds APT lock. Waiting...zCould not get APT lock )	time	monotonicrk   rl   r   sleepr   ProcessExecutionErrorTimeoutError)r<   rx   timeout
start_times   &&& r   r{   Apt._wait_for_apt_command   s     ^^%
		()nn+g5++--

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

1s   B1 1*D,DD)r:   r,   r-   r;   r   )NN)__name__
__module____qualname____firstlineno__namer7   classmethodrC   rH   rP   	functools	lru_cacherY   rb   rq   rO   r   APT_LOCK_WAIT_TIMEOUTr{   __static_attributes____classdictcell____classcell__)r=   r1   s   @@r   r)   r)   J   s     DA 24	A
 48A 59A A( 
 
9 9
e 
 #& $&
 
 "
0" $95 5r   r)   )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) r   r   loggingr   r^   r   typingr   r   r   r   r   r   r	   	cloudinitr
   r   r   4cloudinit.distros.package_management.package_managerr   r   cloudinit.settingsr   r   	getLoggerr   rk   r8   r   r   r'   r)   r   r   r   <module>r      sj       	 	  I I I ) ) 8!  B]5. ]5r   