3 \me@sddlZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z m Z ddl mZmZmZddlmZmZddlmZejeZdZd d d dgZdZe eeedddZGdddeZdS)N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages) PER_INSTANCEapt-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)cfgreturncCs|sd}dg}n8|jd}|jd}t|tr6|g}nt|tsHtdtj|stt|jdkr|rtj |drt t t|SgSdS)a9Parse 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 eatmydataenabledcommandz,apt_wrapper command must be a string or listrN) get isinstancestrlist TypeErrorr Zis_truelowerr Zwhichrr)rrrr /usr/lib/python3.6/apt.pyget_apt_wrapper(s      "r"cseZdZdZfdddejeeeeeeedfddZ e eje dddd Z d d Z ejd d ddZeedddZeedddZdddZdddZefddZZS)AptZaptN)apt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommand)runnerr$r%r&csVtj||dkrt}|dkr$d}t|t||_||_tjj|_ d|j d<dS)Nz dist-upgradeZnoninteractiveZDEBIAN_FRONTEND) super__init__APT_GET_COMMANDtuple apt_commandr&osenvironcopy environment)selfr'r$r%r&) __class__r r!r)Ls   z Apt.__init__)r'rrcCs&t|t|jd|jd|jddS)NZapt_get_wrapperr%r&)r$r%r&)r#r"r)clsr'rr r r! from_configas  zApt.from_configcCs|jjd|jdgtddS)Nzupdate-sourcesupdate)Zfreq)r'Zrunrun_package_commandr)r1r r r!update_package_sourcesls zApt.update_package_sources)maxsizecCstjddgj}t|jS)Nz apt-cacheZpkgnames)r stdoutset splitlines)r1Zrespr r r!get_all_packagestszApt.get_all_packages)pkglistcsfdd|DS)Ncsg|]}|jkr|qSr )r=).0Zpkg)r1r r! sz0Apt.get_unavailable_packages..r )r1r>r )r1r!get_unavailable_packages~szApt.get_unavailable_packages)r>rcs`|jtjdt|}|jdd|Dtjdfdd|D}|r\|jd|dS)Nz%s=%scSsg|]}|jddqS)=r)split)r?xr r r!r@sz(Apt.install_packages..zXThe following packages were not found by APT so APT will not attempt to install them: %scsg|]}|kr|qSr r )r?p) unavailabler r!r@sZinstall)pkgs)r7r expand_package_listrrALOGdebugr6)r1r>Z to_installr )rFr!install_packagesszApt.install_packagescCs|dkr g}t|j}|r0t|tr0|j|n|rHt|trH|j||dkrV|j}|j|tjd|}|j||j |||j ddddS)NZupgradez%s=%sF)argsenvZcapture) short_cmd subp_kwargs) rr,rrappendextendr&r rH_wait_for_apt_commandr0)r1rrLrGZ full_commandr>r r r!r6s"      zApt.run_package_commandcCsp|dkr t}x^|D]V}tjj|s$qt|d4}ytj|tjtjBWnt k r\dSXWdQRXqWdS)ztDetermines if another process holds any apt locks. If all locks are clear, return True else False. NwFT) APT_LOCK_FILESr-pathexistsopenfcntllockfZLOCK_EXZLOCK_NBOSError)r1Z lock_fileslockZhandler r r!_apt_lock_availables   zApt._apt_lock_availablec Cstj}tjdxtj||kr|js8tjdqtjdy2d|ddj|dd}tjtj|tj|d Stj k r|jrtjd tjdYqXqWt 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 zWaiting for APT lockr8zAPT lock availablezapt-z [ rL])Zlogfuncmsgfunckwargsz*Another process holds APT lock. Waiting...zCould not get APT lockN) timerIrJr\Zsleepjoinr Zlog_timer ZProcessExecutionError TimeoutError)r1rNrOZtimeoutZ start_timeZlog_msgr r r!rRs(     zApt._wait_for_apt_command)NN)N)__name__ __module__ __qualname__namer ZRunnersrrrr) classmethodrr4r7 functools lru_cacher=rrAr rKr6r\APT_LOCK_WAIT_TIMEOUTrR __classcell__r r )r2r!r#Is0    r#)rrrrr) rXrjZloggingr-rbZtypingrrrrrrrZ cloudinitr r r Z4cloudinit.distros.package_management.package_managerr r Zcloudinit.settingsrZ getLoggerrerIr*rTrldictrr"r#r r r r!s*$   !