
    f!                         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  ej.                  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_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 Z ej"                  d      d        Zdee   fdZdedefdZddZd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    r0   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)   r5   s    r    	availablezApt.availablel   s!    DJJt33A6788r"   c                 `    | j                   j                  d| j                  dgt               y )Nzupdate-sourcesupdate)freq)r+   runrun_package_commandr   r=   s    r    update_package_sourceszApt.update_package_sourceso   s+    $$J	 	 	
r"      )maxsizec                 v    t        j                   ddg      j                  }t        |j                               S )Nz	apt-cachepkgnames)r   stdoutset
splitlines)r5   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rstriprM   )r5   rN   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)	rD   r   expand_package_listr   rT   rQ   LOGdebugrC   )r5   rN   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upgraderV   F)args
update_envcapture)	short_cmdsubp_kwargs)r   r3   r   r   appendextendr*   r   rZ   _wait_for_apt_commandr4   )r5   r   rd   rY   full_commandrN   s         r    rC   zApt.run_package_command   s    <DD,,-JtS)%jt,%i55GG$**7D9G$""$"..  	# 	
r"   c                 B   |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.
        NwFT)
APT_LOCK_FILESospathexistsopenfcntllockfLOCK_EXLOCK_NBOSError)r5   
lock_fileslockhandles       r    _apt_lock_availablezApt._apt_lock_available   s    
 'J 	!D77>>$'dC !F!KK(EF! !		!   ! 	! !!! !s(   B5A==	BBBBB	c                    t        j                          }t        j                  d       t        j                          |z
  |k  r| j                         st        j                  d       @t        j                  d       	 d| ddj                  |d          d}t        j                  t        j                  |t        j                  |	      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|)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 lockrE   zAPT lock availablezapt-z [ rd   ])logfuncmsgfunckwargsz*Another process holds APT lock. Waiting...zCould not get APT lock)timer[   r\   r|   sleepjoinr   log_timer   ProcessExecutionErrorTimeoutError)r5   rg   rh   timeout
start_timelog_msgs         r    rk   zApt._wait_for_apt_command   s    YY[
		()iikJ&0++-

1II*+ 2chh{67J.K-LAN}}II&	 * 344 --  ++-		FG

1 iikJ&0s    AC AD,+D,)NN)N)__name__
__module____qualname__namer
   Runnersr   r   r   r0   classmethodr   r:   r<   r>   rD   	functools	lru_cacherM   r   rT   r   ra   rC   r|   APT_LOCK_WAIT_TIMEOUTrk   __classcell__)r6   s   @r    r$   r$   J   s    D 243748AA "*#	A
 "(3-0A %-SMA( 
 
w 
5 
 
94 9
 Y#& $&
 
 5H "
2& /D'5r"   r$   )!rt   r   loggingrp   rP   r   typingr   r   r   r   r   r   r	   	cloudinitr
   r   r   4cloudinit.distros.package_management.package_managerr   r   cloudinit.settingsr   	getLoggerr   r[   r1   ro   r   dictr   r!   r$   r&   r"   r    <module>r      s       	 	  I I I ) ) ,g!  $ DI Bh5. h5r"   