x[hddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z ddlmZmZmZddlmZmZddlmZmZej0eZdZgdZdZd e ed e efd Z Gd d eZ!y)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/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 ZdddZej"ddZdeefdZded efdZddZdZefdZxZS)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!r1z 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 r r*)r6s r! availablez Apt.availablels!DJJt33A6788r#F)forcec||jjd|jdg|r tyty)Nzupdate-sourcesupdate)freq)r,runrun_package_commandrr)r6r?s r!update_package_sourceszApt.update_package_sourcesos<    $ $ J$  +7  r#)maxsizecvtjddgj}t|jS)Nz apt-cachepkgnames)r stdoutset splitlines)r6resps r!get_all_packageszApt.get_all_packagesws/II{J78?? 4??$%%r#pkglistc|Dcgc]<}tjd|djd|jvr|>c}Scc}w)Nz/|=rz-^)resplitrstriprN)r6rOpkgs 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) rEr expand_package_listrrUrRLOGdebugrD)r6rOx 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)NupgraderWF)args update_envcapture) subp_kwargs) rr4rrappendextendr+r r[_wait_for_apt_commandr5)r6rrerZ full_commandrOs r!rDzApt.run_package_commands <DD,,- JtS)    % jt,    % i 55GG$**7D9G$ ""$"..  # r#c:tD]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. wNFT) APT_LOCK_FILESospathexistsopenfcntllockfLOCK_EXLOCK_NBOSError)r6lockhandles r!_apt_lock_availablezApt._apt_lock_availables # !D77>>$'dC !F!KK  (EF ! !  !!  ! !! ! !s(B5A99 BB BBB c tj}tjdtj|z |krQ|j stj d@tjd t j di|Std#t j$r>|j rtjdtj dYnwxYwtj|z |krˌ{)zWWait for apt install to complete. subp_kwargs: kwargs to pass to subp zWaiting for APT lockrFzAPT lock availablez*Another process holds APT lock. Waiting...zCould not get APT lockr') time monotonicr\r]r{sleepr ProcessExecutionError TimeoutError)r6rhtimeout start_times r!rkzApt._wait_for_apt_commands^^%  ()nn+g5++- 1  II* + yy/;// 344-- ++- FG 1  nn+g5sB AC10C1)NN)__name__ __module__ __qualname__namer Runnersrrrr1 classmethodrr;r=r>rE functools lru_cacherNrrUrrbrDr{APT_LOCK_WAIT_TIMEOUTrk __classcell__)r7s@r!r%r%Js D 243748 AA"*# A "(3-0 A %-SM A(  w 5  949/4 Y#&$&    5H" 0"$95r#r%)"rtrloggingrprQr}typingrrrrrrr cloudinitr r r 4cloudinit.distros.package_management.package_managerr rcloudinit.settingsrr getLoggerrr\r2rordictrr"r%r'r#r!rs  III))8g! $DIB]5.]5r#