Ë
    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ž   € ñ ØˆØ�-‰à—'‘'˜)Ó$ˆØ—'‘'˜)Ó$ˆä�gœsÔ#Ø�i‰GÜ˜G¤TÔ*ÜÐJÓKÐKä‡|�|�GÔÜˆG‹×ÑÓ Ò&©7´t·z±zÀ'È!Á*Ô7Mä”Dœ‘I˜wÓ'Ð'àˆ	ó    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   ø€ ô 	‰Ñ˜Ô ØÐ"Ü#2ˆDÔ Ø%Ð-Ø)7Ð&Ü Ð!8Ó9¼EØ× Ñ ó=
ñ 
ˆÔð +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Ø—‘Ð)Ó*ó%ð  ŸG™GÐ$5Ó6Ø'*§w¡wÐ/KÓ'Lô
ð 	
r#   c                 óX   — t        t        j                  | j                  d   «      «      S )Nr   )Úboolr   r    r*   )r6   s    r!   Ú	availablezApt.availablel   s!   € Ü”D—J‘J˜t×3Ñ3°AÑ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/   € ä—I‘I˜{¨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   € ð ö
àÜ�x‰x˜˜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ª   € Ø×#Ñ#Ô%Ü×*Ñ*¨7´D¸³MÓBˆØ×3Ñ3Ø&-Ö. ˆQ�W‰W�S‹\˜!‹_Ò.ó
ˆñ Ü�I‰Ið2àôð
 ")ÖA˜A¨A°[Ò,@’aÐAˆ
ÐAÙØ×$Ñ$ Y°ZÐ$Ô@ØÐùò /ùò 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×,Ñ,Ó-ˆá”J˜t¤SÔ)Ø×Ñ Õ%Ù”j ¤tÔ,Ø×Ñ Ô%à�iÒØ×5Ñ5ˆGØ×Ñ˜GÔ$Ü×*Ñ*¨7°DÓ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Ü—7‘7—>‘> $Ô'àÜ�d˜C“ð ! Fð!Ü—K‘K ¬¯©¼¿¹Ñ(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Ô   € ô —^‘^Ó%ˆ
Ü�	‰	Ð(Ô)Ü�n‰nÓ Ñ+¨gÒ5Ø×+Ñ+Ô-Ü—
‘
˜1”ØÜ�I‰IÐ*Ô+ðÜ—y‘yÑ/ ;Ñ/Ð/ô  Ð3Ó4Ð4øô ×-Ñ-ò ð ×+Ñ+Ô-ØÜ—	‘	ÐFÔGÜ—
‘
˜1–ðúô �n‰nÓ Ñ+¨gÓ5øs   Â 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ð 24Ø37Ø48òAà—‘ðAð "*¨#¡ð	Að
 " (¨3¡-Ñ0ðAð %-¨S¡MõAð( ð
 §¡ð 
°wð 
À5ò 
ó ð
ð9˜4ó 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#   