
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me                 @   s   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ddddgZdZe
e ee dddZG dd deZdS )    N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages)PER_INSTANCEapt-get(--option=Dpkg::Options::=--force-confold*--option=Dpkg::options::=--force-unsafe-io--assume-yes--quietz/var/lib/dpkg/lock-frontendz/var/lib/dpkg/lockz/var/cache/apt/archives/lockz/var/lib/apt/lists/lock   )cfgreturnc             C   s   | sd}dg}n8| j d}| j d}t|tr6|g}nt|tsHtdtj|stt|j dkr|rtj	|d rt
tt |S g S d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.
    autoZ	eatmydataenabledcommandz,apt_wrapper command must be a string or listr   N)get
isinstancestrlist	TypeErrorr   Zis_truelowerr
   Zwhichr   r   )r   r   r    r    /usr/lib/python3.6/apt.pyget_apt_wrapper(   s    




"r"   c                   s   e Zd ZdZf dddejee eee  ee d fddZ	e
ejed ddd	Zd
d Zejdddd Zee dddZeedddZdddZdddZefddZ  ZS )AptZaptN)apt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommand)runnerr$   r%   r&   c               sV   t  j| |d krt}|d kr$d}t|t| | _|| _tjj | _	d| j	d< d S )Nzdist-upgradeZnoninteractiveZDEBIAN_FRONTEND)
super__init__APT_GET_COMMANDtupleapt_commandr&   osenvironcopyenvironment)selfr'   r$   r%   r&   )	__class__r    r!   r)   L   s    
zApt.__init__)r'   r   r   c             C   s&   t |t|jd|jd|jddS )NZapt_get_wrapperr%   r&   )r$   r%   r&   )r#   r"   r   )clsr'   r   r    r    r!   from_configa   s    
zApt.from_configc             C   s   | j jd| jdgtd d S )Nzupdate-sourcesupdate)Zfreq)r'   Zrunrun_package_commandr   )r1   r    r    r!   update_package_sourcesl   s
    zApt.update_package_sources   )maxsizec             C   s   t j ddgj}t|j S )Nz	apt-cacheZpkgnames)r
   stdoutset
splitlines)r1   Zrespr    r    r!   get_all_packagest   s    zApt.get_all_packages)pkglistc                s    fdd|D S )Nc                s   g | ]}| j  kr|qS r    )r=   ).0Zpkg)r1   r    r!   
<listcomp>   s    z0Apt.get_unavailable_packages.<locals>.<listcomp>r    )r1   r>   r    )r1   r!   get_unavailable_packages~   s    zApt.get_unavailable_packages)r>   r   c                s`   | j   tjdt|}| jdd |D  tjd   fdd|D }|r\| jd|d  S )Nz%s=%sc             S   s   g | ]}|j d d qS )=r   )split)r?   xr    r    r!   r@      s    z(Apt.install_packages.<locals>.<listcomp>zXThe following packages were not found by APT so APT will not attempt to install them: %sc                s   g | ]}| kr|qS r    r    )r?   p)unavailabler    r!   r@      s    Zinstall)pkgs)r7   r   expand_package_listr   rA   LOGdebugr6   )r1   r>   Z
to_installr    )rF   r!   install_packages   s    zApt.install_packagesc             C   s   |d krg }t | j}|r0t|tr0|j| n|rHt|t rH|j| |dkrV| j}|j| tjd|}|j| | j	||| j
ddd d S )NZupgradez%s=%sF)argsenvZcapture)	short_cmdsubp_kwargs)r   r,   r   r   appendextendr&   r   rH   _wait_for_apt_commandr0   )r1   r   rL   rG   Zfull_commandr>   r    r    r!   r6      s"    



zApt.run_package_commandc             C   sp   |dkrt }x^|D ]V}tjj|s$qt|d4}ytj|tjtjB  W n t	k
r\   dS X W dQ R X qW dS )ztDetermines if another process holds any apt locks.

        If all locks are clear, return True else False.
        NwFT)
APT_LOCK_FILESr-   pathexistsopenfcntllockfZLOCK_EXZLOCK_NBOSError)r1   Z
lock_fileslockZhandler    r    r!   _apt_lock_available   s    
zApt._apt_lock_availablec             C   s   t j  }tjd xt j  | |k r| j s8t jd qtjd y2d| ddj|d  d}tjtj|tj|d	S  tj	k
r   | j r tjd
 t jd Y qX qW t
ddS )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 lockr8   zAPT lock availablezapt-z [ rL   ])Zlogfuncmsgfunckwargsz*Another process holds APT lock. Waiting...zCould not get APT lockN)timerI   rJ   r\   Zsleepjoinr   Zlog_timer
   ZProcessExecutionErrorTimeoutError)r1   rN   rO   ZtimeoutZ
start_timeZlog_msgr    r    r!   rR      s(    



zApt._wait_for_apt_command)NN)N)__name__
__module____qualname__namer	   ZRunnersr   r   r   r)   classmethodr   r4   r7   	functools	lru_cacher=   r   rA   r   rK   r6   r\   APT_LOCK_WAIT_TIMEOUTrR   __classcell__r    r    )r2   r!   r#   I   s   0



r#   )r   r   r   r   r   ) rX   rj   Zloggingr-   rb   Ztypingr   r   r   r   r   r   r   Z	cloudinitr	   r
   r   Z4cloudinit.distros.package_management.package_managerr   r   Zcloudinit.settingsr   Z	getLoggerre   rI   r*   rT   rl   dictr   r"   r#   r    r    r    r!   <module>   s*   $
    	!