a 'Dg@sddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z ddlmZmZmZddlmZmZddlmZmZeeZdZgdZdZe ee ed d d Z Gd d d eZ!dS)N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages) PER_ALWAYS PER_INSTANCE)zapt-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)cfgreturncCs|sd}dg}n8|d}|d}t|tr6|g}nt|tsHtdt|stt|dkr|rt |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 whichrr)rrrrL/usr/lib/python3.9/site-packages/cloudinit/distros/package_management/apt.pyget_apt_wrapper)s$       rcseZdZdZddddejeeeeeeedfddZ e eje ddd d Z e d d d ZddddZejddddZeedddZeedddZd"ddZddZefd d!ZZS)#AptZaptrNapt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommand)runnerr"r#r$csNt||durt|_|dur&d}t|t|j|_||_ddi|_dS)Nz dist-upgradeZDEBIAN_FRONTENDZnoninteractive)super__init__APT_GET_COMMANDr#tuple apt_commandr$ environment)selfr%r"r#r$ __class__rrr'Ms z Apt.__init__)r%rrcCs&t|t|d|d|ddS)NZapt_get_wrapperr#r$r!)r rr)clsr%rrrr from_configaszApt.from_config)rcCstt|jdS)Nr)boolr rr#r,rrr availablelsz Apt.availableF)forcecCs$|jjd|jdg|rtntddS)Nzupdate-sourcesupdate)Zfreq)r%runrun_package_commandrr)r,r4rrrupdate_package_sourcesos  zApt.update_package_sources)maxsizecCstddgj}t|S)Nz apt-cacheZpkgnames)r stdoutset splitlines)r,Zresprrrget_all_packageswszApt.get_all_packages)pkglistcsfdd|DS)Ncs.g|]&}td|ddvr|qS)z/|=rz-^)resplitrstripr>).0pkgr2rr s z0Apt.get_unavailable_packages..r)r,r?rr2rget_unavailable_packagess zApt.get_unavailable_packages)r?rcsd|tdt|}|dd|Dr.zXThe following packages were not found by APT so APT will not attempt to install them: %scsg|]}|vr|qSrr)rCpZ unavailablerrrErJinstall)pkgs)r8r expand_package_listrrFLOGdebugr7)r,r?Z to_installrrLrinstall_packagess zApt.install_packagescCs|dur g}t|j}|r0t|tr0||n|rHt|trH|||dkrV|j}||td|}|||j ||j ddddS)NZupgraderGF)argsZ update_envZcapture) subp_kwargs) rr*rrappendextendr$r rO_wait_for_apt_commandr+)r,rrSrNZ full_commandr?rrrr7s$      zApt.run_package_commandc CstD]x}tj|sqt|dL}zt|tjtjBWn"t y\YWddS0Wdq1sr0YqdS)ztDetermines if another process holds any apt locks. If all locks are clear, return True else False. wNFT) APT_LOCK_FILESospathexistsopenfcntllockfZLOCK_EXZLOCK_NBOSError)r,lockZhandlerrr_apt_lock_availables   6zApt._apt_lock_availablecCst}tdt||kr|s6tdqtdztjfi|WStjy|rltdtdYq0qtddS)zWWait for apt install to complete. subp_kwargs: kwargs to pass to subp zWaiting for APT lockr9zAPT lock availablez*Another process holds APT lock. Waiting...zCould not get APT lockN) time monotonicrPrQrbsleepr ZProcessExecutionError TimeoutError)r,rTtimeoutZ start_timerrrrWs     zApt._wait_for_apt_command)NN)__name__ __module__ __qualname__namer ZRunnersrrrr' classmethodrr0r1r3r8 functools lru_cacher>rrFr rRr7rbAPT_LOCK_WAIT_TIMEOUTrW __classcell__rrr-rr Js,     r )"r^rmZloggingrZr@rctypingrrrrrrrZ cloudinitr r r Z4cloudinit.distros.package_management.package_managerr r Zcloudinit.settingsrrZ getLoggerrhrPr(rYrodictrrr rrrrs$  !