a ©2Ñh­Øã@s\dZddlmZddlmZddlmZddlmZddlZddlZddlZ ddl m Z ddl m Z dd lmZmZmZdd lmZdd lmZdd lmZzdd lmZWneyÊdd lmZYn0ddlZddlZddl ZddlZddlZddl Zddl!Zddl"Zddl#Zddl$Zddl%Zddl&Zddl'Zzddl(ZdZ)Wney\dZ)Yn0ddl*Zddl+Zddl,Zddl-Zddl.Zddl/Zddl0Zddl1Zddl2Zddl3Zddl4Zddl5ZddlZddl6Zddl7Z7ddl8Z8ddl9Z9ddl:Z:ddl;Z;ddlZ>ddl?Z?ddl@Z@ddlAZAddlBZBddlCZCe; Dd¡ZEGdd„deFƒZGdd„ZHdS)z Supplies the Base class. é)Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsN)Údeepcopy)Ú CompsQuery)Ú_ÚP_Úucd)Ú _parse_specs)Ú SwdbInterface)Úmisc)ÚSequenceTFÚdnfc@seZdZdédd„Zdd„Zdd„Zdd „Zd d „Zd d „Ze dd„ƒZ dd„Z dêdd„Z dd„Z edd„ƒZedd„ƒZedd„ƒZejdd„ƒZeej d¡dd „ƒƒZed!d"„ƒZed#d$„ƒZed%d&„ƒZejd'd&„ƒZd(d)„Zdëd+d,„Zd-d.„Zd/d0„Zd1d2„Zdìd3d4„Z díd6d7„Z!dîd8d9„Z"d:d;„Z#dd?„Z%dðd@dA„Z&dBdC„Z'e(j)e(j*e(j+e(j,e(j-e(j.e(j/dDœZ0e1e(dEƒrˆe(j2e0dF<dGe(j3e(j4BiZ5edHdI„ƒZ6edJdK„ƒZ7e7jdLdK„ƒZ7dñdMdN„Z8dOdP„Z9edQdR„dSdR„dTdR„dUdVZ:dWdX„Z;dYdZ„Zd_d`„Z?dadb„Z@dòdcdd„ZAdódedf„ZBdgdh„ZCdidj„ZDdkdl„ZEdôdmdn„ZFdõdodp„ZGdödqdr„ZHd÷dsdt„ZIdudv„ZJdwdx„ZKdydz„ZLdød|d}„ZMdùd~d„ZNd€d„ZOd‚dƒ„ZPd„d…„ZQd†d‡„ZRdúdˆd‰„ZSdŠd‹„ZTdûdŒd„ZUdüdŽd„ZVdd‘„ZWd’d“„ZXd”d•„ZYd–d—„ZZd˜d™„Z[dšd›„Z\dýdœd„Z]dždŸ„Z^d d¡„Z_d¢d£„Z`dþd¤d¥„Zadÿd¦d§„Zbdd¨d©„Zcddªd«„Zddd¬d­„Zed®d¯„Zfd°d±„Zgd²d³„Zhdd´dµ„Zidd¶d·„Zjdd¸d¹„Zkddºd»„Zldd¼d½„Zmdd¾d¿„Znd dÀdÁ„ZodÂdÄZpd dÄdÅ„ZqdÆdÇ„Zrd dÈdÉ„ZsdÊdË„Ztd dÌdÍ„Zud dÎdÏ„ZvddÐdÑ„ZwdÒdÓ„ZxddÕdÖ„Zydd×dØ„ZzdÙdÚ„Z{dÛdÜ„Z|dÝdÞ„Z}dßdà„Z~dádâ„Zdãdä„Z€dådæ„Zdçdè„Z‚dS(ÚBaseNcCsØd|_|p| ¡|_d|_d|_d|_d|_d|_d|_t j   ¡|_ d|_ tƒ|_tƒ|_t j ¡|_t j ¡|_t j ¡|_ttjgƒ|_t j ¡|_d|_ d|_!d|_"g|_#i|_$d|_%tƒ|_&t'j(j)|_*d|_+dS)NF),Ú_closedÚ_setup_default_confÚ_confÚ_goalÚ_repo_persistorÚ_sackÚ _transactionÚ_priv_tsÚ_compsrÚcompsÚTransactionBunchÚ _comps_transÚ_historyÚsetÚ _tempfilesÚ_trans_tempfilesÚcallbackZDepsolveÚ _ds_callbackÚloggingZLoggingÚ_loggingÚrepodictÚRepoDictÚ_reposÚrpmZRPMPROB_FILTER_OLDPACKAGEÚ_rpm_probfilterZpluginZPluginsÚ_pluginsÚ_trans_successÚ_trans_install_setÚ_tempfile_persistorÚ_update_security_filtersÚ_update_security_optionsÚ_allow_erasingÚ_repo_set_imported_gpg_keysÚlibdnfÚ transactionZTransactionPersistence_UNKNOWNÚ _persistenceÚoutput)ÚselfÚconf©r8ú,/usr/lib/python3.9/site-packages/dnf/base.pyÚ__init__^s4      z Base.__init__cCs|S©Nr8©r6r8r8r9Ú __enter__|szBase.__enter__cGs | ¡dSr;©Úclose)r6Zexc_argsr8r8r9Ú__exit__sz Base.__exit__cCs | ¡dSr;r>r<r8r8r9Ú__del__‚sz Base.__del__cCs.|jr|j |¡n|jjrn |j |¡dSr;)rr Úupdater7Údestdirr)r6Úfilesr8r8r9Ú_add_tempfiles…s zBase._add_tempfilesc Cs | ¡td|jdd}|jr&d|d<z|jj|jfddi|¤ŽWnVtjyš}z«óz0Base._setup_modular_excludes..F)Z update_onlyZ debugsolverÚmodule_obsoletesr)ÚreposÚ iter_enabledÚsackZfilter_modulesÚ_moduleContainerr7r^Zmodule_platform_idÚ debug_solverrgrPrQrrVÚErrorr rRÚwarningÚmoduleÚ module_baseZformat_modular_solver_errors)r6Z hot_fix_reposZ solver_errorsrZr8r8r9Ú_setup_modular_excludesªs ý &ÿzBase._setup_modular_excludesFc CsŠt|jjƒ}d|vr$tr$| ¡dSg}g}|s0|j ¡D]ò}|j|vrLq.) rr7Ú cacheonlyrhriZexpired_to_addrBÚsaver-)r6Zexpiredr8r8r9Ú_store_persistent_dataôs  zBase._store_persistent_datacCs|jdur|jdd|jS)NT)Ú arch_filter)rÚ read_compsr<r8r8r9rþs  z Base.compscCs|jSr;)rr<r8r8r9r7sz Base.confcCs|jSr;©r'r<r8r8r9rh sz Base.reposcCs d|_dSr;r“r<r8r8r9rhsZ _priv_rpmconncCstjj |jj¡Sr;)rr(Z connectionZ RpmConnectionr7r^r<r8r8r9Ú_rpmconnsz Base._rpmconncCs|jSr;)rr<r8r8r9rjsz Base.sackcCsP|jdurtj d¡‚|jjdurHtj d|jj |jj d|jj ¡|j_|jjS)NzSack was not initializedFÚarch) rjrrVrmrkr2roZModulePackageContainerr7r^r]Ú persistdirr<r8r8r9rks   ÿzBase._moduleContainercCs|jSr;)rr<r8r8r9r3'szBase.transactioncCs|jrtdƒ‚||_dS)Nztransaction already set)rÚ ValueError©r6Úvaluer8r8r9r3,scCstj |jj¡|_dSr;)rÚ persistorZ RepoPersistorr7Úcachedirrr<r8r8r9Ú_activate_persistor3szBase._activate_persistorr8cCs,|jjr|j |j||¡|j ||¡dS)z&Load plugins and run their __init__().N)r7Zpluginsr*Ú_loadZ _run_init)r6Z disabled_globZenable_pluginsÚclir8r8r9Ú init_plugins6szBase.init_pluginscCs|j ¡dS)z#Run plugins pre_configure() method.N)r*Z_run_pre_configr<r8r8r9Úpre_configure_plugins=szBase.pre_configure_pluginscCs|j ¡dS)zRun plugins configure() method.N)r*Z _run_configr<r8r8r9Úconfigure_pluginsBszBase.configure_pluginscCs|j ¡dS)zRun plugins unload() method.N)r*Z_unloadr<r8r8r9Úunload_pluginsGszBase.unload_pluginsc CsÖ|jj}|jdur| ¡|j}|rÌtj ¡rDtdƒ}t  |¡dStj  ¡durhtdƒ}t  |¡dS|dkr†tdƒ}t  |¡dS|  ¡}|dur°||kr°t  tdƒ¡dS|j   ¡D]}|j d¡qº|j  ¡søt  tdƒ d  |jj¡¡¡dS|j  ¡D]¦}| ¡\}} | dur0t  td ƒ|j¡nv|r@| dkr^t td ƒ|j¡|j ¡nH|r’| |kr’td ƒ}t ||j| ¡|j ¡nt td ƒ|j| ¡q|r¶d|_|jdddt  tdƒ¡dS)NzCMetadata timer caching disabled when running on metered connection.Fz:Metadata timer caching disabled when running on a battery.rz Metadata timer caching disabled.z"Metadata cache refreshed recently.éz*There are no enabled repositories in "{}".z", "z4%s: will never be expired and will not be refreshed.z&%s: has expired and will be refreshed.zC%s: metadata will expire after %d seconds and will be refreshed nowz!%s: will expire after %d seconds.T)Úload_system_repoÚload_available_reposzMetadata cache created.)r7Zmetadata_timer_syncrrœrÚutilZon_metered_connectionrrRÚinfoZ on_ac_powerÚsince_last_makecacherhÚvaluesrOZsetMaxMirrorTriesÚ _any_enabledrTÚjoinZreposdirriZ_metadata_expire_inrUrSÚexpireZreset_last_makecacheÚ fill_sack) r6ÚtimerZperiodršÚmsgr¨rXrˆZis_cacheZ expires_inr8r8r9Ú update_cacheLs^        ÿ    ÿzBase.update_cacheTc Csbtj d¡}|jdddtj |¡|_tj |j j |j j ¡}|¸|dur~z|jj ddWnt y||dkrx‚Yn0|ràg}d}t ¡}|j jr¨tjj ¡|j ¡D]È}z`| |¡|j ¡|krÚ|j ¡}|j ¡|krò|j ¡}t tdƒ|jtj |j ¡¡¡Wq²tj j!yx} zD|j "¡|j#durD‚t $d | ¡| %|j¡| &¡WYd } ~ q²d } ~ 00q²|r˜t $td ƒd  '|¡¡|j (¡rî|dkrî|dkrît )td ƒt*j+t,|ƒdtj |¡¡n|j -¡ &¡Wd ƒn1s0Y|j } |j .| j/| j0| j1¡| 2¡|ƒtj3 4|j¡|_5| j6|j5_6|j7 8¡|jS)z'Prepare the Sack and the Goal objects. ú sack setupT©rjÚgoalF©rHÚautorú%s: using metadata from %s.z Error: %sNúIgnoring repositories: %sú, z-Last metadata expiration check: %s ago on %s.)Zseconds)9rr#ÚTimerÚresetrjÚ _build_sackrÚlockÚbuild_metadata_lockr7r›Ú exit_on_lockr¤ÚIOErrorÚtimeÚgpgkey_dns_verificationÚdnssecÚRpmImportedKeysÚcheck_imported_keys_validityrhrir[rOZ getTimestampZgetAgerRrSrrUr¦Únormalize_timeÚgetMaxTimestamprVrWr¬Úskip_if_unavailablernr„Údisabler«rªr§ÚdatetimeZ timedeltaÚintrrÚ _configureÚinstallonlypkgsÚinstallonly_limitÚallow_vendor_changerŒr³ÚGoalrÚprotect_running_kernelr*Úrun_sack) r6r¤r¥r®r¼Ú error_reposZmtsZagerˆrZr7r8r8r9r­„sn      ÿÿ     ÿ   þ.  zBase.fill_sackc Cs"tj d¡}|jdddtj |¡|_tj |j j |j j ¡}|x|dur~z|jj ddWnt y||dkrx‚Yn0g}|j jr–tjj ¡|j ¡D]ð}zj|jjdddtd|jdd}|jrÔd|d <|jj|jfi|¤Žt td ƒ|jtj |j  ¡¡¡Wq t!t"j#fyŽ}z`|j$durNtj% &td ƒ '|j|¡¡‚nt td ƒ '|j|¡¡| (|j¡| )¡WYd }~q d }~00q |r®t *td ƒd +|¡¡Wd ƒn1sÄ0Y|j }|j ,|j-|j.|j/¡| 0¡|ƒtj1 2|j¡|_3|j4|j3_4|j5 6¡|jS)a¥ Prepare Sack and Goal objects and also load all enabled repositories from cache only, it doesn't download anything and it doesn't check if metadata are expired. If there is not enough metadata present (repond.xml or both primary.xml and solv file are missing) given repo is either skipped or it throws a RepoError exception depending on skip_if_unavailable configuration. r±Tr²Fr´rµ)Z throwExceptZ ignoreMissingrFrGr¶rINr·r¸)7rr#r¹rºrjr»rr¼r½r7r›r¾r¤r¿rÁrÂrÃrÄrhrirOZ loadCacherKrLrMrNrRrSrrUr¦rÅrÆÚ RuntimeErrorrPrQrÇrVrWrTr„rÈrnr«rËrÌrÍrÎrŒr³rÏrrÐr*rÑ) r6r¤r®r¼rÒrXrYrZr7r8r8r9Úfill_sack_from_repos_in_cache¿sb   þÿÿ ÿ  ÿ$  z"Base.fill_sack_from_repos_in_cachecCsÌtj |jj¡|_|jjsl| |j¡|j r\|j   |j  ¡¡|j  ¡|jrl| |j ¡n|jj  |j ¡|jjržt tdƒ¡t tdƒdjtjjd¡|jdur²|j ¡| ¡| ¡d|_ dS)NzRThe downloaded packages were saved in cache until the next successful transaction.z1You can remove cached packages by executing '%s'.z{prog} clean packages©ÚprogF)rršZTempfilePersistorr7r›r-Z keepcacheÚ_clean_packagesrr+r rBZget_saved_tempfilesrtr,Ztempfiles_to_addrRr§rrTr¦Z MAIN_PROGrÚhistoryr?rÚ _closeRpmDBr<r8r8r9Ú_finalize_baseýs2ÿ ÿ ÿ ÿ  zBase._finalize_basecCsB|jr dSt tjjd¡d|_| ¡|jddddd|_dS)ztClose all potential handles and clean cache. Typically the handles are to data sources and sinks. Nz Cleaning up.T)rjrhr³) rrRÚlogrr#ÚDDEBUGrÚrºr*r<r8r8r9r?sz Base.closec Csdtjj |j|¡}|D]H}z|j |¡Wqtjjy\}zt  |¡WYd}~qd}~00qdS)z?Read repositories from the main conf file and from .repo files.N) rr7ÚreadZ RepoReaderrhÚaddrVZ ConfigErrorrRrn)r6ZoptsÚreaderrXrZr8r8r9Úread_all_repos*s zBase.read_all_reposcCs |r d|_|rtj ¡|_|r†d|_|jdurJtj |j¡|_|jj |j_ |jr`|j r`|j   ¡|j durt|j  ¡tj ¡|_d|_g|_|rœ|rœt ¡dS)z1Make the Base object forget about various things.N)rrr%r&r'rr³rÏr7rÐrkZrollbackrrØr?rrrrr.ÚgcZcollect)r6rjrhr³r8r8r9rº5s$        'z Base.resetcCs|`dS)z6Closes down the instances of rpmdb that could be open.N)Ú_tsr<r8r8r9rÙrszBase._closeRpmDB)Z noscriptsZ notriggersZnodocsÚtestZjustdbZ nocontextsÚnocryptoÚRPMTRANS_FLAG_NOCAPSZnocapsräcCs|jSr;)rr<r8r8r9r³„sz Base.goalcCsà|jdur|jStjj |jj¡|_|j d¡|jjD]V}|j   |¡}|durbt   t dƒ|¡q8|j |¡|j  |¡}|dur8|j |¡q8|jjs¦|j tj¡|jjr¼|j tj¡t tj|jd¡}|j |¡|jS)zMSet up the RPM transaction set that will be used for all the work.Nrz!Invalid tsflag in config file: %s)rrr(r3ZTransactionWrapperr7r^ÚsetFlagsZtsflagsÚ_TS_FLAGS_TO_RPMÚgetrRÚcriticalrZ addTsFlagÚ_TS_VSFLAGS_TO_RPMÚ pushVSFlagsZdiskspacecheckr)rÞZRPMPROB_FILTER_DISKSPACEZ ignorearchZRPMPROB_FILTER_IGNOREARCHÚ functoolsÚreduceÚoperatorÚor_Z setProbFilter)r6ÚflagZrpm_flagZvs_flagZ probfilterr8r8r9râˆs, ÿ      zBase._tscCs&|jdurdS|j ¡|`d|_dS)z"Releases the RPM transaction set. N)rr?r<r8r8r9râ¥s   c Csˆtj d¡}tj ¡|_t tjjd¡|j   ¡D](}|j s@q2|j sHq2|j  ¡}|sXq2t tjjd|j¡tj tj |¡d¡}tj |d¡}d}z.tj |¡s°tj|ddtj||d d Wn8ttjjfyút ¡}|j}tj||d d Yn0z|j |¡WnBtjjyN}z$t d ƒ} t !| |j|¡WYd}~n d}~00|r2| "¡q2|r||jj# $|j%j&d g¡|ƒ|jS)z6Create the groups object to access the comps metadata.z loading compszGetting group metadataz%Adding group file from repository: %sÚgenz groups.xmlNií)ÚmodeT)ÚdestZcheck_timestampsFz1Failed to add groups file for repository: %s - %sÚbasearch)'rr#r¹rZCompsrrRrÛrÜrhriZ enablegroupsrrOZ getCompsFnrUÚosÚpathr«ÚdirnameÚexistsÚmakedirsr Ú decompressÚPermissionErrorrVZ MiscErrorÚtempfileZNamedTemporaryFileÚnameZ_add_from_xml_filenameÚ CompsErrorrrér?Z_ir‘rr]) r6r‘r®rXZcomps_fnZgen_dirZgen_fileZ temp_filerZr¯r8r8r9r’®sL    ÿ &  ÿzBase.read_compscCs*|jdur$|jj}t|jj|d|_|jS)zeauto create the history object that to access/append the transaction history information. N)r\)rr7r\r r–)r6r\r8r8r9Ú _getHistoryÙs zBase._getHistorycCs| ¡Sr;)rÿr<r8r8r9Úárfz Base.cCs t|d|ƒS©Nr©Úsetattrr˜r8r8r9râsÿcCs t|ddƒSrrr<r8r8r9rärfzDNF SWDB Interface Object)ÚfgetÚfsetÚfdelÚdoccs:ˆjj}t| ¡ƒ‰ˆ ¡}| ¡| ¡ ¡}| ¡D]H‰| ˆ¡}|d}ˆj   |d¡ˆj   ˆd¡|  ˆ||dd…¡q8|  ¡D]t‰ˆj   ˆd¡| ˆ¡}t ˆƒ}g}|D](} t | ƒ|krÔ| d| ¡q¶| | ¡q¶|d} | ˆ| |dd…¡qŠ| ¡D]¶‰ˆj   ˆd¡| ˆ¡}‡‡fdd„|Dƒ}| ˆ¡} ˆ|vrf|jˆjd rf| ˆ¡} |D](} | | ¡} tj | | ¡d krj| } qj| ˆ|| ¡‡fd d „}tj ||¡q| ¡D]ȉ| ˆ¡}d}|D]}|jˆjkrÞ|}qþqÞ|dur| d¡}n | |¡‡‡fd d„|Dƒ}‡fdd „}tj ||¡ˆ|vrd| ˆ|¡n| ˆ||¡ˆj   |d¡ˆj   ˆd¡qÈ|  ¡}|r6ˆj!j"t#j$d ¡}|j%|d| ¡|D]h‰|jˆjˆj&d}|r|d}| |¡ˆj '|| |¡¡ˆj   ˆd¡| ˆ¡} | (ˆ| ¡qÌ|S)NrÚddÚdr£rˆrdcs$g|]}|ˆvs|jˆjkr|‘qSr8©rýrb©Ú all_obsoletedÚpkgr8r9rerfz*Base._goal2transaction..r éÿÿÿÿcsˆj |d¡S©NZod©r"Ú pkg_added©r r<r8r9rrfz(Base._goal2transaction..cs$g|]}|ˆvs|jˆjkr|‘qSr8r rbr r8r9re+rfcsˆj |d¡Srrrr<r8r9r-rfZudÚu©Úflags)Zpkg__neq©rýr•rZ))rØr(rZlist_obsoletedÚ_get_installonly_queryr…Ú installedÚlist_downgradesZobsoleted_by_packager"rZ add_downgradeÚlist_reinstallsÚstrÚinsertr„Z add_reinstallÚ list_installsÚ get_reasonÚfilterrýr2r3ZTransactionItemReasonCompareZ add_installrr¦ZmapallÚ list_upgradesÚpopÚremoveZ add_upgradeZ list_erasuresrjr~rPÚIGNORE_EXCLUDESrr•Ú set_reasonZ add_erase)r6r³ÚtsZinstallonly_queryZinstallonly_query_installedZobsZ downgradedZ nevra_pkgÚ obsoletesZobs_pkgZ reinstalledÚreasonZobsoleteZreason_obsoleteÚcbZupgradedrdZerasuresZremaining_installed_queryZtmp_remaining_installed_queryZ remainingr8)r r r6r9Ú_goal2transactionçsŠ                         zBase._goal2transactioncCs`| ¡}| ¡}| ¡ ¡}g}g}|D].}||vrH| ||d¡q(| ||¡q(||fS)aJ See what packages in the query match packages (also in older versions, but always same architecture) that are already installed. Unlike in case of _sltr_matches_installed(), it is practical here to know even the packages in the original query that can still be installed. r)rÚ_na_dictÚ availabler„)r6ÚqÚinstZ inst_per_archZavail_per_archZavail_lZinst_lZnar8r8r9Ú_query_matches_installedEs zBase._query_matches_installedcCs"|j ¡ ¡j| ¡d}t|ƒS)zƒ See if sltr matches a patches that is (in older version or different architecture perhaps) already installed. r)rjr~rrÚmatchesÚlist)r6Úsltrr-r8r8r9Ú_sltr_matches_installedYszBase._sltr_matches_installedcs‡fdd„ˆj ¡ ¡DƒS)z5Get iterator over the packages installed by the user.c3s|]}ˆj |¡r|VqdSr;)rØZuser_installed©rcr r<r8r9Ú bs ÿz*Base.iter_userinstalled..)rjr~rr<r8r<r9Úiter_userinstalled`szBase.iter_userinstalledcCs0|j||jj|jj d}|jjr,| d¡|S)N)Úallow_uninstallÚ force_bestZignore_weak_depsz./debugdata/rpms)Úrunr7ÚbestZinstall_weak_depsrlZwrite_debugdata)r6r³Ú allow_erasingÚretr8r8r9Ú_run_hawkey_goalesþ zBase._run_hawkey_goalcCsb|j ¡|jjr|j ¡|jjD]8}tj |¡}|j|j dddd}|  ¡}|j  |¡q$dS)z› Add exclude_from_weak from configuration and autodetect unmet weak deps exclude them from candidates to satisfy weak dependencies TFruN) rZreset_exclude_from_weakr7Zexclude_from_weak_autodetectZexclude_from_weakrr€rrƒrjr+Zadd_exclude_from_weak)r6Z weak_excluder‰r~r8r8r9Ú_set_excludes_from_weak_to_goalms    z$Base._set_excludes_from_weak_to_goalc Cs|d}| ¡tj d¡}|j ¡|j}| ¡rJ| |j   ¡  ¡|j ¡n|j jsd| ¡}| |¡| |j   ¡j|j jd¡| ¡| ||¡sÆ|j jdkr¨| ¡tj | ¡¡}tj |¡}n | |¡|_|j ¡|ƒ|jduoøt |jƒdk}|r|j !¡}|rtj "|¡}|dur*|‚|j# $¡|j %¡}||j &¡7}||j '¡7}||j (¡7}|j  )|j*|¡|S)zBuild the transaction set.NZdepsolver ér)+Ú_finalize_comps_transrr#r¹r"ÚstartrZ req_has_eraseZpush_userinstalledrjr~rrØr7Zupgrade_group_objects_upgradeÚ_build_comps_solverZ'_exclude_packages_from_installed_groupsZ add_protectedrZprotected_packagesr=r<Ú debuglevelZ log_decisionsr¦Ú_format_resolve_problemsÚ problem_rulesrVZ DepsolveErrorr)rÚendr}Z_rpm_limitationsrmr*Z run_resolvedrr rrZset_modules_enabled_by_pkgsetrk) r6r:Úexcr®r³Úsolverr¯Zgot_transactionZnew_pkgsr8r8r9Úresolve|sP  ÿ ÿ      ÿ     z Base.resolvecCsrt|tƒs|g}tjj ¡gt|ƒ}|jsú|j  ¡|j  ¡|j rÜ|j j sV|j j rÜd}t|dƒrx|jrxd |j¡}nt|dƒr”|jr”d |j¡}|j ¡}|dur²|j ¡}n|j}|jj|gg||jd|j |¡|j ¡|j ¡d|_dSd}t t dƒ¡tj! "|j#j$|j#j%¡}|ê|j &|j¡| '¡}|rzt dƒ}t (|¡|D]}t (|¡q\tj) *|¡‚t t dƒ¡tj+ ,d ¡} t t d ƒ¡|j -¡|j .¡tjjj/|dd } |j 0| ¡} t1| ƒd krV|  2¡D]}t 3t d ƒ 4|¡¡qêt dƒd} | D]} | dt5| ƒ7} q| 6| ¡}|rJ| d|7} tj) 7| ¡‚~ t t dƒ¡|j 8t9j:¡r†WdƒdS| ƒ|j  ¡|j  ¡tj+ ,d¡} tjjj/||d}|j#j;dkrà|j|d}Wdƒn1s0Y| ƒ|j ?|j¡|j ¡dd„}tj@ A||j|¡D]}t B|¡q\|S)NÚargsú Úcmds)ÚcmdlineÚ persistenceTzRunning transaction checkz%Error: transaction check vs depsolve:zTransaction check succeeded.ztransaction testzRunning transaction test)rãrúRPM: {}zTransaction test error:Ú z %s zTransaction test succeeded.r3)ÚdisplayséFzRunning transaction)r(cSs(g}|D]}| d |t|ƒ¡¡q|S)Nz{}: {})r„rTr)ÚactionZtsisÚmsgsÚtsir8r8r9Ú _pto_callbacksz*Base.do_transaction.._pto_callback)CÚ isinstancerrZyumZrpmtransZLoggingTransactionDisplayr0r3rkrZupdateFailSafeDatarÚgroupÚenvÚhasattrrIr«rKrØÚlastrâÚdbCookieÚend_rpmdb_versionÚbegr4rEr*Zrun_pre_transactionZrun_transactionr+rRr§rr¼Zbuild_rpmdb_lockr7r–r¾Z_populate_rpm_tsÚ_run_rpm_checkÚerrorrVZTransactionCheckErrorr#r¹ÚorderZcleanZRPMTransactionrãr}ÚmessagesrérTr Ú_trans_error_summaryrmÚ isTsFlagSetr(ÚRPMTRANS_FLAG_TESTrBrPr5Ú_run_transactionZunload_removed_pluginsr¦Z_post_transaction_outputrS)r6ZdisplayrLÚoldZ rpmdb_versionÚtidr¼rSr¯r®ZtestcbZtserrorsÚ errstringZdescrÚsummaryr(Zdisplay_rUr8r8r9Údo_transaction·s˜ ÿ         ÿ                 , zBase.do_transactioncCsôd}t d¡}i}| |¡D]t}| d¡dkr.rNzCould not run transaction.zTransaction couldn't start:)Z ts_all_fnZ ts_done_fnz$Failed to remove transaction file %s)9rur0r7Zhistory_record_packagesrjr~rrr8râr[rØrZr\rRrSrrTrr¦ZMAIN_PROG_UPPERrYrIr«rKrvr]r4Z reset_nicerõÚnicerÛr#rÜr!Z_sync_rpm_trans_with_swdbrr}rarérVrmr rcr(rdrEÚgetattrr Úunlink_fr¿ÚOSErrorÚboolÚ install_setr,Ú_verify_transactionZverify_tsi_package)r6r(rgZusing_pkgs_patsÚinstalled_queryZ using_pkgsÚrpmdbvZlastdbvrLrvZoniceÚerrorsZfailedr¯rZrdÚfnr8r8r9reIs„    ÿ ÿ           zBase._run_transactioncsÞdd„|jDƒ}t|ƒ‰‡‡fdd„}tj d¡}d}tj |¡}| ¡ ¡}t dd„|Dƒƒ}|j j D]8} |   ¡} |   ¡D]"} |  ¡|vr||  d¡|  ¡q|qh|D]} || j|ƒ}q¦|j ¡} |j  | ¡|ƒd|_dS) NcSsg|]}|jtjjkr|‘qSr8)rRr2r3Z#TransactionItemAction_REASON_CHANGE©rcrTr8r8r9re¨sÿz,Base._verify_transaction..cs |d7}ˆdurˆ||ˆƒ|S©Nr£r8)r Úcount©ÚtotalÚ verify_pkg_cbr8r9Údisplay_banner­s z0Base._verify_transaction..display_bannerzverify transactionrcSsg|] }|j‘qSr8r rbr8r8r9reºrfT)r3r}rr#r¹rjÚ rpmdb_sackr~rrrØrWZgetCompsGroupItemZ getPackagesÚgetNameZ setInstalledrr râr[rEr+)r6rˆZtransaction_itemsr‰r®r…rŠr,ÚnamesZtiÚgrrrTr€r8r†r9r~§s,ÿ          zBase._verify_transactioncs|tj |jj|jj¡}|Æt ¡}tdd„|Dƒƒ}tdd„|Dƒƒ} ˆj j j dkrnˆj t|ƒ|| dnˆ  t|ƒ|¡tj   |||¡‰ˆ ¡r¦tj ˆ ¡¡‚t‡fdd„|Dƒƒ} tj  d|ˆj¡} |jj} | d k} ˆjr²| sô| d kr²| d kr| d 8} td ƒ}t |¡d d„ˆjDƒ}‡fd d„|Dƒ}tdd„|Dƒƒ}ˆ  t|ƒ|¡tj   |||¡‰ˆ ¡r†tj ˆ ¡¡‚| t‡fdd„|Dƒƒ7} tj  | |i¡} qÞˆjrÔtjj ˆj¡}t |¡Wdƒn1sê0Y|dur|| |ƒ| \}}||krx||kr>tdƒ}d||d}n"||kr`tdƒ}d||d}t ||d|d|¡dS)Ncss|] }|jVqdSr;©Z download_size©rcZploadr8r8r9r4Õrfz1Base._download_remote_payloads..cSsg|]}t|tjjƒr|‘qSr8)rVrÚdrpmZ DeltaPayload)rcZpayloadr8r8r9re×rfz2Base._download_remote_payloads..é)Z total_drpmsc3s|]}ˆ |¡VqdSr;©Z_bandwidth_usedr©rr8r9r4âsÿ)rrrr£z,Some packages were not downloaded. Retrying.cSsg|]}|‘qSr8r8r3r8r8r9reðrfcs g|]}tj |ˆtjj¡‘qSr8)rrXÚ _pkg2payloadÚ RPMPayloadr3)Úprogressr8r9reòsÿcss|] }|jVqdSr;rŽrr8r8r9r4ôsÿc3s|]}ˆ |¡VqdSr;r’rr“r8r9r4ýrfz?Delta RPMs reduced %.1f MB of updates to %.1f MB (%.1f%% saved)édzIFailed Delta RPMs increased %.1f MB of updates to %.1f MB (%.1f%% wasted)i)rr¼Zbuild_download_lockr7r›r¾rÀÚsumr}r@Ú__code__Ú co_argcountrXZ_download_payloadsZ_irrecoverablerVZ DownloadErrorZ_update_savingZ _recoverableÚretriesrrRr§Z errmap2str)r6Úpayloadsrr–Úcallback_totalZ fail_fastr¼Z beg_downloadZest_remote_sizeZ total_drpmZ remote_sizeZsavingr›Zforeverr¯Zremaining_pkgsÚrealZfullÚpercentr8)rr–r9Ú_download_remote_payloadsÑst ÿ ÿ ÿ   ÿÿÿ ÿÿ*     zBase._download_remote_payloadsc sÜ| |¡\}}|rzˆdur$tj ¡‰tj |j ¡ ¡ˆ|j j ¡‰|  dd„|Dƒ¡‡‡fdd„|Dƒ}|  |ˆˆ|¡|j j rØ|D]P}|jr¬tj | ¡|j d¡¡}ntj |jj|j d¡¡}t ||j j ¡q†dS)aDownload the packages specified by the given list of packages. `pkglist` is a list of packages to download, `progress` is an optional DownloadProgress instance, `callback_total` an optional callback to output messages about the download operation. NcSsg|] }| ¡‘qSr8)ÚlocalPkgr3r8r8r9re#rfz*Base.download_packages..cs$g|]}tj |ˆˆjtjj¡‘qSr8)rrXr”Z delta_factoryr•r3©rr–r8r9re$sþÿú/)Ú_select_remote_pkgsrr!ZNullDownloadProgressrZ DeltaInforjr~rr7Zdeltarpm_percentagerEr rCZbaseurlrõrör«Zget_local_baseurlÚlocationÚlstriprXZpkgdirÚshutilÚcopy) r6Zpkglistr–rÚ remote_pkgsZ local_pkgsrœr r¥r8r¢r9Údownload_packagess(  ÿ þ  ÿzBase.download_packagesc Csæg}|s |S|j ¡r&tj tdƒ¡‚g}|D]†}tj |¡sdd|vrdtj   ||j |¡}|  |g¡z|  |j |¡¡Wq.ty²}z t |¡|  |¡WYd}~q.d}~00q.|jdd|râ|râttdƒ d |¡¡ƒ‚|S)NzACannot add local packages, because transaction job already existsz://T)r‡zCould not open: {}rJ)rZ req_lengthrrVrmrrõrörør¦Z_urlopen_progressr7rEr„rjZadd_cmdline_packager¿rRrnrŒrTr«)r6Ú path_listÚstrictr–ÚpkgsZ pkgs_errorrörZr8r8r9Úadd_remote_rpms2s* ÿ  " zBase.add_remote_rpmsc Cs|jr|jj}d}n|j|j}|j}|j }|r|jj}tj j   |¡}tj j   || ¡¡}tj | ¡¡}~|dkr„d} d} n€|dkr¨|r–d} nd} tdƒ|} n\|dkrÂd} tdƒ|} nB|dkrê|rÔd} nd} d} tdƒ|} n|d krd} td ƒ|} nd} d} | | fS) a¼Verify the GPG signature of the given package object. :param po: the package object to verify the signature of :return: (result, error_string) where result is:: 0 = GPG signature verifies ok or verification is not required. 1 = GPG verification failed but installation of the right GPG key might help. 2 = Fatal GPG verification error, give up. rrkr£rQz"Public key for %s is not installedzProblem opening package %srmz Public key for %s is not trustedr‘zPackage %s is not signed)Ú _from_cmdliner7Zlocalpkg_gpgcheckrhr‹ZgpgcheckÚgpgkeyr^rr(r3ÚinitReadOnlyTransactionZ miscutilsZcheckSigr¡rõröÚbasenamer) r6ÚpoÚcheckZ hasgpgkeyrXÚrootr%Z sigresultZlocalfnÚresultr¯r8r8r9Ú_sig_check_pkgJsF    zBase._sig_check_pkgcCs | |¡S)a½Verify the GPG signature of the given package object. :param pkg: the package object to verify the signature of :return: (result, error_string) where result is:: 0 = GPG signature verifies ok or verification is not required. 1 = GPG verification failed but installation of the right GPG key might help. 2 = Fatal GPG verification error, give up. )r·©r6r r8r8r9Úpackage_signature_check…s zBase.package_signature_checkc Csh|D]^}tj |¡sqzt |¡Wn&tyJt tdƒ|¡YqYq0t  t j j tdƒ|¡qdS)NzCannot remove %sz %s removed) rõrörør rzr{rRrnrrÛrr#rÜ)r6Úpackagesr‚r8r8r9r×”s    ÿzBase._clean_packagesrrcCs†|dur|jj}|dur*| |||||¡Stj |¡r:J‚tj|j||||d}|dusdt|ƒdkrl|dƒSt ||ƒ}t  dd„|¡S)aRReturn a :class:`misc.GenericHolder` containing lists of package objects. The contents of the lists are specified in various ways by the arguments. :param pkgnarrow: a string specifying which types of packages lists to produces, such as updates, installed, available, etc. :param patterns: a list of names or wildcards specifying packages to list :param showdups: whether to include duplicate packages in the lists :param ignore_case: whether to ignore case when searching by package names :param reponame: limit packages list to the given repository :return: a :class:`misc.GenericHolder` instance with the following lists defined:: available = list of packageObjects installed = list of packageObjects upgrades = tuples of packageObjects (updating, installed) extras = list of packageObjects obsoletes = tuples of packageObjects (obsoleting, installed) recent = list of packageObjects N)ÚshowdupsÚ ignore_caserzrcSs | |¡Sr;)Z merge_lists)ÚaÚbr8r8r9rÈrfz(Base._do_package_lists..) r7ZshowdupesfromreposÚ _list_patternrr¦Úis_string_typerìÚpartialr}Úmaprí)r6Ú pkgnarrowÚpatternsr»r¼rzZlist_fnZyghsr8r8r9Ú_do_package_lists¡s ÿþ zBase._do_package_listsc&sl‡‡fdd„‰‡fdd„}‡fdd„}tj|d}g} g} g} g} g} g}g}g}g}g}|}ˆj ¡}|durtjj||d}|jˆjd d }|d kr¤i}i}| ¡D]<}|||j <|r¾qª|j |j f}||vsÞ|||krª|||<qªt ||  ¡ƒƒ} || ¡ƒ}|s|jd d }|D]„}|rH|j |vr<|  |¡n |  |¡nT|j |j f}|j |vrl|  |¡n0||vs†| ||¡r’|  |¡n |  |¡qnˆ|dkrì||ƒjd d} ˆj| d d} | jddgd|  ¡ ¡} n@|dkr t || ¡ƒƒ} n"|dkr.|rŽ||ƒ ¡}| ¡ ¡}|D]T‰ˆj ˆj f}| |g¡}‡fdd„|Dƒ}t|ƒdkr~|  ˆ¡n |  ˆ¡q6nž||ƒ ¡jd d  ¡}| ¡ ¡ ¡}|D]p\} }!|| |!fd‰| | |!fdg¡d}"|"rúˆ |"¡r|  ˆ¡n"ˆ |"¡r|  ˆ¡n |  ˆ¡qºnþ|dkrT||ƒ ˆjj¡}#|# ¡}nØ|dkrv‡fdd„| ¡Dƒ}n¶|dkrö| ¡}$|ˆj ¡ƒj|$d}ˆj|d d d}|jddgdg}|D],‰ˆj}%| ‡fdd„|$j|%d Dƒ¡qÆn6|d!kr,| ¡}|s|jd d }||ƒ  ˆj!j"¡}| |_| |_| |_#| |_$| |_%||_||_&||_"||_||_'|S)"Ncsˆdur dSˆj |¡ˆkS)z:Test whether given package originates from the repository.NT©rØrX)Úpackage©rzr6r8r9Ú is_from_repoÌsz(Base._list_pattern..is_from_repocs‡fdd„|DƒS)ú=Filter out the packages which do not originate from the repo.c3s|]}ˆ|ƒr|VqdSr;r8)rcrÇ©rÉr8r9r4Ôrfz=Base._list_pattern..pkgs_from_repo..r8)rºrËr8r9Úpkgs_from_repoÒsz*Base._list_pattern..pkgs_from_repocsˆdur |S|jˆdS)rÊNry)r)r~ryr8r9Úquery_for_repoÖsz*Base._list_pattern..query_for_repo)Úiter©r¼F)rwrrT©Zlatest_per_arch_by_priorityÚupgrades)Zupgrades_by_priority)ÚupgradeÚsrcÚnosrc©Z arch__neqrr+csg|]}|jˆjkr|‘qSr8)Úevrr3)Ú avail_pkgr8r9re%s ÿz&Base._list_pattern..rÚ autoremoveÚextrascsg|]}ˆ|ƒr|‘qSr8r8r3rËr8r9reArfr&)Zobsoletes_by_priority)rnrÒcsg|] }ˆ|f‘qSr8r8)rcrf)Únewr8r9rePrf©ÚprovidesÚrecent)(r Z GenericHolderrjr~rr€rrƒrZpkgtuprýr•r0r©r+rr„Zevr_gtÚ_merge_update_filtersÚlatestr8r*rèr}Zevr_eqÚ _unneededrØÚswdbrÙrr&ÚextendZ_recentr7rÝÚreinstall_availableÚ old_availableÚupdatesÚobsoletesTuplesrØ)&r6rÃÚpatternr»r¼rzrÌrÍZyghrr+rãrärår&rærÝrÙrØZicr,r‰ZdinstZndinstr³ÚkeyZavailr Zinstalled_dictÚinstalled_pkgsZsame_verZavailable_dictrýr•Zinst_pkgZ autoremove_qr-Zobsoleted_reldepsr8)r×rÉrÚrzr6r9r¿Êsä                          ÿÿ         ÿÿ  ÿÿ   zBase._list_patterncCs|j|7_t|ƒSr;)rr})r6Útransr8r8r9Ú_add_comps_transgszBase._add_comps_transcsœ| ¡}|sdS|jˆjjdd}|j‡fdd„|Dƒd}| |¡}|D]}ˆj |tjj ¡qJ|  |¡}|  |¡}|r˜|D]}ˆj j |ˆj jdq~dS)z« Mark to remove packages that are not required by any user installed package (reason group or user) :param query: dnf.query.Query() object NF©rlcs g|]}ˆjj |j¡r|‘qSr8)rØrWZis_removable_pkgrýrbr<r8r9rewrfz,Base._remove_if_unneeded..r©Ú clean_deps)rZ_safe_to_removerØrárÚ differencer$r2r3Z TransactionItemReason_DEPENDENCYÚ intersectionrÚeraser7Úclean_requirements_on_remove)r6r~Z unneeded_pkgsZunneeded_pkgs_historyZpkg_with_dependent_pkgsr Zremove_packagesr8r<r9Ú_remove_if_unneededksÿ   zBase._remove_if_unneededcs:ˆj}ˆjjd}‡fdd„}‡fdd„}dd„}ˆj ¡jdd }|jtj|dd f|j tj|d d f|j |f|j |ff}|D]ª\}} |D]œ} d | j i} | j r®|  d |i¡ˆj ¡jfi| ¤Ž ¡} | jddgd| s | j } | j rö| d|7} t tdƒ | ¡¡qŒ| | || ƒ}ˆjj | j ¡qŒq€ˆ |¡dS)Nrôcs,tj ˆj¡}|j|dˆjj|d|S)Nr©Úselect)rÚselectorÚSelectorrjrrrÒ)r~Ú remove_queryÚ comps_pkgr1r<r8r9Ú trans_upgrade‰s z1Base._finalize_comps_trans..trans_upgradecs ˆjjdkrr|js"ˆj||dnN| ¡ ¡}ˆ |¡tj  ˆj ¡}|j d  |j |j¡dˆjj|| dn–tj  ˆj ¡}|jr |j d  |j |j¡dnVˆjjrê| ¡rÊ| ˆj  ¡j|d¡}n | ˆj  ¡j|jddd¡}|j |d ˆjj|| d|S) Nrr©r¬z ({} if {})rÛ©rõZoptional©r&TrÐr)r7Úmultilib_policyZrequiresÚ_install_multiarchrr…Ú_report_already_installedrrör÷rjrrTrýrÚinstallr&r‚r~rr)r~rørùr¬rr1r<r8r9Ú trans_installs(    ÿ z1Base._finalize_comps_trans..trans_installcSs| |¡}|Sr;)r‚)r~rørùr8r8r9Ú trans_remove¯s z0Base._finalize_comps_trans..trans_removeTrsrûFrýr•rÓrÔrÕÚ.zNo match for group package "{}")rr7r]rjr~rrrìrÁÚ install_optrÒr"rýZ basearchonlyrBr…rRrnrrTrZ group_membersrÞró)r6rêrôrúrrrøZattr_fnÚattrr‚rùZ query_argsr,Zpackage_stringr8r<r9r?…s6   ý    zBase._finalize_comps_transcs ‡fdd„}tj ˆjˆj|¡S)NcsRˆj ¡ ¡j|d}|sdSzˆjj |d¡WStyLtj j YS0dS)Nr r) rjr~rrrØr(rÚAttributeErrorr2r3ZTransactionItemReason_UNKNOWN)Zpkgnamer,r<r8r9Ú reason_fnÌs z+Base._build_comps_solver..reason_fn)rrZSolverrØr)r6rr8r<r9rAËs zBase._build_comps_solvercCsXtj |¡sJ‚| ¡}t|tƒs.tj |¡}|  |||p>t ƒ||¡}|sNdS|  |¡S)a&Installs packages of environment group identified by env_id. :param types: Types of packages to install. Either an integer as a logical conjunction of CompsPackageType ids or a list of string package type ids (conditional, default, mandatory, optional). r) rr¦rÀrArVrÊr2r3ÚlistToCompsPackageTypeZ_environment_installrrë)r6Úenv_idÚtypesÚexcluder¬Úexclude_groupsrGrêr8r8r9Úenvironment_install×s  zBase.environment_installcCs,tj |¡sJ‚| ¡}| |¡}| |¡Sr;)rr¦rÀrAZ_environment_removerë©r6r rGrêr8r8r9Úenvironment_removeés zBase.environment_removec s¦‡fdd„‰tj |¡sJ‚d}|rB‡fdd„|Dƒ}tj |¡}ˆ ¡}t|tƒs`t j   |¡}|  ||||¡}|sxdS|r„|j } n|j} t tdƒ|| ¡ˆ |¡S)anInstalls packages of selected group :param pkg_types: Types of packages to install. Either an integer as a logical conjunction of CompsPackageType ids or a list of string package type ids (conditional, default, mandatory, optional). :param exclude: list of package name glob patterns that will be excluded from install set :param strict: boolean indicating whether group packages that exist but are non-installable due to e.g. dependency issues should be skipped (False) or cause transaction to fail to resolve (True) cs6tj |¡r,ˆj ¡j|d}tdd„|ƒS|fSdS)N©Z name__globcSs|jSr;r )rrr8r8r9rrfzABase.group_install.._pattern_to_pkgname..)rr¦Úis_glob_patternrjr~rrÂ)rçr,r<r8r9Ú_pattern_to_pkgnameýs z/Base.group_install.._pattern_to_pkgnameNcsg|] }ˆ|ƒ‘qSr8r8)rcrr)rr8r9rerfz&Base.group_install..rz#Adding packages from group '%s': %s)rr¦rÀÚ itertoolsÚchainÚ from_iterablerArVrÊr2r3r Z_group_installrrrRrSrrë) r6Úgrp_idZ pkg_typesr r¬Zexclude_pkgnamesZnested_excludesrGrêZinstlogr8)rr6r9Ú group_installðs&     ÿzBase.group_installc Csòt|j|jtjtjBtjƒ}d}d}|D]¬} z| | ¡} WnFtjj y€} z*t   t | ƒ¡d}WYd} ~ q(WYd} ~ n d} ~ 00| j D]&} |r˜| |vrˆ||j| |||d7}qˆ| jD]} ||j| ||||d7}q¶q(|sî|rîtj tdƒ¡‚|S)NrTF)r r¬)r r¬r zNothing to do.)rrrØÚ ENVIRONMENTSÚGROUPSÚ AVAILABLErèrrVrþrRr_r ÚgroupsrÚ environmentsrrmr)r6rÄr r¬r r r,ÚcntÚdonerçÚresÚerrZgroup_idr r8r8r9Úenv_group_installs,ÿ"   ÿ zBase.env_group_installcCs,tj |¡sJ‚| ¡}| |¡}| |¡Sr;)rr¦rÀrAZ _group_removerë©r6rrGrêr8r8r9Ú group_remove0s zBase.group_removec Cs°t|j|jtjtjBtjƒ}z|j|Ž}WnHtjj yr}z,t   dt |ƒ¡tj  tdƒ¡‚WYd}~n d}~00d}|jD]}|| |¡7}q~|jD]}|| |¡7}q˜|S)Nz Warning: %szNo groups marked for removal.r)rrrØrrÚ INSTALLEDrèrrVrþrRr_r rmrrrrr$)r6rÄr,r r!rrXÚgrpr8r8r9Úenv_group_remove7s  þ&  zBase.env_group_removec Csbt|j|jtjtjBtjƒ}d}|D]}z| |¡}WnBtjj yz}z&t   t |ƒ¡WYd}~q$WYd}~n d}~00|j D]Z}z| |¡d}Wq‚tjj yÚ}z&t   t |ƒ¡WYd}~q‚WYd}~q‚d}~00q‚|jD]\}z| |¡d}Wqätjj y>}z&t   t |ƒ¡WYd}~qäWYd}~qäd}~00qäq$|s^tdƒ} tj | ¡‚dS)NFTzNo group marked for upgrade.)rrrØrrr%rèrrVrþrRr_r rÚenvironment_upgraderÚ group_upgraderržZCliError) r6rÄr,Zgroup_upgradedrçr r!rXr&r¯r8r8r9Úenv_group_upgradeGs8  þ "  $  &zBase.env_group_upgradecCs,tj |¡sJ‚| ¡}| |¡}| |¡Sr;)rr¦rÀrAZ_environment_upgraderërr8r8r9r(ds zBase.environment_upgradecCs,tj |¡sJ‚| ¡}| |¡}| |¡Sr;)rr¦rÀrAZ_group_upgraderër#r8r8r9r)ks zBase.group_upgradecCsª|jjd}tj |¡rdS|jj}tjjj |d}|  tj tj B¡|  dd¡}t|ƒ}~~|dkrldStj |¡}tj |¡sŽt |¡t|dƒ}| ¡~dSdS) z˜Checks for the presence of GPG keys in the rpmdb. :return: 0 if there are no GPG keys in the rpmdb, and 1 if there are keys z/.gpgkeyschecked.yumr£)rµrýz gpg-pubkeyrÚwN)r7r›rõrörør^rr(r3r±rëÚ_RPMVSF_NOSIGNATURESÚ_RPMVSF_NODIGESTSZdbMatchr}r÷rùÚopenr?)r6Zgpgkeyscheckedr^ZmytsÚidxÚkeysZmydirÚfor8r8r9Ú_gpg_key_checkrs&       zBase._gpg_key_checkc Cs¤| |¡\}}| |¡|D]~}tj |j¡}|j ¡j|d}|jj rh|  |j ¡j|j ddd¡}|j |d}|durˆ|j |d}|j j|| dqt|ƒS)NrTrÐrýryrü)r.rrrör÷rjr~rr7r&r‚rrrrr}) r6r~rzr¬Ú already_instr+rºr1r,r8r8r9rÿs  ÿ  zBase._install_multiarchcCs,t ¡}t ¡}t||ƒt||ƒ||fS)aá Categorize :param install and :param exclude list into two groups each (packages and groups) :param install: list of specs, whether packages ('foo') or groups/modules ('@bar') :param exclude: list of specs, whether packages ('foo') or groups/modules ('@bar') :return: categorized install and exclude specs (stored in argparse.Namespace class) To access packages use: specs.pkg_specs, to access groups use: specs.grp_specs )ÚargparseÚ Namespacer )r6rr Ú install_specsÚ exclude_specsr8r8r9Ú_categorize_specs¢s   zBase._categorize_specscsddd„|jDƒ‰‡fdd„|jDƒ}|j ¡j|d}|j ¡jˆd}|j |¡|j |¡dS)NcSsg|]}tj |¡r|‘qSr8)rr¦r©rcr r8r8r9reµs ÿz/Base._exclude_package_specs..csg|]}|ˆvr|‘qSr8r8r9©Z glob_excludesr8r9re·sÿr r)Ú pkg_specsrjr~rr†)r6r7ÚexcludesrŠZglob_exclude_queryr8r:r9Ú_exclude_package_specs´s  zBase._exclude_package_specsc CsØtƒ}t|j|jtjtjBtjtjBƒ}|D]¢}z| |¡}WnDt j j y‚}z(t   dt|ƒ¡WYd}~q,WYd}~n d}~00| |j¡| |j¡|jD]*}|j |¡}| ¡D]} | | j¡qºq¢q,t|ƒS)NzWarning: Module or %s)rrrrØrrrr%rèrrVrþrRr_r rBrrZ_environment_by_idZ groups_iterrÞrUr0) r6Ú group_specsrr,rçr r!Zenvironment_idZ environmentrWr8r8r9Ú_expand_groupsÀs$   þ"     zBase._expand_groupsc Cs€|D]v}zL|jj}d|vr:| d¡}|d}|d d¡}| |g|||j|j¡Wqtjjyx|  d|¡Yq0qdS)Nr£rr£ú,ú@) r7Zgroup_package_typesÚsplitr"r;Ú grp_specsrrVrmr„)r6r>r<Zskippedr¬Z group_specr rBr8r8r9Ú_install_groups×s ÿzBase._install_groupsc Cs¨|dur g}g}g}g}g} | ||¡\} } | | ¡| jD]\} z|j| |||dWq<tjjy–} z$t t | ƒ¡|  | ¡WYd} ~ q| |g¡nV|tj   |¡vrft j   tdƒ|j¡‚n.t j |j¡}|j|gd|jj|| ddS)NrWrrür£)rjr~Ú_nevrarýrÖr•r.rrrrrrVÚPackageNotFoundErrorrr¥rör÷rrr)r6r r¬r,r3r+r1r8r8r9Úpackage_installNszBase.package_installcCsf|j ¡ ¡j|j|j|jdr0|j |¡dSt dƒ}t   |t |ƒ¡t j t dƒ|j|j¡‚dS)N)rýrÖr•r£z.Package %s not installed, cannot reinstall it.rW)rjr~rrrýrÖr•rrrrRrnrrrVrKr¥)r6r r¯r8r8r9Úpackage_reinstall\s   zBase.package_reinstallcCs|j |¡dSr„)rrñr¸r8r8r9Úpackage_removeds zBase.package_removecCs`|jrd}t|ƒ‚|jdkr6tdƒ}t ||j¡dS|j ¡  ¡  ¡}|j j rš|j ¡j |gdj |drštj |j¡}|j|gd|jj|ddS|jd kr´|j|jd }n|j|j|jd gd }|std ƒ}t ||j¡tj td ƒ|j|j¡‚nZt|ƒd|krBtj |j¡}|j|gd|jj|ddStdƒ}t ||j¡dSdS)Nz+upgrade_package() for an installed package.rÓz.r rýryT)rSrÒcSsg|] }|j‘qSr8r r3r8r8r9re¬rfrrôr£)rjr~rrðrr+r‚rÑrÞrßrrrör÷rrrÒ) r6r~r&rzrSZ installed_allr,rr1r8r8r9Ú_upgrade_internals"" ÿ    zBase._upgrade_internalc Csvtj |¡}| |j¡}|d}|r\tj |¡}|s,|dr,|djr,|dj}|j ¡  ¡  ¡}|j j r~|j |dn|j ¡jdd} | s,|j |d  ¡} | sÖtdƒ} t | |¡tj tdƒ||¡‚nV|djr,tj |dj¡s,| j|djd s,td ƒ} t | d  ||dj¡¡|j j oJ|doJ|d ¡} | || ||¡Stj tdƒ||¡‚dS) Nr~ÚnevrarýTrsr z(Package %s available, but not installed.rW)r•z?Package %s available, but installed for different architecture.z{}.{})rr€rrPrjr¦rrýr~rr…r7r&rrrrRrnrVÚPackagesNotInstalledErrorr•rTZ has_just_namerbrK) r6rSrzr‰rOr,ZwildcardÚpkg_namerZ obsoletersZinstalled_namer¯r&r8r8r9rÒ³s:    ÿÿ  ÿ  ÿz Base.upgradecCs|j|j ¡|jj|ddS)N)rS)rbrjr~r7r&)r6rzr8r8r9Ú upgrade_allÑsÿzBase.upgrade_allcCsŒ|dur|j ¡nttj |¡}|j|jdd}|djtj d|j |||j j dd}|spt  tdƒ|¡dS|D]}|jj|d qtd S) NF)rMr~©Z reponame__neqT)rOr&rNzNo package %s installed.rrôr£)rZdistupgrade_allrr€rrPrjrrPZSYSTEM_REPO_NAMErRr7r&rRr§rZ distupgrade)r6rSr€rOrUr1r8r8r9Ú distro_syncÙs  ÿzBase.distro_syncc Csôt|||gƒrÀ||7}d}|rB|rB|D]}tdƒ}t ||¡q&n|rT| |¡rTd}|D]R}z|j||dWn6tjjy¤} zt  t | ƒ¡WYd} ~ qXd} ~ 00d}qX|sðt tdƒ¡n0|j   ¡j |jj|jjd} | D]} | | ¡qàdS)z»Removes all 'leaf' packages from the system that were originally installed as dependencies of user-installed packages but which are no longer required by any such package.FzNot a valid form: %sT)rENzNo packages marked for removal.rì)ÚanyrrRrnr'r"rrVrKr§rrjr~ràrØrár7rlr`) r6rEr;rCÚ filenamesrZgrp_specr¯rSrZr­r r8r8r9rØés. $ÿzBase.autoremovec s”d|i}|r$d|d<d|d<d|d<tj |¡jˆjfi|¤Ž}‡‡fdd„| ¡Dƒ}|sjˆ ||ˆ¡ˆjj}|D]}ˆj j ||d qvt |ƒS) z'Mark the specified package for removal.rETrvFrwrxcs(g|] }ˆdus ˆj |¡ˆkr|‘qSr;rÆr3rÈr8r9re sþzBase.remove..rí) rr€rrƒrjrÚ"_raise_package_not_installed_errorr7ròrrñr}) r6rSrzrErTr/rrîr r8rÈr9r" s ÿz Base.removec s0tj |¡}| ˆj¡}‡‡fdd„| ¡Dƒ}| ¡} |durL| j|d|dur`| j|dtj  | ¡} |s„tj   d||   ¡¡‚d} ˆj j} ˆj j} |D]t}z| t|ƒ}Wn*tyÚ|sÆYqœˆjj|| dYn.0tj ˆj¡}|j|dˆjj|| d | d 7} qœ| dkr,tj  d||¡‚| S) Ncs(g|] }ˆdus ˆj |¡ˆkr|‘qSr;rÆr3©Ú old_reponamer6r8r9re& sþz"Base.reinstall..ryrgzno package matchedrrírrür£)rr€rrƒrjrr+rr~Z_per_nevra_dictrVrdr8r7ròr¬r ÚKeyErrorrrñrör÷rrZPackagesNotAvailableError)r6rSrmZ new_reponameZnew_reponame_neqZ remove_nar‰r,réZ available_qZavailable_nevra2pkgrrîr¬Z installed_pkgÚavailable_pkgsr1r8rlr9Ú reinstall" sD   ÿ    ÿ    ÿzBase.reinstallcCs | |¡S)z§Mark a package to be downgraded. This is equivalent to first removing the currently installed package, and then installing an older version. )Ú downgrade_to)r6rSr8r8r9Ú downgradeL szBase.downgradec Cstj |¡}| |j¡}|s6tdƒ|}tj ||¡‚d}| ¡}t |  ¡  ¡ƒ}|j  ¡  ¡j|d} t| ƒdkrtdƒ|}tj |||¡‚|   ¡  ¡D]^} | ¡j| d} | sÊtdƒ}t || ¡qœtj |j¡} | j| d|jj| | dd}qœ|S) zDowngrade to specific version if specified otherwise downgrades to one version lower than the package installed. rWrr z6Packages for argument %s available, but not installed.zDPackage %s of lowest version already installed, cannot downgrade it.rrür£)rr€rrƒrjrrVr]r+r0Ú _name_dictr0r~rrr}rdZ downgradesrrRrnrör÷rrr) r6rSr¬r‰r,r¯rroZavailable_pkg_namesZ q_installedreZdowngrade_pkgsr1r8r8r9rqV s.       zBase.downgrade_tocsš|j ¡jˆd}|r |ˆgfStj |jˆ¡}|r>|ˆgfSˆ d¡sRˆ d¡r^dˆg}n&ˆ d¡rr|ˆgfS‡fdd„dDƒ}|j ¡j|d|fS) N)Z file__globú/bin/ú/sbin/z/usrr£csg|] }|ˆ‘qSr8r8)rcÚprefix©Ú provides_specr8r9re sÿz!Base.provides..)rtruz /usr/bin/z /usr/sbin/)rjr~rrZ _by_providesÚ startswith)r6rxZ providersZbinary_providesr8rwr9rÜr s      ÿz Base.providesc CsÐdddœ}||vrtdƒ‚||}|rDd|} |j | tƒ¡ |¡|rfd|} |j | tƒ¡ |¡|rˆd|} |j | tƒ¡ |¡|rªd|} |j | tƒ¡ |¡|rÌd |} |j | tƒ¡ |¡d S) aý It modifies results of install, upgrade, and distrosync methods according to provided filters. :param cmp_type: only 'eq' or 'gte' allowed :param types: List or tuple with strings. E.g. 'bugfix', 'enhancement', 'newpackage', 'security' :param advisory: List or tuple with strings. E.g.Eg. FEDORA-2201-123 :param bugzilla: List or tuple with strings. Include packages that fix a Bugzilla ID, Eg. 123123. :param cves: List or tuple with strings. Include packages that fix a CVE (Common Vulnerabilities and Exposures) ID. Eg. CVE-2201-0123 :param severity: List or tuple with strings. Includes packages that provide a fix for an issue of the specified severity. Z__eqgZ __eqg__gt)ÚeqZgtez Unsupported value for `cmp_type`Z advisory_typeÚadvisoryZ advisory_bugZ advisory_cveZadvisory_severityN)r—r/Ú setdefaultrrB) r6Zcmp_typer r{ZbugzillaZcvesZseverityZcmp_dictÚcmprèr8r8r9Úadd_security_filters… s& zBase.add_security_filterscCs i|_dS)z, Reset all security filters N)r/r<r8r8r9Úreset_security_filtersª szBase.reset_security_filtersc Cs4|js |jr|s|S|j ¡jdd}|jrJ|jD]}| |¡}q2|g|_|jrŽ|j ¡D]2\}}|rn|d}||i} | |jfi| ¤Ž¡}qZ| |¡}|s0|r0|  ¡}t |  ¡  ¡ƒ} | dkr0|durþt dƒ | ¡} t dƒ | ¡} t t| | | ƒ¡n2t dƒ || ¡} t d ƒ || ¡} t t| | | ƒ¡|S) z† Merge Queries in _update_filters and return intersection with q Query @param q: Query @return: Query TrsZ __upgraderNz3No security updates needed, but {} update availablez4No security updates needed, but {} updates availablez._prov_key_dataFrz)GPG key at %s (0x%s) is already installedTzThe key has been approved.zThe key has been rejected.)r³ÚuseridZhexkeyidÚkeyurlÚ fingerprintÚ timestampzKey import failed (code %d)zKey imported successfullyzDidn't install any keysz°The GPG keys listed for the "%s" repository are already installed but they are not correct for this package. Check that the correct key URLs are configured for this repository.z+Import of key(s) didn't help, wrong key(s)?N)4r¯rr—rhr‹rUr1r°rÞrZcryptoZretriever Z keyInstalledrâZrpm_idr†rRr§Zshort_idr7rÁrÂZKeyInfoZfrom_rpm_key_objectrƒZraw_keyZDNSSECKeyVerificationZverifyZ nice_user_msgÚurlZlog_dns_key_importZlog_key_importZassumenoZ assumeyesZValidityZVALIDZPROVEN_NONEXISTENCEZany_msgr…rcr(rdZ getTsFlagsræZpgpImportPubkeyZ procgpgkeyrVrmrýr·r )r6r³ÚaskcbÚ fullaskcbr¯Z key_installedZkeyurlsr‚Z user_cb_failr„r0r§Z dns_input_keyZ dns_resultÚrcZ test_flagZ orig_flagsr¶Úerrmsgr8rr9Ú_get_key_for_packageÚ sš      ÿ     ÿü      ü  zBase._get_key_for_packagecCs| |||¡dS)a»Retrieve a key for a package. If needed, use the given callback to prompt whether the key should be imported. :param pkg: the package object to retrieve the key of :param askcb: Callback function to use to ask permission to import a key. The arguments *askcb* should take are the package object, the userid of the key, and the keyid :param fullaskcb: Callback function to use to ask permission to import a key. This differs from *askcb* in that it gets passed a dictionary so that we can expand the values passed. :raises: :class:`dnf.exceptions.Error` if there are errors retrieving the keys N)rŒ)r6r rˆr‰r8r8r9Úpackage_import_key` szBase.package_import_keycCs0g}|j ¡|j ¡D]}| t|ƒ¡q|Sr;)râr´Zproblemsr„r )r6ÚresultsZprobr8r8r9r^q s  zBase._run_rpm_checkúw+bcKstjj||j||fi|¤ŽS)zˆ Open the specified absolute url, return a file object which respects proxy setting even for non-repo downloads )rr¦Z_urlopenr7)r6r‡rXròrTr8r8r9Úurlopen| sz Base.urlopencCs,|dur|jjtjd}|j|jjd}|S)NrrÛ)rr~rPr#rr7rÌ)r6r,Z installonlyr8r8r9r„ szBase._get_installonly_querycCsrtjj|dd}|j|jdddd}|drn|drn|djrn||ddjkrnt tdƒ  |ddj¡¡dS) NTrÏFrur~rcrz * Maybe you meant: {}) rr€rrPrjrýrRr§rrT)r6rSr‰rOr8r8r9Ú_report_icase_hintŠ s ÿÿzBase._report_icase_hintcCsœdd„}g}g}|D].}| ¡r8|jtjkrB| |¡q| |¡qtdƒ}|||ƒsftj tdƒ¡‚|j j r”tdƒ}|||ƒstj tdƒ¡‚g}||fS)a  Check checksum of packages from local repositories and returns list packages from remote repositories that will be downloaded. Packages from commandline are skipped. :param install_pkgs: list of packages :return: list of remote pkgs c Ssvd}|D]h}d}z | ¡}Wn2tyN}zt t|ƒ¡WYd}~n d}~00|durt | ||j¡¡d}q|S)NTF)ZverifyLocalPkgrQrRrérrTrz)Zpkg_listZ logger_msgZall_packages_verifiedr Zpkg_successfully_verifiedrZr8r8r9Ú_verification_of_packages™ s $z;Base._select_remote_pkgs.._verification_of_packagesz>Package "{}" from local repository "{}" has incorrect checksumz;Some packages from local repository have incorrect checksumz8Package "{}" from repository "{}" has incorrect checksumzVSome packages have invalid cache, but cannot be downloaded due to "--cacheonly" option) Z _is_local_pkgrzrPZCMDLINE_REPO_NAMEr„rrrVrmr7rŽ)r6Z install_pkgsr’r©Zlocal_repository_pkgsr r¯r8r8r9r¤’ s*    ÿ ÿzBase._select_remote_pkgscCs|D] }t|ƒqdSr;)Ú_msg_installed)r6rºr r8r8r9r¿ szBase._report_already_installedc Csª|jjtjd}tj |¡}|j|j|d|d}|durH|dj|d|dsdtj   t dƒ|¡‚nB|jjtj d}|d  |¡}|rt dƒ}nt dƒ}tj   ||¡‚dS) NrF©rErMr~r~ryúNo match for argumentú?All matches were filtered out by exclude filtering for argumentz?All matches were filtered out by modular filtering for argument)rjr~rPr#rr€rrPrrVr]rZIGNORE_REGULAR_EXCLUDESrð) r6rSrErzÚ all_queryr€rOZwith_regular_queryr¯r8r8r9rQà s  ÿ z#Base._raise_package_not_found_errorc s ˆjjtjd ¡}tj |¡}|jˆj|d|d}|dsNtj   t dƒ|¡‚ˆdurp‡‡fdd„|dDƒ}n|d}|s†t dƒ}nt d ƒ}tj   ||¡‚dS) NrFr”r~r•cs g|]}ˆj |¡ˆkr|‘qSr8rÆr3rÈr8r9reá rfz;Base._raise_package_not_installed_error..zCAll matches were installed from a different repository for argumentr–) rjr~rPr#rrr€rrPrVrdr) r6rSrErzr—r€rOrr¯r8rÈr9rkØ s  ÿ z'Base._raise_package_not_installed_errorcCs|jj|jdddS)z Setup DNF file loggers based on given configuration file. The loggers are set the same way as if DNF was run from CLI. T)Zfile_loggers_onlyN)r$Z_setup_from_dnf_confr7r<r8r8r9Ú setup_loggersê szBase.setup_loggersc sä|jjtjtjBtjB@r d}nd}t|jƒ}|j|ddœ}|jfi|¤Ž}|sn|rnt j   |  ¡¡}t  |¡t|jddƒ}t|jddƒ|} dd„‰‡fdd„|Dƒ‰t‡‡fd d„|Dƒƒ} t‡‡fd d„| Dƒƒ} | | fS) zšreturns set of conflicting packages and set of packages with broken dependency that would be additionally installed when --best and --allowerasingTF)r6r7Z ignore_weak)r+cSstj|j|j|j|j|jdS)N)rýÚepochÚversionÚreleaser•)rPZNEVRArýr™ršr›r•)Úitemr8r8r9r\ sÿz&Base._skipped_packages.._nevracsg|] }ˆ|ƒ‘qSr8r8rƒ)r\r8r9re rfz*Base._skipped_packages..csg|]}ˆ|ƒˆvr|‘qSr8r8r3©r\Ztransaction_nevrasr8r9re rfcsg|]}ˆ|ƒˆvr|‘qSr8r8r3rr8r9re rf)rÚactionsrPZINSTALLZUPGRADEZ UPGRADE_ALLrr0r8rr¦rCrDrRrnrÚproblem_conflictsZproblem_broken_dependency) r6Zreport_problemsr3r9ZngÚparamsr;r¯rŸZproblem_dependencyZskipped_conflictsZskipped_dependencyr8rr9Ú_skipped_packagesò s. þ ÿÿzBase._skipped_packagescs8|js dStdƒ‰|jj|jjB}t‡fdd„|DƒƒS)zfCheck whether a system reboot is recommended following the transaction :return: bool F) Zkernelz kernel-rtZglibczlinux-firmwareZsystemdZdbusz dbus-brokerz dbus-daemonZ microcode_ctlc3s|]}|jˆvVqdSr;r r3©Z need_rebootr8r9r4 rfz%Base.reboot_needed..)r3Ú frozensetr}Z remove_setri)r6Z changed_pkgsr8r¢r9Ú reboot_needed s zBase.reboot_needed)N)F)r8r8N)F)TT)T)N)FFF)F)F)r8)N)T)NN)TN)rrNNFN)N)NTN)NT)TNN)NT)T)NNTN)NTN)F)T)N)N)N)N)NNNN)NN)NNNF)F)r8r8r8r8r8)NTF)NN)NN)Nr)N)ƒÚ__name__Ú __module__Ú __qualname__r:r=r@rArEr[Ú staticmethodrrqrŒrÚpropertyrr7rhÚdeleterrr¦Zlazyattrr”rjrkr3ÚsetterrœrŸr r¡r¢r°r­rÔrÚr?ràrºrÙr(ZRPMTRANS_FLAG_NOSCRIPTSZRPMTRANS_FLAG_NOTRIGGERSZRPMTRANS_FLAG_NODOCSrdZRPMTRANS_FLAG_JUSTDBZRPMTRANS_FLAG_NOCONTEXTSZRPMTRANS_FLAG_NOFILEDIGESTrçrYrår,r-rêr³râr’rÿrØr)r.r2r5r<r=rHrjrbrurer~r rªr®r·r¹r×rÅr¿rërór?rArrrr"r$r'r*r(r)r2rÿr8r=r?rDr6rr[r^r_r`rarbrÒrfrhrØr"rprrrqrÜr~rrÞrŒrr^rrr‘r¤rrQrkr˜r¡r¤r8r8r8r9r\s(   =             8 ; > =ú  ÿ    +ü^ ; l"^ * C  ; ÿ *ÿ F  *     / #  % &    # ÿ *  % )    -rcCs t|ƒ}tdƒ}t ||¡dS)Nz Package %s is already installed.)r rrRr§)r rýr¯r8r8r9r“ sr“)IÚ__doc__Z __future__rrrrr4rZlibdnf.transactionr2r¨rZ dnf.compsrZdnf.i18nrr r Zdnf.utilr Zdnf.db.historyr Zdnf.yumr Úcollections.abcrÚ ImportErrorÚ collectionsrÉZ dnf.callbackZdnf.confZ dnf.conf.readZ dnf.cryptoZ dnf.dnssecZdnf.drpmZdnf.exceptionsZdnf.goalZ dnf.historyZdnf.lockZ dnf.loggingZdnf.module.module_baser|Z dnf.persistorZ dnf.pluginZ dnf.queryZdnf.repoZ dnf.repodictZdnf.rpm.connectionZdnf.rpm.miscutilsZdnf.rpm.transactionZdnf.sackZ dnf.selectorZ dnf.subjectZdnf.transactionZdnf.yum.rpmtransrìrárPrr#rqrõrîrnr(rürÀr§Z getLoggerrRÚobjectrr“r8r8r8r9Ús¬            Y