f!ddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z ddlmZmZmZddlmZmZddlmZej.eZdZgdZdZd e ed e efd ZGd d eZ y)N)AnyIterableListMappingOptionalSequencecast)helperssubputil)PackageManagerUninstalledPackages) 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/lockcfgreturnc||sd}dg}nQ|jd}|jd}t|tr|g}nt|ts t dt j |s6t|jdk(r1|r/tj|drttt|SgS)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. auto eatmydataenabledcommandz,apt_wrapper command must be a string or listr) get isinstancestrlist TypeErrorr is_truelowerr whichr r)rrrs J/usr/lib/python3/dist-packages/cloudinit/distros/package_management/apt.pyget_apt_wrapperr!)s -'')$'')$ gs #iGGT*JK K ||G G &7tzz'!*7MDIw'' c eZdZdZdddddej deedeeedeeffd Z e dej d e d dfd Z d e fd ZdZej"ddZdeefdZded efdZddZddZefdZxZS)AptaptNapt_get_wrapper_commandapt_get_commandapt_get_upgrade_subcommandrunnerr(r)r*ct||| t|_|d}t |t |jz|_||_ddi|_y)Nz dist-upgradeDEBIAN_FRONTENDnoninteractive)super__init__APT_GET_COMMANDr)tuple apt_commandr* environment)selfr+r(r)r* __class__s r r0z Apt.__init__Msh   "#2D % -)7 & !89E  =  +E'-/?@r"rrct|t|jd|jd|jdS)Napt_get_wrapperr)r*r')r$r!r)clsr+rs r from_configzApt.from_configasC $3)*% GG$56'*ww/K'L   r"cXttj|jdS)Nr)boolr rr)r5s r availablez Apt.availablels!DJJt33A6788r"c`|jjd|jdgty)Nzupdate-sourcesupdate)freq)r+runrun_package_commandrr=s r update_package_sourceszApt.update_package_sourcesos+    $ $ J  r")maxsizecvtjddgj}t|jS)Nz apt-cachepkgnames)r stdoutset splitlines)r5resps r get_all_packageszApt.get_all_packagesws/II{J78?? 4??$%%r"pkglistc|Dcgc]<}tjd|djd|jvr|>c}Scc}w)Nz/|=rz-^)resplitrstriprM)r5rNpkgs r get_unavailable_packageszApt.get_unavailable_packagessS xxs#A&--d3((*+    sAA c\|jtjdt|}|j |Dcgc]}|j ddc}}|rt jd||Dcgc] }||vs| }}|r|jd||Scc}wcc}w)N%s=%s=rzXThe following packages were not found by APT so APT will not attempt to install them: %sinstall)pkgs) rDr expand_package_listrrTrQLOGdebugrC)r5rNx unavailablep to_installs r install_packageszApt.install_packagess ##%**7DMB33&- .QWWS\!_ .   II2  ")AAA[,@aA A   $ $YZ $ @ /BsB$= B)B)c|g}t|j}|r"t|tr|j |n#|r!t|tr|j ||dk(r |j }|j |tjd|}|j ||j|||jddy)NupgraderVF)args update_envcapture) short_cmd subp_kwargs) rr3rrappendextendr*r rZ_wait_for_apt_commandr4)r5rrdrY full_commandrNs r rCzApt.run_package_commands <DD,,- JtS)    % jt,    % i 55GG$**7D9G$ ""$"..  # r"cB|t}|D]n}tjj|s#t |d5} t j |t jt jz dddpy#t$r YdddywxYw#1swYxYw)ztDetermines if another process holds any apt locks. If all locks are clear, return True else False. NwFT) APT_LOCK_FILESospathexistsopenfcntllockfLOCK_EXLOCK_NBOSError)r5 lock_fileslockhandles r _apt_lock_availablezApt._apt_lock_availables  'J !D77>>$'dC !F!KK  (EF ! !  !!  ! !! ! !s(B5A== BBBBB ctj}tjdtj|z |kr|jstjd@tjd d|ddj |dd}t jtj|tj| Std #tj$r>|jrtjd tjdYnwxYwtj|z |kr|) 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 lockrEzAPT lock availablezapt-z [ rd])logfuncmsgfunckwargsz*Another process holds APT lock. Waiting...zCould not get APT lock) timer[r\r|sleepjoinr log_timer ProcessExecutionError TimeoutError)r5rgrhtimeout start_timelog_msgs r rkzApt._wait_for_apt_commandsYY[  ()iikJ&0++- 1  II* +   2chh{67J.K-LAN}}II& *344-- ++- FG 1  iikJ&0sACAD,+D,)NN)N)__name__ __module__ __qualname__namer Runnersrrrr0 classmethodrr:r<r>rD functools lru_cacherMrrTrrarCr|APT_LOCK_WAIT_TIMEOUTrk __classcell__)r6s@r r$r$Js D 243748 AA"*# A "(3-0 A %-SM A(  w 5  949 Y#&$&    5H" 2&/D'5r"r$)!rtrloggingrprPrtypingrrrrrrr cloudinitr r r 4cloudinit.distros.package_management.package_managerr rcloudinit.settingsr getLoggerrr[r1rordictrr!r$r&r"r rs  III)),g! $DIBh5.h5r"