U ϴf @sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z ddl m Z mZmZmZmZmZmZddlZddlmZddlmZmZmZmZmZmZmZddlm Z ddl!m"Z"dZ#d Z$d Z%d Z&d Z'd Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4ej56e dej56e dgej56e dej56e dej56e dej56e dgd Z7d!d"d#gZ8e9Z:e;eej?Gd$d%d%ej@ZAed&d'eBfd(eBfd)eBfgZCd*d+ZDeDeBeBd,d-d.ZEd/d0ZFeBeeBd1d2d3ZGdeeBeeBee eBeBfeBd4d5d6ZHe dd7deeBee eBeBfeBd8d9d:ZIGd;d<d<ZJd=d>ZKd?d@ZLeBeeBdAdBdCZMdeBeNeeBdEdFdGZOdee eBeBfeBdHdIdJZPeQejRejSfe8eBdKdLdMZTdeeBeeeBee eBeBfeBdNdOdPZUeBeejVdQdRdSZWeeBeejVdQdTdUZXdejVeeBeejYdVdWdXZZeeBeBeNeBeBdYdZd[Z[deeBeBeNeBeBeNeBd\d]d^Z\eBeBeBeeBeBdd_d`daZ]dbdcZ^dddeZ_deBeBeeBddfdgdhZ`didjZadkdlZbdmdnZcdodpZdeBeNdqdrdsZeeeCdtdudvZfeeBdtdwdxZgddeAjhfeeBeeBeeAddydzd{Zieejdtd|d}Zkeejdtd~dZlddZmddtddZneeBeBdddZoeeBeBdddZpeeBdddZqddZrddZseeBe eBeeBeeBffdddZteBdtddZudS)N) lru_cachewraps)DictIterableList NamedTupleOptionalSetUnion)AcquireProgress) event_logger exceptionsgpgmessagessecret_managersystemutil)ESM_APT_ROOTDIR)status_cache_filegN@z # ubuntu-pro-clientzDir::Etc::netrc/zDir::Etc::netrcparts/zDir::State::lists/a/* * Autogenerated by ubuntu-pro-client * Do not edit this file directly * * To change what ubuntu-pro-client sets, use the `pro config set` * or the `pro config unset` commands to set/unset either: * global_apt_http_proxy and global_apt_https_proxy * for a global apt proxy * or * ua_apt_http_proxy and ua_apt_https_proxy * for an apt proxy that only applies to Ubuntu Pro related repos. */ z$Acquire::http::Proxy "{proxy_url}"; z%Acquire::https::Proxy "{proxy_url}"; z4Acquire::http::Proxy::esm.ubuntu.com "{proxy_url}"; z5Acquire::https::Proxy::esm.ubuntu.com "{proxy_url}"; z/etc/apt/trusted.gpg.d/z/usr/share/keyringsz/usr/lib/apt/methods/httpsz /usr/sbin/update-ca-certificatesz//etc/apt/apt.conf.d/90ubuntu-advantage-aptproxyz*/var/lib/apt/periodic/update-success-stamp)ZxenialZbionicZfocalZjammyZmanticz# Written by ubuntu-pro-client Types: deb{deb_src} URIs: {url} Suites: {suites} Components: main Signed-By: {keyrings_dir}/{keyring_file} zetc/apt/sources.listzvar/lib/dpkg/statuszetc/apt/apt.conf.dzetc/apt/preferences.dzvar/cache/apt/archives/partialzvar/lib/apt/lists/partial)filesfoldersg?g@g$@c@seZdZeZeZdS) AptProxyScopeN)__name__ __module__ __qualname__objectGLOBALUACLIENTrr./usr/lib/python3/dist-packages/uaclient/apt.pyrbsrInstalledAptPackagenameversionarchcstfdd}|S)z*Decorator ensuring apt_pkg is initialized.cs"tjddkrt||S)NDir)apt_pkgconfiggetinit)argskwargsfrrnew_fpsz"ensure_apt_pkg_init..new_f)r)r-r.rr,rensure_apt_pkg_initmsr/abcCs t||SN)r&version_comparer0rrrr4{sr4c Cs |d\}}tjdsdSzFt4}tjddd||||tj |dgt t dW5QRXWnt j k r}z^|jdkrt|j}td |rt j|d ntd |rt j|d t jt|d W5d}~XYn&tjk rt jt |d YnXdS)aValidate apt credentials for a PPA. @param repo_url: private-ppa url path @param username: PPA login username. @param password: PPA login password or resource token. @raises: UbuntuProError for invalid credentials, timeout or unexpected errors. ://z/usr/lib/apt/apt-helperNz download-filez{}://{}:{}@{}/pool/zapt-helper-output)Ztimeout retry_sleepsdz401\s+unauthorized|httperror401)repozconnection timed outZdetail)Zsecondsr8)splitospathexiststempfileZTemporaryDirectoryrsubpformatjoinAPT_HELPER_TIMEOUT APT_RETRIESr ProcessExecutionErrorZ exit_codestrstderrlowerresearchZAPTInvalidCredentialsZ APTTimeoutAPTUnexpectedError subprocessZTimeoutExpiredZAPTCommandTimeout)repo_urlusernamepasswordZprotocol repo_pathZtmpderFrrrassert_valid_apt_credentialss@          rQ) apt_errorreturncCsVt}|dD]<}|rtd|}|rd|ddd}||q|S)aAParse apt update errors for invalid apt config in user machine. This functions parses apt update errors regarding the presence of invalid apt config in the system, for example, a ppa that cannot be reached, for example. In that scenario, apt will output a message in the following formats: The repository 'ppa 404 Release' ... Failed to fetch ppa 404 ... On some releases, both of these errors will be present in the apt error message. :param apt_error: The apt error string :return: a NamedMessage containing the error message  z2(Failed to fetch |The repository .)(?P[^\s]+)z- urlz/distsr)setstripr:rHrI groupdictadd)rR failed_reposlineZ pattern_matchZrepo_url_matchrrr(_parse_apt_update_for_invalid_apt_configs r\)cmd error_msgoverride_env_varsrSc Csztj|dt|d\}}Wn|tjk r}z\dt|jkrFtn$t|j}|rjtj d t |d|rr|nt|}tj |dW5d}~XYnX|S)aRun an apt command, retrying upon failure APT_RETRIES times. :param cmd: List containing the apt command to run, passed to subp. :param error_msg: The string to raise as UbuntuProError when all retries are exhausted in failure. :param override_env_vars: Passed directly as subp's override_env_vars arg :return: stdout from successful run of the apt command. :raise UbuntuProError: on issues running apt-cache policy. T)Zcapturer6r_z%Could not get lock /var/lib/dpkg/lockrT)rZr9N) rr?rCr rDrErFAPTProcessConflictErrorr\APTInvalidRepoErrorrAsortedrJ)r]r^r_out_errrPrZmsgrrrrun_apt_commands$   rf)maxsize)r^r_rScCstddg||dS)N apt-cachepolicy)r]r^r_)rf)r^r_rrrget_apt_cache_policys rjc@s$eZdZddZddZddZdS)PreserveAptCfgcCs||_i|_dSr3)apt_funccurrent_apt_cfg)selfrlrrr__init__szPreserveAptCfg.__init__cs&tjfddD|_|S)Ncsi|]}|t|qSr)copydeepcopyr().0keycfgrr sz,PreserveAptCfg.__enter__..)r&r'keysrmrl)rnrrtr __enter__ s  zPreserveAptCfg.__enter__cCs4tj}|jD]}|||j|qtdSr3)r&r'rmrwrVZ init_system)rntypevalue tracebackrursrrr__exit__szPreserveAptCfg.__exit__N)rrrrorxr|rrrrrksrkcCs.tjD]}tj|q ttdSr3)r&r'rwclearr)Cachersrrrget_apt_pkg_cachesrcCshzJtjD]}td|s tj|q tjdttt dWSt k rbiYSXdS)Nz^Acquirer$) r&r'rwrHrIr}rVrr)r~ Exceptionrrrrget_esm_apt_pkg_cache#s  r)pkg_namerSc CsTtt4}z ||}Wn tk r6YW5QRdSXW5QRX|jrP|jjSdSr3)rkrKeyError current_verver_str)rcachepackagerrrget_pkg_version6s  rF)rcheck_esm_cacherSc Cstt`}z ||}Wn tk r6YW5QRdSXt|}||}|s^W5QRdS|j}W5QRX|sv|Stt}|rz ||}Wn$tk r|YW5QRSXt|} | |} | s|W5QRS| j} t| |dkr| W5QRSW5QRX|S)Nr) rkrrr&DepCacheget_candidate_verrrr4) rrrr dep_cache candidateZcandidate_versionZ esm_cacheZ esm_packageZ esm_dep_cacheZ esm_candidateZesm_candidate_versionrrrget_pkg_candidate_versionCs@        r)r_rSc Cszztddg|d}Wn~tjk r4tYnbtjk rd}ztj|jdW5d}~XYn2tj k r}ztj |jdW5d}~XYnXW5tX|S)Napt-getupdater]r_Zrepo_msgr9) rj cache_clearrfr r`ZAPTUpdateProcessConflictErrorraZAPTUpdateInvalidRepoErrorreZUbuntuProErrorAPTUpdateFailed)r_rcrPrrrrun_apt_update_commandos  $ r)sources_list_pathc Cstt}tjdtj|tjddtjddt}| t }tj tj dd}t |}z|z"||||dW5QRXWnTttd d k rtYn2tk r}ztjt|d W5d}~XYnXW5tXW5QRXdS) NzDir::Etc::sourcelistzDir::Etc::sourcepartszN.O.F.O.L.D.E.RzAPT::List-Cleanup0zDir::State::ListslockrErrorrr9)rkrr&r'rVr;r<abspath SourceListread_main_listr rAZfind_dirZFileLockrjrrgetattrr r` SystemErrorrrE)rr sources_listfetch_progressZ lock_filerrPrrrupdate_sources_lists.     &r)packages apt_optionsr_rSc Cs~|dkr g}ztdddg|||d}WnNtjk rHtYn2tjk rx}ztj|jdW5d}~XYnX|S)NrZinstall --assume-yesrr)rfr r`ZAPTInstallProcessConflictErrorraZAPTInstallInvalidRepoErrorre)rrr_rcrPrrrrun_apt_install_commands    r)originrSc Cs\t}tt@}|jD]2}|j}|r|jD]\}}|j|kr*||q*qW5QRXt|Sr3) rVrkrrr file_listrrYlist)rresultrrinstalled_versionfile_rrr get_installed_packages_by_origins   rc Cs|dkr gSt}tt`}t|}|jD]H}|j}|r,||}|r,||kr,|jD]\}}|j |krV| |qVq,W5QRXt |Sr3) rVrkrr&rrrrrrrYr) rrrrrrrrrrrr;get_installed_packages_with_uninstalled_candidate_in_origins      r)rexclude_originrScs6g}|jD]&}fdd|jD}|r ||q |S)Ncs(g|] \}}|jdkr|jkr|qS)Znow)Z componentr)rrrrrrr s z3get_remote_versions_for_package..)Z version_listrappend)rrZvalid_versionsr"Z valid_originsrrrget_remote_versions_for_packages   r)suitesseriesupdates_enabledrLrScCsRd}|D]D}||krqd}d|kr8|s8td||d}|dj|||d7}q|S)Nr%-updatesz?Not enabling apt suite "%s" because "%s-updates" is not enabledz# zC{maybe_comment}deb {url} {suite} main # deb-src {url} {suite} main ) maybe_commentrUsuite)LOGwarningr@)rrrrLcontentrrrrr_get_list_file_contents( r)rrrrL keyring_fileinclude_deb_srcrSc sZfdd|D}|s0tddd|D}|r8dnd}tj|d|t||d}|S) Ncsg|]}|kr|qSrrrrrrrrr sz-_get_sources_file_content..zPNot enabling service-related -updates suites because "%s-updates" is not enabledcSsg|]}d|kr|qS)rrrrrrr'sz deb-srcr% )rUrZ keyrings_dirrdeb_src)rrDEB822_REPO_FILE_CONTENTr@rA KEYRINGS_DIR) rrrrLrrZappliable_suitesrrrrr_get_sources_file_contents$ r) repo_filenamerL credentialsrrrScCsz|d\}}Wntk r.d}|}YnXtj|tj}|dr\|dd}t |||d}t ddgt j } | D]&} d || krqd | krqd }qqt||||tkrtjt|} tjt|} t| | t||||} nt|||||} t|| dS) zAdd an authenticated apt repo and credentials to the system. @raises: InvalidAPTCredentialsError when the token provided can't access the repo PPA. :Zbearer/NFrhriz a={}-updatesz o=Ubuntu,T)r: ValueErrorrZsecretsZ add_secretrZget_release_inforendswithrQrfrZAPT_POLICY_FAILED splitlinesr@add_apt_auth_conf_entrySERIES_NOT_USING_DEB822r;r<rAr APT_KEYS_DIRrZexport_gpg_keyrr write_file)rrLrrrrMrNrrrir[Zsource_keyring_fileZdestination_keyring_filerrrradd_auth_apt_repo8sR          rc Cst}|d\}}|ds&|d7}tj|r>t|}nd}dj|||t d}d}g} | D]\} |s| } t | dkr| d} | |kr| |d }qd| |kr| |d }| | qd|s| || dtj |d | d d d S)zBAdd or replace an apt auth line in apt's auth.conf file or conf.d.r5rr%z:machine {repo_path} login {login} password {password}{cmt})rOloginrNZcmtFTrTmodeN)!get_apt_auth_file_from_apt_configr:rr;r<r=r load_filer@APT_AUTH_COMMENTrlenrrrA) rLrrN apt_auth_file _protocolrOZ orig_contentZrepo_auth_lineZadded_new_authZ new_linesr[Z split_lineZcurr_line_reporrrrpsB           rcs|d\}}|dr$|dd}t}tj|rt|}dj|dd fdd | D}|sxt |ntj ||d d dS) z+Remove a repo from the shared apt auth filer5rNrzmachine {repo_path}/ login)rOrTcsg|]}|kr|qSrr)rrr[Z auth_prefixrrrsz2remove_repo_from_apt_auth_file..rr) r:rrr;r<r=rrr@rArensure_file_absentr)rLrrOrZapt_authrrrrremove_repo_from_apt_auth_files      r)rrLrrScCsNt||dr&tt|d|rBtjt|}t|t |dS)z>Remove an authenticated apt repo and credentials to the systemz.sourcesrN) rrrrZset_filename_extensionr;r<rArr)rrLrrrrremove_auth_apt_repos    rcCsB|d\}}|dr$|dd}dj||d}t||dS)z.Add an apt preferences file and pin for a PPA.r5rNrz.)r)Z package_listZ pkg_namesrrrr sr) http_proxy https_proxy proxy_scoperScCs|s|rB|rBd}|tjkr d}n|tjkr.d}ttjj|dd}|r|tjkrf|tj|d7}n|tjkr|t j|d7}|r|tjkr|t j|d7}n|tjkr|t j|d7}|dkrt |}|dkrt tn t t|dS)a Writes an apt conf file that configures apt to use the proxies provided as args. If both args are None, then no apt conf file is written. If this function previously wrote a conf file, and was run again with both args as None, the existing file is removed. :param http_proxy: the url of the http proxy apt should use, or None :param https_proxy: the url of the https proxy apt should use, or None :return: None r%z UA-scopedglobal)Zscope)Z proxy_urlN)rrreventinforZSETTING_SERVICE_PROXY_SCOPEr@APT_CONFIG_UA_PROXY_HTTPAPT_CONFIG_GLOBAL_PROXY_HTTPAPT_CONFIG_UA_PROXY_HTTPSAPT_CONFIG_GLOBAL_PROXY_HTTPSAPT_PROXY_CONFIG_HEADERrrAPT_PROXY_CONF_FILEr)rrrmessageZapt_proxy_configrrrsetup_apt_proxysD          rcCs d}tjtrttj}|Sr3)r;r<r=APT_UPDATE_SUCCESS_STAMP_PATHstatst_mtimeZ cache_timerrrget_apt_cache_timeHs  rcCs$t}|dkrdStj|tjjSr3)rdatetimeZ fromtimestamptimezoneZutcrrrrget_apt_cache_datetimeOsr cstjtjtdddtdtd}tfdd|DrBdStttdD]}t |qTtdD]}tj |ddd qldS) Nz**/*T) recursiverrc3s|]}|kVqdSr3r)rrrZexisting_filesrr ^sz._ensure_esm_cache_structure..i)exist_okr) rr;r<rArESM_BASIC_FILE_STRUCTUREallrZensure_folder_absentZ create_filemakedirs)Z desired_filesrZfolderrr r_ensure_esm_cache_structureVs     rc Csts dStddlm}ddlm}ddlm}m }d}d}t }|dkr^||d}| dgD]D}| ddd kr| d d d k}| ddd krj| d d d k}qj||} |r| d|jkr| n| tr||} |r| d|jkr| n| ttx} t} | Gdddt} | }z| || dWn8tk r}ztdt|W5d}~XYnXW5QRXdS)Nr)status)ApplicationStatus)ESMAppsEntitlementESMInfraEntitlementFZservicesr!r%zesm-appsZ availableZnoZyesz esm-infrac@s,eZdZejdddZejdddZdS)z-update_esm_caches..EsmAcquireProgress)itemcSstd|jdS)NzFetched ESM Apt Cache item: {})rdebugr@urirnrrrrdonesz2update_esm_caches..EsmAcquireProgress.donecSstd|jdS)Nz&Failed to fetch ESM Apt Cache item: {})rrr@rrrrrfails z2update_esm_caches..EsmAcquireProgress.failN)rrrr&ZAcquireItemDescrrrrrrEsmAcquireProgresssrz%Failed to fetch the ESM Apt Cache: {})rZis_current_series_ltsrZuaclient.actionsrZ(uaclient.entitlements.entitlement_statusrZuaclient.entitlements.esmrrrreadr(Zapplication_statusZDISABLEDZsetup_local_esm_repoZdisable_local_esm_repoZis_current_series_active_esmrkrr&rrr rrrrr@rE)rurrrrZapps_availableZinfra_availableZcurrent_statusZserviceZappsZinfrarrrrrPrrrupdate_esm_cachesksP        r  package_namesZ error_messagecCs(tdddddgt||ddidd S) a Remove APT packages from the system. Setting DEBIAN_FRONTEND to noninteractive makes sure no prompts will appear during the operation. In this case, --force-confdef will automatically pick the default option when some debconf should appear. In the absence of a default option, --force-confold will automatically choose to keep the old configuration file. rremover$-o Dpkg::Options::="--force-confdef"$-o Dpkg::Options::="--force-confold"DEBIAN_FRONTENDnoninteractiver_Nrfrr!rrrremove_packagess r*cCs(tdddddgt||ddidd S) a Purge APT packages from the system - remove everything. Setting DEBIAN_FRONTEND to noninteractive makes sure no prompts will appear during the operation. In this case, --force-confdef will automatically pick the default option when some debconf should appear. In the absence of a default option, --force-confold will automatically choose to keep the old configuration file. rpurgerr$r%r&r'r(Nr)r!rrrpurge_packagess r,r"cCst|dddgddiddS)a6 Install packages, allowing downgrades. The --allow downgrades flag is needed because sometimes we need to reinstall the packages to a lower version (passed in the package_name string, as package=version). Setting DEBIAN_FRONTEND to noninteractive makes sure no prompts will appear during the operation. In this case, --force-confdef will automatically pick the default option when some debconf should appear. In the absence of a default option, --force-confold will automatically choose to keep the old configuration file. z--allow-downgradesr$r%r&r')rr_N)rr-rrrreinstall_packagessr.cCs*tjD]}tj|q ttjSr3)r&r'rwr}Z init_configrrrr_get_apt_configsr/c Cs"tt}||}W5QRX|Sr3)rkr/r)Zbase_keyapt_cfgZ apt_cfg_keysrrrget_apt_config_keyss r1) cfg_namesrSc CsNi}tt8}|D],}||}t|s6||p4d}|||<qW5QRX|S)z Get all APT configuration values for the given config names. If one of the config names is not present on the APT config, that config name will have a value of None N)rkr/r(rEZ value_list)r2Z apt_cfg_dictr0Zcfg_nameZ cfg_valuerrrget_apt_config_values s  r3cCsd}d}tj|r|S|S)Nz/etc/apt/sources.listz&/etc/apt/sources.list.d/ubuntu.sources)r;r<r=)Zold_sources_pathZnew_sources_pathrrrget_system_sources_file s  r4)NN)NN)F)N)NN)N)F)N)vrpr enumrZloggingr;rHrKr> functoolsrrtypingrrrrrr r r&Zapt.progress.baser Zuaclientr r rrrrrZuaclient.defaultsrZuaclient.files.state_filesrrBrrrrrrrrrrrZAPT_METHOD_HTTPS_FILEZCA_CERTIFICATES_FILErrrrr<rArrCZget_event_loggerrZ getLoggerZreplace_top_level_logger_namerruniqueEnumrrEr r/r4rQr\rfrjrkrrrboolrrZretryr`rrrZPackagerrZVersionrrrrrrrrrrrrrrrrfloatrr rr r*r,r.r/r1r3r4rrrrs^$ $         * ( *  -  '      ! 8,   8E