3 ÌÐgõÊã@sXdZddlmZddlmZddlmZddlmZddlZddlZddlZ ddl m Z ddl m Z dd lmZmZmZdd lmZdd lmZdd lmZydd lmZWn ek rÌdd lmZYnXddlZddlZddl ZddlZddlZddl Zddl!Zddl"Zddl#Zddl$Zddl%Zddl&Zddl'Zyddl(ZdZ)Wnek �r`dZ)YnXddl*Zddl+Zddl,Zddl-Zddl.Zddl/Zddl0Zddl1Zddl2Zddl3Zddl4Zddl5ZddlZddl6Zddl7Z7ddl8Z8ddl9Z9ddl:Z:ddl;Z;ddlZ>ddl?Z?ddl@Z@ddlAZAddlBZBe;jCdƒZDGdd„deEƒZFdd„ZGdS)z Supplies the Base class. é)Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsN)Údeepcopy)Ú CompsQuery)Ú_ÚP_Úucd)Ú _parse_specs)Ú SwdbInterface)Úmisc)ÚSequenceTFÚdnfc@s‚eZdZdädd„Zdd„Zdd„Zdd „Zd d „Zd d „Ze dd„ƒZ dd„Z dådd„Z dd„Z edd„ƒZedd„ƒZedd„ƒZejdd„ƒZeejjdƒdd „ƒƒZed!d"„ƒZed#d$„ƒZed%d&„ƒZejd'd&„ƒZd(d)„Zffdfd*d+„Zd,d-„Zd.d/„Zd0d1„Zdæd2d3„Z dçd5d6„Z!dèd7d8„Z"d9d:„Z#d;d<„Z$déd=d>„Z%dêd?d@„Z&dAdB„Z'e(j)e(j*e(j+e(j,e(j-e(j.e(j/dCœZ0e1e(dDƒ�rŽe(j2e0dE<dFe(j3e(j4BiZ5edGdH„ƒZ6edIdJ„ƒZ7e7jdKdJ„ƒZ7dëdLdM„Z8dNdO„Z9edPdQ„dRdQ„dSdQ„dTdU�Z:dVdW„Z;dXdY„Zd^d_„Z?dìd`da„Z@ffdbdc„ZAddde„ZBdfdg„ZCdhdi„ZDdídjdk„ZEdîdldm„ZFdïdndo„ZGdðdpdq„ZHdrds„ZIdtdu„ZJdvdw„ZKdñdydz„ZLdòd{d|„ZMd}d~„ZNdd€„ZOd�d‚„ZPdƒd„„ZQdód…d†„ZRd‡dˆ„ZSdôd‰dŠ„ZTdõd‹dŒ„ZUd�dŽ„ZVd�d�„ZWd‘d’„ZXd“d”„ZYd•d–„ZZd—d˜„Z[död™dš„Z\d›dœ„Z]d�dž„Z^dŸd „Z_d÷d¡d¢„Z`død£d¤„Zadùd¥d¦„Zbdúd§d¨„Zcdûd©dª„Zdd«d¬„Zed­d®„Zfd¯d°„Zgdüd±d²„Zhdýd³d´„Zidþdµd¶„Zjdÿd·d¸„Zk�dd¹dº„Zl�dd»d¼„Zm�dd½d¾„Znd¿dÀ„Zo�ddÁd„ZpdÃdÄ„ZqffffffdÅdÆ„ZrdÇdÈ„Zs�ddÉdÊ„Zt�ddËdÌ„Zu�ddÍd΄ZvdÏdЄZw�ddÒdÓ„Zx�ddÔdÕ„ZydÖdׄZzdØdÙ„Z{dÚdÛ„Z|dÜdÝ„Z}dÞdß„Z~dàdá„Zdâdã„Z€dS( ÚBaseNcCsÎd|_|p|jƒ|_d|_d|_d|_d|_d|_d|_t j j ƒ|_ d|_ tƒ|_tƒ|_t jjƒ|_t jjƒ|_t jjƒ|_ttjgƒ|_t jjƒ|_d|_ d|_!d|_"g|_#i|_$d|_%tƒ|_&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Úoutput)ÚselfÚconf©r5ú/usr/lib/python3.6/base.pyÚ__init__]s2     z Base.__init__cCs|S)Nr5)r3r5r5r6Ú __enter__zszBase.__enter__cGs |jƒdS)N)Úclose)r3Zexc_argsr5r5r6Ú__exit__}sz Base.__exit__cCs |jƒdS)N)r9)r3r5r5r6Ú__del__€sz Base.__del__cCs.|jr|jj|ƒn|jjrn |jj|ƒdS)N)rr Úupdater4Údestdirr)r3Úfilesr5r5r6Ú_add_tempfilesƒs zBase._add_tempfilescCsž|jƒtd|jdd�}|jr&d|d<y|jj|jfddi|—ŽWnTtjk r˜}z6t j t dƒj |j |ƒƒtjjt dƒj |j ƒƒ‚WYdd}~XnXdS)NT)Úload_filelistsÚ load_prestoÚload_updateinfoÚ load_otherÚ build_cachezloading repo '{}' failure: {}z"Loading repository '{}' has failed)ÚloadÚdictÚdeltarpmÚload_metadata_otherrÚ load_repoÚ_repoÚhawkeyÚ ExceptionÚloggerÚdebugrÚformatÚidrÚ exceptionsÚ RepoError)r3ÚrepoÚ mdload_flagsÚer5r5r6Ú_add_repo_to_sack‹szBase._add_repo_to_sackcCs.tjjƒ}|j}d|kr*tjj|jƒ|d<|S)NÚ releasever)rr4ZConfÚ substitutionsr(Zdetect_releaseverÚ installroot)r4Zsubstr5r5r6r™s  zBase._setup_default_confcCsšdd„|jjƒDƒ}y0|jj|j||jj|jjd|jj|jj d�}Wn4t j k rx}zt j jt|ƒƒ‚WYdd}~XnX|r–tjt jjj|dƒƒdS)NcSsg|]}|jr|j‘qSr5)Zmodule_hotfixesrP)Ú.0Úir5r5r6ú £sz0Base._setup_modular_excludes..F)Z update_onlyZ debugsolverÚmodule_obsoletesr)ÚreposÚ iter_enabledÚsackZfilter_modulesÚ_moduleContainerr4rYZmodule_platform_idÚ debug_solverr]rKrLrrQÚErrorr rMÚwarningÚmoduleÚ module_baseZformat_modular_solver_errors)r3Z hot_fix_reposZ solver_errorsrUr5r5r6Ú_setup_modular_excludes¢s "zBase._setup_modular_excludesFc Csªt|jjƒ}d|kr$tr$|jƒdSg}g}|�s>�x|jjƒD]ú}|j|krPq@t|j ƒdkrÌ|j j ƒj dd�}x8t|j ƒD]*}t jj|ƒ}|j|j|j dddd�ƒ}q|W|j |jd�|j|jƒ|jfƒ|j j ƒj dd�} x8t|jƒD]*} t jj| ƒ}| j|j|j dddd�ƒ} qêW| j |jd�| r@|j| |jfƒq@Wd|k�r6|j j ƒj dd�} t|jj ƒdk�rªx.) rr4Ú cacheonlyr^r_Zexpired_to_addr<Úsaver-)r3Zexpiredr5r5r6Ú_store_persistent_dataìs  zBase._store_persistent_datacCs|jdkr|jdd�|jS)NT)Ú arch_filter)rÚ read_comps)r3r5r5r6rös  z Base.compscCs|jS)N)r)r3r5r5r6r4ýsz Base.confcCs|jS)N)r')r3r5r5r6r^sz Base.reposcCs d|_dS)N)r')r3r5r5r6r^sZ _priv_rpmconncCstjjj|jjƒS)N)rr(Z connectionZ RpmConnectionr4rY)r3r5r5r6Ú_rpmconn sz Base._rpmconncCs|jS)N)r)r3r5r5r6r`sz Base.sackcCsP|jdkrtjjdƒ‚|jjdkrHtjjd|jj |jj d|jj ƒ|j_|jjS)NzSack was not initializedFÚarch) r`rrQrcraÚlibdnfreZModulePackageContainerr4rYrXÚ persistdir)r3r5r5r6ras     zBase._moduleContainercCs|jS)N)r)r3r5r5r6Ú transactionszBase.transactioncCs|jrtdƒ‚||_dS)Nztransaction already set)rÚ ValueError)r3Úvaluer5r5r6rŠ$scCstjj|jjƒ|_dS)N)rÚ persistorZ RepoPersistorr4Úcachedirr)r3r5r5r6Ú_activate_persistor+szBase._activate_persistorcCs,|jjr|jj|j||ƒ|jj||ƒdS)z&Load plugins and run their __init__().N)r4Zpluginsr*Ú_loadZ _run_init)r3Z disabled_globZenable_pluginsÚclir5r5r6Ú init_plugins.szBase.init_pluginscCs|jjƒdS)z#Run plugins pre_configure() method.N)r*Z_run_pre_config)r3r5r5r6Úpre_configure_plugins5szBase.pre_configure_pluginscCs|jjƒdS)zRun plugins configure() method.N)r*Z _run_config)r3r5r5r6Úconfigure_plugins:szBase.configure_pluginscCs|jjƒdS)zRun plugins unload() method.N)r*Z_unload)r3r5r5r6Úunload_plugins?szBase.unload_pluginsc Csà|jj}|jdkr|jƒ|j}|rÐtjjƒrDtdƒ}tj |ƒdStjj ƒdkrhtdƒ}tj |ƒdS|dkr†tdƒ}tj |ƒdS|j ƒ}|dk r°||kr°tj tdƒƒdSx|j j ƒD]}|jjdƒq¼W|j jƒsütj tdƒjd j|jjƒƒƒdSx¶|j jƒD]¨}|jƒ\}} | dk�r6tj td ƒ|jƒnx| �sH| dk�rftjtd ƒ|jƒ|jjƒnH|�rš| |k�rštd ƒ}tj||j| ƒ|jjƒntjtd ƒ|j| ƒ�qW|�rÀd|_|jddd�tj 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.)r4Zmetadata_timer_syncrr�rÚutilZon_metered_connectionrrMÚinfoZ on_ac_powerÚsince_last_makecacher^ÚvaluesrJZsetMaxMirrorTriesÚ _any_enabledrOÚjoinZreposdirr_Z_metadata_expire_inrPrNÚexpireZreset_last_makecacheÚ fill_sack) r3ÚtimerZperiodr�Úmsgr›rSr{Zis_cacheZ expires_inr5r5r6Ú update_cacheDsZ            zBase.update_cacheTc CsPtjjdƒ}|jddd�tjj|ƒ|_tjj|j j |j j ƒ}|��²|dk r€y|jj dd�Wnt k r~|dkrz‚YnX|�räg}d}tjƒ}|j jrªtjjjƒxÔ|jjƒD]Æ}y`|j|ƒ|jjƒ|krÞ|jjƒ}|jjƒ|krö|jjƒ}tjtdƒ|jtjj|jjƒƒƒWq¶tj j!k �rz} z>|jj"ƒ|j#dk�rJ‚tj$d | ƒ|j%|jƒ|j&ƒWYd d } ~ Xq¶Xq¶W|�rœtj$td ƒd j'|ƒƒ|jj(ƒ�rò|dk�rò|dk�ròtj)td ƒt*j+t,|ƒd�tjj|ƒƒn|jj-ƒj&ƒWd QRX|j } |jj.| j/| j0| j1ƒ|j2ƒ|ƒtj3j4|jƒ|_5| j6|j5_6|j7j8ƒ|jS)z'Prepare the Sack and the Goal objects. z sack setupT)r`ÚgoalF)rDÚautorz%s: using metadata from %s.z Error: %sNzIgnoring repositories: %sz, z-Last metadata expiration check: %s ago on %s.)Zseconds)9rr#ÚTimerÚresetr`Ú _build_sackrÚlockÚbuild_metadata_lockr4rŽÚ exit_on_lockr—ÚIOErrorÚtimeÚgpgkey_dns_verificationÚdnssecÚRpmImportedKeysÚcheck_imported_keys_validityr^r_rVrJZ getTimestampZgetAgerMrNrrPr™Únormalize_timeÚgetMaxTimestamprQrRrŸÚskip_if_unavailablerdrwÚdisableržr�ršÚdatetimeZ timedeltaÚintrhÚ _configureÚinstallonlypkgsÚinstallonly_limitÚallow_vendor_changerr¤ÚGoalrÚprotect_running_kernelr*Úrun_sack) r3r—r˜r¡r©Ú error_reposZmtsZager{rUr4r5r5r6r |sf             zBase.fill_sackc Cs tjjdƒ}|jddd�tjj|ƒ|_tjj|j j |j j ƒ}|��n|dk r€y|jj dd�Wnt k r~|dkrz‚YnXg}|j jr˜tjjjƒxø|jjƒD]ê}yf|jjddd�td|jdd�}|jrØd|d <|jj|jf|Žtjtd ƒ|jtjj|jj ƒƒƒWq¤t!t"j#fk �rŒ}zZ|j$dk�rPtj%j&td ƒj'|j|ƒƒ‚ntjtd ƒj'|j|ƒƒ|j(|jƒ|j)ƒWYd d }~Xq¤Xq¤W|�r®tj*td ƒdj+|ƒƒWd QRX|j }|jj,|j-|j.|j/ƒ|j0ƒ|ƒtj1j2|jƒ|_3|j4|j3_4|j5j6ƒ|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. z sack setupT)r`r¤F)rDr¥)Z throwExceptZ ignoreMissing)r@rArBrCz%s: using metadata from %s.zloading repo '{}' failure: {}NzIgnoring repositories: %sz, )7rr#r¦r§r`r¨rr©rªr4rŽr«r—r¬r®r¯r°r±r^r_rJZ loadCacherFrGrHrIrMrNrrPr™r²r³Ú RuntimeErrorrKrLr´rQrRrOrwrµrdržr¸r¹rºr»rr¤r¼rr½r*r¾) r3r—r¡r©r¿rSrTrUr4r5r5r6Úfill_sack_from_repos_in_cache·sX      z"Base.fill_sack_from_repos_in_cachecCsÌtjj|jjƒ|_|jjsl|j|jƒ|j r\|j j |jj ƒƒ|jj ƒ|jrl|j|j ƒn|jjj |j ƒ|jjržtjtdƒƒtjtdƒdjtjjd�ƒ|jdk r²|jjƒ|jƒ|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�ZTempfilePersistorr4rŽr-Z keepcacheÚ_clean_packagesrr+r r<Zget_saved_tempfilesrir,Ztempfiles_to_addrMršrrOr™Z MAIN_PROGrÚhistoryr9rƒÚ _closeRpmDB)r3r5r5r6Ú_finalize_baseõs*       zBase._finalize_basecCsB|jr dStjtjjdƒd|_|jƒ|jdddd�d|_dS)ztClose all potential handles and clean cache. Typically the handles are to data sources and sinks. Nz Cleaning up.T)r`r^r¤) rrMÚlogrr#ÚDDEBUGrÆr§r*)r3r5r5r6r9sz Base.closecCsftjjj|j|ƒ}xN|D]F}y|jj|ƒWqtjjk r\}ztj |ƒWYdd}~XqXqWdS)z?Read repositories from the main conf file and from .repo files.N) rr4ÚreadZ RepoReaderr^ÚaddrQZ ConfigErrorrMrd)r3ZoptsÚreaderrSrUr5r5r6Úread_all_repos"s  zBase.read_all_reposcCs |r d|_|rtjjƒ|_|r†d|_|jdk rJtjj|jƒ|_|jj |j_ |jr`|j r`|j j ƒ|j dk rt|j jƒtjjƒ|_d|_g|_|rœ|rœtjƒdS)z1Make the Base object forget about various things.N)rrr%r&r'rr¤r¼r4r½raZrollbackrrÄr9rrrrr.ÚgcZcollect)r3r`r^r¤r5r5r6r§-s$        'z Base.resetcCs|`dS)z6Closes down the instances of rpmdb that could be open.N)Ú_ts)r3r5r5r6rÅjszBase._closeRpmDB)Z noscriptsZ notriggersZnodocsÚtestZjustdbZ nocontextsÚnocryptoÚRPMTRANS_FLAG_NOCAPSZnocapsrÐcCs|jS)N)r)r3r5r5r6r¤|sz Base.goalcCsä|jdk r|jStjjj|jjƒ|_|jjdƒxb|jjD]V}|j j |ƒ}|dkrdt j t dƒ|ƒq:|jj|ƒ|jj |ƒ}|dk r:|jj|ƒq:W|jjsª|jjtjƒ|jjrÀ|jjtjƒtjtj|jdƒ}|jj|ƒ|jS)zMSet up the RPM transaction set that will be used for all the work.Nrz!Invalid tsflag in config file: %s)rrr(rŠZTransactionWrapperr4rYÚsetFlagsZtsflagsÚ_TS_FLAGS_TO_RPMÚgetrMÚcriticalrZ addTsFlagÚ_TS_VSFLAGS_TO_RPMÚ pushVSFlagsZdiskspacecheckr)rÊZRPMPROB_FILTER_DISKSPACEZ ignorearchZRPMPROB_FILTER_IGNOREARCHÚ functoolsÚreduceÚoperatorÚor_Z setProbFilter)r3ÚflagZrpm_flagZvs_flagZ probfilterr5r5r6r΀s*       zBase._tscCs&|jdkrdS|jjƒ|`d|_dS)z"Releases the RPM transaction set. N)rr9)r3r5r5r6rÎ�s   cCs$tjjdƒ}tjjƒ|_tjtjjdƒxÐ|j j ƒD]Â}|j s@q4|j sHq4|j jƒ}|sXq4tjtjjd|jƒ|j jƒtjjkrštj|dƒ}tjj|ƒs¦q4n tj|dƒ}y|jj|ƒWq4tjjk rô}ztdƒ}tj||j|ƒWYdd}~Xq4Xq4W|�r|jjj|j j!dgƒ|ƒ|jS)z6Create the groups object to access the comps metadata.z loading compszGetting group metadataz%Adding group file from repository: %sz groups.xmlz1Failed to add groups file for repository: %s - %sNÚbasearch)"rr#r¦rZCompsrrMrÇrÈr^r_Z enablegroupsr€rJZ getCompsFnrPZgetSyncStrategyrSZSYNC_ONLY_CACHEr Zcalculate_repo_gen_destÚosÚpathÚexistsZrepo_gen_decompressZ_add_from_xml_filenamerQÚ CompsErrorrrÕZ_ir„rrX)r3r„r¡rSZcomps_fnZ decompressedrUr¢r5r5r6r…¦s:       &zBase.read_compscCs*|jdkr$|jj}t|jj|d�|_|jS)zeauto create the history object that to access/append the transaction history information. N)rW)rr4rWr r‰)r3rWr5r5r6Ú _getHistoryÍs zBase._getHistorycCs|jƒS)N)râ)r3r5r5r6ÚÕsz Base.cCs t|d|ƒS)Nr)Úsetattr)r3rŒr5r5r6rãÖscCs t|ddƒS)Nr)rä)r3r5r5r6rãØszDNF SWDB Interface Object)ÚfgetÚfsetÚfdelÚdoccsFˆjj}t|jƒƒ‰ˆjƒ}|jƒ|jƒjƒ}xT|jƒD]H‰|jˆƒ}|d}ˆj j |dƒˆj j ˆdƒ|j ˆ||dd…ƒq:Wx„|j ƒD]x‰ˆj j ˆdƒ|jˆƒ}t ˆƒ}g}x0|D](} t | ƒ|krÜ|jd| ƒq¾|j| ƒq¾W|d} |jˆ| |dd…ƒq�WxÆ|jƒD]º‰ˆj j ˆdƒ|jˆƒ}‡‡fdd„|Dƒ}|jˆƒ} ˆ|k�rt|jˆjd ��rt|jˆƒ} x0|D](} |j| ƒ} tjj| | ƒdk�rz| } �qzW|jˆ|| ƒ‡fd d „}tjj||ƒ�qWxÔ|jƒD]ȉ|jˆƒ}d}x"|D]}|jˆjk�rö|}P�qöW|dk�r*|jdƒ}n |j|ƒ‡‡fd d„|Dƒ}‡fd d „}tjj||ƒˆ|k�rz|jˆ|ƒn|jˆ||ƒˆj j |dƒˆj j ˆdƒ�qÞW|j ƒ}|�rBˆj!j"t#j$d�jƒ}|j%|d�xh|D]`‰|jˆjd ��r|d}|j|ƒˆjj&||j|ƒƒˆj j ˆdƒ|jˆƒ} |j'ˆ| ƒ�qÞW|S)NrZddÚdr–r{r[cs$g|]}|ˆks|jˆjkr|‘qSr5)Úname)rZr[)Ú all_obsoletedÚpkgr5r6r\üsz*Base._goal2transaction..)rêcsˆjj|dƒS)NÚod)r"Ú pkg_added)rì)r3r5r6rã sz(Base._goal2transaction..cs$g|]}|ˆks|jˆjkr|‘qSr5)rê)rZr[)rërìr5r6r\scsˆjj|dƒS)Nrí)r"rî)rì)r3r5r6rã!sZudÚu)Úflags)Zpkg__neqrUéÿÿÿÿ)(rÄr(rZlist_obsoletedÚ_get_installonly_queryrxÚ installedÚlist_downgradesZobsoleted_by_packager"rîZ add_downgradeÚlist_reinstallsÚstrÚinsertrwZ add_reinstallÚ list_installsÚ get_reasonÚfilterrêrˆrŠZTransactionItemReasonCompareZ add_installrr™ZmapallÚ list_upgradesÚpopÚremoveZ add_upgradeZ list_erasuresr`rqrKÚIGNORE_EXCLUDESrrÚ set_reasonZ add_erase)r3r¤ÚtsZinstallonly_queryZinstallonly_query_installedZobsZ downgradedZ nevra_pkgÚ obsoletesZobs_pkgZ reinstalledÚreasonZobsoleteZreason_obsoleteÚcbZupgradedr[ZerasuresZremaining_installed_queryZ remainingr5)rërìr3r6Ú_goal2transactionÛs†                        zBase._goal2transactioncCsd|jƒ}|jƒ}|jƒjƒ}g}g}x6|D].}||krJ|j||dƒq*|j||ƒq*W||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Ú availablerw)r3ÚqÚinstZ inst_per_archZavail_per_archZavail_lZinst_lZnar5r5r6Ú_query_matches_installed7s  zBase._query_matches_installedcCs"|jjƒjƒj|jƒd�}t|ƒS)zƒ See if sltr matches a patches that is (in older version or different architecture perhaps) already installed. )rì)r`rqrórrÚmatchesÚlist)r3Úsltrrr5r5r6Ú_sltr_matches_installedKszBase._sltr_matches_installedcs‡fdd„ˆjjƒjƒDƒS)z5Get iterator over the packages installed by the user.c3s|]}ˆjj|ƒr|VqdS)N)rÄZuser_installed)rZrì)r3r5r6ú Tsz*Base.iter_userinstalled..)r`rqró)r3r5)r3r6Úiter_userinstalledRszBase.iter_userinstalledcCs0|j||jj|jj d�}|jjr,|jdƒ|S)N)Úallow_uninstallÚ force_bestZignore_weak_depsz./debugdata/rpms)Úrunr4ÚbestZinstall_weak_depsrbZwrite_debugdata)r3r¤Ú allow_erasingÚretr5r5r6Ú_run_hawkey_goalWs  zBase._run_hawkey_goalc Cstd}|jƒtjjdƒ}|jjƒ|j}|jƒrJ|j|j j ƒj ƒ|j ƒn|j jsd|jƒ}|j|ƒ|j|j j ƒj|j jd�ƒ|j||ƒs¾|j jdkr |jƒtjj|jƒƒ}tjj|ƒ}n |j|ƒ|_|jjƒ|ƒ|jdk oðt|jƒdk}|�r|jj ƒ}|�rtjj!|ƒ}|dk �r"|‚|j"j#ƒ|jj$ƒ}||jj%ƒ7}||jj&ƒ7}||jj'ƒ7}|j j(|j)|ƒ|S)zBuild the transaction set.NZdepsolve)rêér)*Ú_finalize_comps_transrr#r¦r"ÚstartrZ req_has_eraseZpush_userinstalledr`rqrórÄr4Zupgrade_group_objects_upgradeÚ_build_comps_solverZ'_exclude_packages_from_installed_groupsZ add_protectedrrZprotected_packagesrÚ debuglevelZ log_decisionsr™Ú_format_resolve_problemsÚ problem_rulesrQZ DepsolveErrorrrÚendrpZ_rpm_limitationsrcr*Z run_resolvedrørûrôrõZset_modules_enabled_by_pkgsetra) r3rÚexcr¡r¤Úsolverr¢Zgot_transactionZnew_pkgsr5r5r6Úresolve_sH              z Base.resolvec Cs^t|tƒs|g}tjjjƒgt|ƒ}|jsô|jj ƒ|jj ƒ|j rÖ|j j sV|j j rÖd}t|dƒrx|jrxdj|jƒ}nt|dƒr”|jr”dj|jƒ}|jjƒ}|dkr²|jjƒ}n|j}|jj|gg|ƒ|jj|ƒ|jjƒ|jjƒd|_dSd}tjtdƒƒtj j!|j"j#|j"j$ƒ}|��ä|jj%|j&ƒ|j'ƒ}|�rxtdƒ}tj(|ƒx|D]}tj(|ƒ�qXWtj)j*|ƒ‚tjtdƒƒtj+j,dƒ} tjtd ƒƒ|j&j-ƒ|j&j.ƒtjjj/|dd �} |j&j0| ƒ} t1| ƒd k�r\x&| j2ƒD]}tj3td ƒj4|ƒƒ�qêWtd ƒd} x| D]} | dt5| ƒ7} �qW|j6| ƒ}|�rP| d|7} tj)j7| ƒ‚~ tjtdƒƒ|j&j8t9j:ƒ�r€dS| ƒ|jj ƒ|jj ƒtj+j,dƒ} tjjj/||d�}|j"j;dk�rÞx|j|d�}WdQRX| ƒ|jj?|jƒ|jjƒdd„}x&tj@jA||j|ƒD]}tjB|ƒ�qFW|S)NÚargsú ÚcmdsTzRunning transaction checkz%Error: transaction check vs depsolve:zTransaction check succeeded.ztransaction testzRunning transaction test)rÏrzRPM: {}zTransaction test error:Ú z %s zTransaction test succeeded.rŠ)ÚdisplayséFzRunning transaction)rcSs,g}x"|D]}|jdj|t|ƒƒƒq W|S)Nz{}: {})rwrOrö)ÚactionZtsisÚmsgsÚtsir5r5r6Ú _pto_callbackùs z*Base.do_transaction.._pto_callback)CÚ isinstancerrZyumZrpmtransZLoggingTransactionDisplayr rŠrar‚ZupdateFailSafeDatarÚgroupÚenvÚhasattrr"ržr$rÄÚlastr`Ú_rpmdb_versionÚend_rpmdb_versionÚbegrr*Zrun_pre_transactionZrun_transactionr+rMršrr©Zbuild_rpmdb_lockr4r‰r«Z_populate_rpm_tsrÎÚ_run_rpm_checkÚerrorrQZTransactionCheckErrorr#r¦ÚorderZcleanZRPMTransactionrÏrpÚmessagesrÕrOr Ú_trans_error_summaryrcÚ isTsFlagSetr(ÚRPMTRANS_FLAG_TESTrr&r2Ú_run_transactionZunload_removed_pluginsr™Z_post_transaction_outputrN)r3ZdisplayÚcmdlineÚoldZ rpmdb_versionÚtidr©r)r¢r¡ZtestcbZtserrorsÚ errstringZdescrÚsummaryrZdisplay_r+r5r5r6Údo_transaction—s”                              zBase.do_transactioncCsüd}tjdƒ}i}x‚|j|ƒD]t}|jdƒdkr>t|jdƒƒntjt|jdƒƒdƒ}|jdƒ|krr|||jdƒ<||jdƒ|kr|||jdƒ<qW|rà|tdƒd 7}x4|D],}|d td d ||ƒj |||ƒd 7}q°W|sèd Std ƒd|}|S)zÚParse the error string for 'interesting' errors which can be grouped, such as disk space issues. :param errstring: the error string :return: a string containing a summary of the errors Úz9needs (\d+)(K|M)B(?: more space)? on the (\S+) filesystemr'ÚMr–g�@ézDisk Requirements:r%z z7At least {0}MB more space needed on the {1} filesystem.Nz Error Summaryz ------------- ) ÚreÚcompileÚfinditerr-r·ÚmathZceilrr rO)r3r?r@ÚpZdiskÚmZ size_in_mbÚkr5r5r6r8s&   *zBase._trans_error_summarycCs|jjo|jjtjƒ S)N)r4Zhistory_recordrÎr9r(r:)r3r5r5r6Ú_record_history%szBase._record_historycCsød}|jƒrèt|jjƒ}|jjƒjƒ}|j|d�jƒ}|jj ƒ}|j j ƒ}|dk rX|j }|dksh||kr‚t jtdƒjtjjd�ƒd}t|dƒr¤|jr¤dj|jƒ}nt|dƒrÀ|jrÀdj|jƒ}|jjrÐ|jjnd} |j j||g|| ƒ}|jj�r$tjd ƒ} | �r$ytj| ƒWnd } YnXt jtjjd ƒ|j j|j!dƒ} t jtjjd ƒ|jj�rzytj| ƒWn YnXtjj"|j |j#ƒ| dk�r˜nÎt$| ƒd k�rúd d „|j Dƒ} | �sfx&|j%ƒD]} t j&tdƒj| ƒƒ�qÆWtdƒ} tj'j(| ƒ‚nlt j&tdƒƒx | D]}t j&t)|d ƒƒ�qW|jƒ�rR|j j*t+j,ƒ �rR|j j-|ƒtdƒ} tj'j(| ƒ‚xbdD]Z}t||ƒ�rlt.||ƒ}yt/j0|ƒWn.t1t2fk �rÂtdƒ} t j&| |ƒYnX�qlWt3|j#j4ƒ|_5|j j*t+j,ƒ�sô|j6|j7ƒ|S)zh Perform the RPM transaction. :return: history database transaction ID or None N)rêz RPMDB altered outside of {prog}.)rÂr"r#r$rBrzRPM transaction start.zRPM transaction over.cSsg|]}|jƒr|‘qSr5)ZFailed)rZZelr5r5r6r\esz)Base._run_transaction..zRPM: {}zCould not run transaction.zTransaction couldn't start:Ú ts_all_fnÚ ts_done_fnz$Failed to remove transaction file %s)rMrN)8rLr r4Zhistory_record_packagesr`rqrórúrr1rÄr0r2rMrNrrOrr™ZMAIN_PROG_UPPERr/r"ržr$Úcommentr3Z reset_nicerÞÚnicerÇr#rÈrÎr!Z_sync_rpm_trans_with_swdbrrpr7rÕrQrcr r9r(r:rÚgetattrr Úunlink_fr¬ÚOSErrorÚboolZ install_setr,Ú_verify_transactionZverify_tsi_package)r3rr>Zusing_pkgs_patsÚinstalled_queryZ using_pkgsÚrpmdbvZlastdbvr<rOZoniceÚerrorsZfailedr¢rUr[Úfnr5r5r6r;)s~                 zBase._run_transactioncsèdd„|jDƒ}t|ƒ‰‡‡fdd„}tjjdƒ}d}tjj|ƒ}|jƒjƒ}t dd„|Dƒƒ}xH|j j D]<} | j ƒ} x.| j ƒD]"} | jƒ|kr€| jdƒ| jƒq€WqjWx|D]} || j|ƒ}q°W|jƒ} |j j| ƒ|ƒd|_dS) NcSsg|]}|jtjjkr|‘qSr5)r(rˆrŠZ#TransactionItemAction_REASON_CHANGE)rZr*r5r5r6r\ˆsz,Base._verify_transaction..cs |d7}ˆdk rˆ||ˆƒ|S)Nr–r5)rìÚcount)ÚtotalÚ verify_pkg_cbr5r6Údisplay_bannerŒs z0Base._verify_transaction..display_bannerzverify transactionrcSsg|] }|j‘qSr5)rê)rZr[r5r5r6r\™sT)rŠrprr#r¦r`Ú rpmdb_sackrqrórrÄr-ZgetCompsGroupItemZ getPackagesZgetNameZ setInstalledr‚rìr1rr+)r3r\Ztransaction_itemsr]r¡rZr^rÚnamesZtiÚgrIr*rWr5)r[r\r6rU†s(       zBase._verify_transactionc sXtjj|jj|jjƒ}|��¾tjƒ}tdd„|Dƒƒ}tdd„|Dƒƒ} ˆj j j dkrnˆj t|ƒ|| d�nˆj t|ƒ|ƒtj j |||ƒ‰ˆjƒr¦tjjˆjƒƒ‚t‡fdd„|Dƒƒ} tj jd|ˆjƒ} |jj} | dk} xÔˆjoð| sô| dk�r²| dk�r| d 8} td ƒ}tj|ƒd d„ˆjDƒ}‡fd d„|Dƒ}td d„|Dƒƒ}ˆj t|ƒ|ƒtj j |||ƒ‰ˆjƒ�r†tjjˆjƒƒ‚| t‡fdd„|Dƒƒ7} tj j| |iƒ} qàWˆj�rÖtjjjˆjƒ}tj|ƒWdQRX|dk �rô|| |ƒ| \}}||k�rT||k�rtdƒ}n||k�r,tdƒ}d||d}tj||d|d|ƒdS)Ncss|] }|jVqdS)N)Ú download_size)rZÚploadr5r5r6r´sz1Base._download_remote_payloads..cSsg|]}t|tjjƒr|‘qSr5)r,rÚdrpmZ DeltaPayload)rZZpayloadr5r5r6r\¶sz2Base._download_remote_payloads..é)Z total_drpmsc3s|]}ˆj|ƒVqdS)N)Ú_bandwidth_used)rZrb)rXr5r6rÁsrr–z,Some packages were not downloaded. Retrying.cSsg|]}|‘qSr5r5)rZrìr5r5r6r\Ïscs g|]}tjj|ˆtjjƒ‘qSr5)rrSÚ _pkg2payloadÚ RPMPayload)rZrì)Úprogressr5r6r\Ñscss|] }|jVqdS)N)ra)rZrbr5r5r6rÓsc3s|]}ˆj|ƒVqdS)N)re)rZrb)rXr5r6rÜsz?Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)zIFailed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)édir')rrii)rr©Zbuild_download_lockr4rŽr«r­ÚsumrprÚ__code__Ú co_argcountrSZ_download_payloadsZ_irrecoverablerQZ DownloadErrorZ_update_savingZ _recoverableÚretriesrrMršZ errmap2str)r3ÚpayloadsrcrhÚcallback_totalZ fail_fastr©Z beg_downloadZest_remote_sizeZ total_drpmZ remote_sizeZsavingrmZforeverr¢Zremaining_pkgsÚrealZfullZpercentr5)rXrhr6Ú_download_remote_payloads°sb              zBase._download_remote_payloadsc sà|j|ƒ\}}|rzˆdkr$tjjƒ‰tjj|jjƒjƒˆ|j j ƒ‰|j dd„|Dƒƒ‡‡fdd„|Dƒ}|j |ˆˆ|ƒ|j j rÜxX|D]P}|jr®tjj|jƒ|jjdƒƒ}ntjj|jj|jjdƒƒ}tj||j j ƒqˆWdS)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|] }|jƒ‘qSr5)ÚlocalPkg)rZrìr5r5r6r\sz*Base.download_packages..cs$g|]}tjj|ˆˆjtjjƒ‘qSr5)rrSrfZ delta_factoryrg)rZrì)rcrhr5r6r\sú/)Ú_select_remote_pkgsrr!ZNullDownloadProgressrcZ DeltaInfor`rqrór4Zdeltarpm_percentager?rqr=ZbaseurlrÞrßržZget_local_baseurlÚlocationÚlstriprSZpkgdirÚshutilÚcopy) r3ZpkglistrhroÚ remote_pkgsZ local_pkgsrnrìrur5)rcrhr6Údownload_packagesòs"      zBase.download_packagescCsêg}|s |S|jjƒr&tjjtdƒƒ‚g}xŽ|D]†}tjj|ƒ rhd|krhtj j ||j |ƒ}|j |gƒy|j |jj|ƒƒWq0tk r´}ztj|ƒ|j |ƒWYdd}~Xq0Xq0W|jdd�|ræ|rættdƒjdj|ƒƒƒ‚|S)NzACannot add local packages, because transaction job already existsz://T)rzzCould not open: {}r#)rZ req_lengthrrQrcrrÞrßràr™Z_urlopen_progressr4r?rwr`Zadd_cmdline_packager¬rMrdrrOrž)r3Ú path_listÚstrictrhÚpkgsZ pkgs_errorrßrUr5r5r6Úadd_remote_rpmss(       zBase.add_remote_rpmsc Cs|jr|jj}d}n|j|j}|j}|j }|�r|jj}tj j j |ƒ}tj j j ||jƒƒ}tjj|jƒƒ}~|dkr„d} d} n€|dkr¨|r–d} nd} tdƒ|} n\|dkrÂd} tdƒ|} nB|dkrê|rÔd} nd} d} tdƒ|} n|d k�rd} 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. rrBr–r'z"Public key for %s is not installedzProblem opening package %srDz Public key for %s is not trustedrdzPackage %s is not signed)Ú _from_cmdliner4Zlocalpkg_gpgcheckr^r~ZgpgcheckÚgpgkeyrYrr(rŠÚinitReadOnlyTransactionZ miscutilsZcheckSigrrrÞrßÚbasenamer) r3ÚpoÚcheckZ hasgpgkeyrSÚrootrZ sigresultZlocalfnÚresultr¢r5r5r6Ú_sig_check_pkg(sF    zBase._sig_check_pkgcCs |j|ƒ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‡)r3rìr5r5r6Úpackage_signature_checkcs zBase.package_signature_checkc Cslxf|D]^}tjj|ƒsqytj|ƒWn&tk rLtjtdƒ|ƒwYqXtj t j j tdƒ|ƒqWdS)NzCannot remove %sz %s removed) rÞrßràr rRrSrMrdrrÇrr#rÈ)r3ÚpackagesrYr5r5r6rÃrs   zBase._clean_packagesrhcCsˆ|dkr|jj}|dkr*|j|||||ƒStjj|ƒ s.) r4ZshowdupesfromreposÚ _list_patternrr™Úis_string_typeÚAssertionErrorrØÚpartialrpÚmaprÙ)r3Ú pkgnarrowÚpatternsrŠr‹rmZlist_fnZyghsr5r5r6Ú_do_package_listss  zBase._do_package_listsc&s„‡‡fdd„‰‡fdd„}‡fdd„}tj|d�}g} g} g} g} g} g}g}g}g}g}|}ˆjjƒ}|dk r�tjj||d�}|jˆjd d �}|d k�r¬i}i}xH|jƒD]<}|||j <|rÀq¬|j |j f}||ksà|||kr¬|||<q¬Wt ||j ƒƒƒ} ||jƒƒ}|�s|jd d �}xŒ|D]„}|�rN|j |k�rB| j|ƒn | j|ƒnT|j |j f}|j |k�rr| j|ƒn0||k�sŒ|j||ƒ�r˜| j|ƒn | j|ƒ�q W�n˜|dk�rô||ƒjd d�} ˆj| d d�} | jddgd�| jƒjƒ} �nP|dk�rt ||jƒƒƒ} �n2|dk�rB|�rš||ƒjƒ}|jƒjƒ}x\|D]T‰ˆj ˆj f}|j|gƒ}‡fdd„|Dƒ}t|ƒdk�rˆ| jˆƒn | jˆƒ�q@Wn¤||ƒjƒjd d �jƒ}|jƒjƒjƒ}xz|D]r\} }!|| |!fd‰|j| |!fdgƒd}"|" �s ˆj|"ƒ�r| jˆƒn"ˆj|"ƒ�r.| jˆƒn | jˆƒ�qÈW�n|dk�rh||ƒjˆjjƒ}#|#jƒ}nÜ|dk�rЇfdd„|jƒDƒ}nº|dk�r|jƒ}$|ˆjjƒƒj|$d�}ˆj|d d d�}|jddgd�g}xl|D],‰ˆj}%|j‡fdd„|$j|%d �Dƒƒ�qÜWn6|d!k�rD|jƒ}|�s2|jd d �}||ƒj ˆj!j"ƒ}| |_| |_| |_#| |_$| |_%||_||_&||_"||_||_'|S)"Ncsˆdkr dSˆjj|ƒˆkS)z:Test whether given package originates from the repository.NT)rÄrS)Úpackage)rmr3r5r6Ú is_from_repoªsz(Base._list_pattern..is_from_repocs‡fdd„|DƒS)z=Filter out the packages which do not originate from the repo.c3s|]}ˆ|ƒr|VqdS)Nr5)rZr–)r—r5r6r²sz=Base._list_pattern..pkgs_from_repo..r5)r‰)r—r5r6Úpkgs_from_repo°sz*Base._list_pattern..pkgs_from_repocsˆdkr |S|jˆd�S)z=Filter out the packages which do not originate from the repo.N)rm)rú)rq)rmr5r6Úquery_for_repo´sz*Base._list_pattern..query_for_repo)Úiter)r‹F)rkrhT)Zlatest_per_arch_by_priorityÚupgrades)Zupgrades_by_priority)ÚupgradeÚsrcÚnosrc)Ú arch__neqrórcsg|]}|jˆjkr|‘qSr5)Úevr)rZrì)Ú avail_pkgr5r6r\sz&Base._list_pattern..rÚ autoremoveÚextrascsg|]}ˆ|ƒr|‘qSr5r5)rZrì)r—r5r6r\sr)Zobsoletes_by_priority)rdrœcsg|] }ˆ|f‘qSr5r5)rZr=)Únewr5r6r\.s)ÚprovidesÚrecent)(r Z GenericHolderr`rqrrsrtrvróZpkgtuprêr‡r rœrrrrwZevr_gtÚ_merge_update_filtersÚlatestrrrÔrpZevr_eqÚ _unneededrÄÚswdbr£rúrÚextendZ_recentr4r¦Úreinstall_availableÚ old_availableÚupdatesÚobsoletesTuplesr¢)&r3r“ÚpatternrŠr‹rmr˜r™Zyghrórr¬r­r®rr¯r¦r£r¢Zicrr|ZdinstZndinstrƒÚkeyZavailrìZinstalled_dictÚinstalled_pkgsZsame_verZavailable_dictrêr‡Zinst_pkgZ autoremove_qrZobsoleted_reldepsr5)r¡r—r¤rmr3r6rލsÔ                                      zBase._list_patterncCs|j|7_t|ƒS)N)rrp)r3Útransr5r5r6Ú_add_comps_transEszBase._add_comps_transcs¤|jƒ}|sdS|jˆjjdd�}|j‡fdd„|Dƒd�}|j|ƒ}x|D]}ˆjj|tjj ƒqLW|j |ƒ}|j |ƒ}|r x |D]}ˆj j |ˆj jd�q„WdS)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)rbcs g|]}ˆjjj|jƒr|‘qSr5)rÄr-Zis_removable_pkgrê)rZr[)r3r5r6r\Usz,Base._remove_if_unneeded..)rì)Ú clean_deps)róZ_safe_to_removerÄrªrúÚ differencerÿrˆrŠZ TransactionItemReason_DEPENDENCYÚ intersectionrÚeraser4Úclean_requirements_on_remove)r3rqZ unneeded_pkgsZunneeded_pkgs_historyZpkg_with_dependent_pkgsrìZremove_packagesr5)r3r6Ú_remove_if_unneededIs     zBase._remove_if_unneededcs>ˆj}ˆjjd}‡fdd„}‡fdd„}dd„}ˆjjƒjdd �}|jtj|dd �f|j tj|d d �f|j |f|j |ff}x²|D]ª\}} x |D]˜} d | j i} | j r²| jd |iƒˆjjƒjf| Žjƒ} | jddgd�| �s | j } | j rö| d|7} tjtdƒj| ƒƒq�| | || ƒ}ˆjjj| j ƒq�Wq‚Wˆj|ƒdS)NrÝcs,tjjˆjƒ}|j|d�ˆjj|d�|S)N)rì)Úselect)rÚselectorÚSelectorr`rrrœ)rqÚ remove_queryÚ comps_pkgr )r3r5r6Ú trans_upgradegs z1Base._finalize_comps_trans..trans_upgradecsâˆjjdkrr|js"ˆj||d�qÞ|jƒjƒ}ˆj|ƒtjj ˆj ƒ}|j dj |j |jƒd�ˆjj|| d�nltjj ˆj ƒ}|jr |j dj |j |jƒd�n,ˆjjrÀ|jˆj jƒj|d�ƒ}|j |d�ˆjj|| d�|S)Nrh)r|z ({} if {}))r¥)r»Úoptional)r)rì)r4Úmultilib_policyZrequiresÚ_install_multiarchrórxÚ_report_already_installedrr¼r½r`rrOrêrÚinstallrrurqrr)rqr¾r¿r|rVr )r3r5r6Ú trans_installms     z1Base._finalize_comps_trans..trans_installcSs|j|ƒ}|S)N)ru)rqr¾r¿r5r5r6Ú trans_remove„s z0Base._finalize_comps_trans..trans_removeT)ri)r|Frêr‡r�rž)rŸÚ.zNo match for group package "{}")rr4rXr`rqrrrÅrØr‘Ú install_optrœrýrêZ basearchonlyr<rxrMrdrrOrZ group_membersrÊrº)r3r³rÝrÀrÆrÇr¾Zattr_fnÚattrrYr¿Z query_argsrZpackage_stringr5)r3r6rcs4        zBase._finalize_comps_transcs ‡fdd„}tjjˆjˆj|ƒS)Nc sNˆjjƒjƒj|d�}|sdSyˆjjj|dƒStk rHtj j SXdS)N)rêr) r`rqrórrrÄr(rùÚAttributeErrorrˆrŠZTransactionItemReason_UNKNOWN)Zpkgnamer)r3r5r6Ú reason_fn¡sz+Base._build_comps_solver..reason_fn)rrZSolverrÄr)r3rÌr5)r3r6r s zBase._build_comps_solvercCsXtjj|ƒst‚|jƒ}t|tƒs.tjj |ƒ}|j |||p>t ƒ||ƒ}|sNdS|j |ƒ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�r�rr,r·rˆrŠÚlistToCompsPackageTypeZ_environment_installrr´)r3Úenv_idÚtypesÚexcluder|Úexclude_groupsr r³r5r5r6Úenvironment_install¬s  zBase.environment_installcCs,tjj|ƒst‚|jƒ}|j|ƒ}|j|ƒS)N)rr™r�r�rZ_environment_remover´)r3rÎr r³r5r5r6Úenvironment_remove¾s zBase.environment_removec s¦‡fdd„‰tjj|ƒst‚d}|rB‡fdd„|Dƒ}tjj|ƒ}ˆjƒ}t|t ƒs`t j j |ƒ}|j ||||ƒ}|sxdS|r„|j} n|j} tjtdƒ|| ƒˆj|ƒ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) cs6tjj|ƒr,ˆjjƒj|d�}tdd„|ƒS|fSdS)N)Ú name__globcSs|jS)N)rê)rIr5r5r6rãÕszABase.group_install.._pattern_to_pkgname..)rr™Úis_glob_patternr`rqrrr’)r°r)r3r5r6Ú_pattern_to_pkgnameÒs z/Base.group_install.._pattern_to_pkgnameNcsg|] }ˆ|ƒ‘qSr5r5)rZrI)rÖr5r6r\Üsz&Base.group_install..rz#Adding packages from group '%s': %s)rr™r�r�Ú itertoolsÚchainÚ from_iterablerr,r·rˆrŠrÍZ_group_installrÅrÉrMrNrr´) r3Úgrp_idZ pkg_typesrÐr|Zexclude_pkgnamesZnested_excludesr r³Zinstlogr5)rÖr3r6Ú group_installÅs$     zBase.group_installcCsöt|j|jtjtjBtjƒ}d}d}x²|D]ª} y|j| ƒ} Wn:tjj k rv} zt j t | ƒƒd}w*WYdd} ~ XnXx2| j D](} | s’| |kr€||j| |||d�7}q€Wx&| jD]} ||j| ||||d�7}q´Wq*W| rò|ròtjjtdƒƒ‚|S)NrTF)rÐr|)rÐr|rÑzNothing to do.)rrrÄÚ ENVIRONMENTSÚGROUPSÚ AVAILABLErÔrrQrárMr5r ÚgroupsrÛÚ environmentsrÒrcr)r3r”rÏr|rÐrÑrÚcntÚdoner°ÚresÚerrZgroup_idrÎr5r5r6Úenv_group_installïs(    zBase.env_group_installcCs,tjj|ƒst‚|jƒ}|j|ƒ}|j|ƒS)N)rr™r�r�rZ _group_remover´)r3rÚr r³r5r5r6Ú group_removes zBase.group_removecCs¶t|j|jtjtjBtjƒ}y|j|Ž}WnFtjj k rp}z&t j dt |ƒƒtjj tdƒƒ‚WYdd}~XnXd}x|jD]}||j|ƒ7}q~Wx|jD]}||j|ƒ7}qœW|S)Nz Warning: %szNo groups marked for removal.r)rrrÄrÜrÝÚ INSTALLEDrÔrrQrárMr5r rcrràrÓrßræ)r3r”rrãrärár.Úgrpr5r5r6Úenv_group_remove s  "  zBase.env_group_removec CsLt|j|jtjtjBtjƒ}d}�x |D�]}y|j|ƒ}Wn6tjj k rr}zt j t |ƒƒw(WYdd}~XnXxX|j D]N}y|j|ƒd}Wq|tjj k rÈ}zt j t |ƒƒw|WYdd}~Xq|Xq|WxZ|jD]P}y|j|ƒd}WqÖtjj k �r$}zt j t |ƒƒwÖWYdd}~XqÖXqÖWq(W|�sHtdƒ} tjj| ƒ‚dS)NFTzNo group marked for upgrade.)rrrÄrÝrÜrçrÔrrQrárMr5r ràÚenvironment_upgraderßÚ group_upgraderr‘ZCliError) r3r”rZgroup_upgradedr°rãrär.rèr¢r5r5r6Úenv_group_upgrades6      zBase.env_group_upgradecCs,tjj|ƒst‚|jƒ}|j|ƒ}|j|ƒS)N)rr™r�r�rZ_environment_upgrader´)r3rÎr r³r5r5r6rê9s zBase.environment_upgradecCs,tjj|ƒst‚|jƒ}|j|ƒ}|j|ƒS)N)rr™r�r�rZ_group_upgrader´)r3rÚr r³r5r5r6rë@s zBase.group_upgradecCsª|jjd}tjj|ƒrdS|jj}tjjj |d�}|j tj tj Bƒ|j ddƒ}t|ƒ}~~|dkrldStjj|ƒ}tjj|ƒsŽtj|ƒt|dƒ}|jƒ~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)r4rŽrÞrßràrYrr(rŠr�r×Ú_RPMVSF_NOSIGNATURESÚ_RPMVSF_NODIGESTSZdbMatchrpÚdirnameÚmakedirsÚopenr9)r3ZgpgkeyscheckedrYZmytsÚidxÚkeysZmydirZfor5r5r6Ú_gpg_key_checkGs&       zBase._gpg_key_checkc Cs |j|ƒ\}}|j|ƒx~|D]v}tjj|jƒ}|jjƒj|d�}|jj rb|j |jjƒj|d�ƒ}|j |d�}|dk r‚|j |d�}|j j || d�qWt|ƒS)N)rì)r)rm)r»rÁ)r rÄrr¼r½r`rqrrr4rrurrrÅrp) r3rqrmr|Ú already_instrr‰r rr5r5r6rÃes    zBase._install_multiarchcCs,tjƒ}tjƒ}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 )ÚargparseZ Namespacer )r3rÅrÐÚ install_specsÚ exclude_specsr5r5r6Ú_categorize_specsss   zBase._categorize_specscsddd„|jDƒ‰‡fdd„|jDƒ}|jjƒj|d�}|jjƒjˆd�}|jj|ƒ|jj|ƒdS)NcSsg|]}tjj|ƒr|‘qSr5)rr™rÕ)rZrÐr5r5r6r\†sz/Base._exclude_package_specs..csg|]}|ˆkr|‘qSr5r5)rZrÐ)Ú glob_excludesr5r6r\ˆs)rê)rÔ)Ú pkg_specsr`rqrúry)r3rùÚexcludesr}Zglob_exclude_queryr5)rûr6Ú_exclude_package_specs…s  zBase._exclude_package_specsc CsØtƒ}t|j|jtjtjBtjtjBƒ}x¦|D]ž}y|j|ƒ}Wn8t j j k rx}zt j dt|ƒƒw.WYdd}~XnX|j|jƒ|j|jƒx8|jD].}|jj|ƒ}x|jƒD]} |j| jƒq´WqšWq.Wt|ƒS)NzWarning: Module or %s)rrrrÄrÜrÝrÞrçrÔrrQrárMr5r r<rßràZ_environment_by_idZ groups_iterrÊrPr ) r3Ú group_specsrßrr°rãräZenvironment_idZ environmentr-r5r5r6Ú_expand_groups‘s"       zBase._expand_groupsc Cs†x€|D]x}yL|jj}d|kr<|jdƒ}|d}|djdƒ}|j|g|||j|jƒWqtjjk r||j d|ƒYqXqWdS)Nrsrr–ú,ú@) r4Zgroup_package_typesÚsplitrårüÚ grp_specsrrQrcrw)r3rÿrýZskippedr|Z group_specrÏrr5r5r6Ú_install_groups¨s   zBase._install_groupscCs®|dkr g}g}g}g}g} |j||ƒ\} } |j| ƒxd| jD]Z} y|j| |||d�Wq>tjjk r–} ztjt | ƒƒ|j | ƒWYdd} ~ Xq>Xq>Wg}f}t o¬| j �rLy tj jj|ƒ}|j| j |ƒWnxtjjk �rH} zV| j�r x| jD]}|j |ƒqøW| j�r2x| jD]}|j d|ƒ�qW| j}WYdd} ~ XnXn| j }|�rv|j| j ƒ| _ |j|| ||ƒ|�s”|�s”|�s”| �s”|�rªtjj|||| |d�‚dS)N)rmr|Úformsr)Úno_match_group_specsÚerror_group_specsÚno_match_pkg_specsÚerror_pkg_specsÚmodule_depsolv_errors)rúrþrürÅrrQÚ MarkingErrorrMr5rörwrorrerfZ ModuleBaseZ MarkingErrorsrrr rr)r3rÅrÐrmr|rrrr r rørùÚspecrUZno_match_module_specsr rfZe_specr5r5r6rø·sN      zBase.install_specsc CsÒtjj|ƒ}|j|j|dd�}|jjdks4|j|ƒrr|d}|dk rP|j|d�|sb|j |||ƒ|j |||d�S|jjdkrÎ|j |||jj |d |d �}|sª|j |||ƒx|D]} |j j| | d �q°Wd Sd S)z@Mark package(s) given by pkg_spec and reponame for installation.F)rÚwith_srcrhrqN)rm)rmr|rT)rrrmÚreportsÚsolution)r»rÁr–r)rrsrtÚget_best_solutionr`r4rÂZ_is_arch_specifiedrrÚ_raise_package_not_found_errorrÃÚ_get_best_selectorsrrrÅ) r3Úpkg_specrmr|rr|rrÚsltrsr r5r5r6rÅæs,    z Base.installcCsÈ|jrd}t|ƒ‚|jjƒjƒj|j|jdgd�}|shtdƒ}t j ||jƒt j j tdƒ|j|jƒ‚n\t|ƒd|krªt jj|jƒ}|j|gd�|jj|| d�d Std ƒ}t j ||jƒdSdS) Nz-downgrade_package() for an installed package.Únoarch)rêr‡z.Package %s not installed, cannot downgrade it.zNo match for argument: %sr)rì)r»rÁr–zCPackage %s of lower version already installed, cannot downgrade it.)Ú _from_systemÚNotImplementedErrorr`rqrórrrêr‡rrMrdrrQr ruÚsortedr¼r½rrrÅ)r3rìr|r¢rr r5r5r6Úpackage_downgrades  zBase.package_downgradecCs–|jjƒj|j|j|jƒ}|j|ƒ\}}||kr>|j|gƒnT|tj j |ƒkrdt j j tdƒ|jƒ‚n.t jj|jƒ}|j|gd�|jj|| d�dS)NzNo match for argument: %s)rì)r»rÁr–)r`rqÚ_nevrarêr r‡r rÄr×rØrÙrrQÚPackageNotFoundErrorrrur¼r½rrrÅ)r3rìr|rrörr r5r5r6Úpackage_installszBase.package_installcCsf|jjƒjƒj|j|j|jd�r0|jj|ƒdSt dƒ}t j |t |ƒƒt jjt dƒ|j|jƒ‚dS)N)rêr r‡r–z.Package %s not installed, cannot reinstall it.zNo match for argument: %s)r`rqrórrrêr r‡rrÅrrMrdrörrQr ru)r3rìr¢r5r5r6Úpackage_reinstall(s   zBase.package_reinstallcCs|jj|ƒdS)Nr–)rr¸)r3rìr5r5r6Úpackage_remove0s zBase.package_removecCs`|jrd}t|ƒ‚|jdkr6tdƒ}tj||jƒdS|jjƒj ƒj ƒ}|j j rš|jjƒj |gd�j |d�rštjj|jƒ}|j|gd�|jj|d�dS|jd kr´|j|jd �}n|j|j|jd gd �}|�std ƒ}tj||jƒtjjtd ƒ|j|jƒ‚nZt|ƒd|k�rBtjj|jƒ}|j|gd�|jj|d�dStdƒ}tj||jƒdSdS)Nz+upgrade_package() for an installed package.r�z.)rê)r)rmT)rrœcSsg|] }|j‘qSr5)rê)rZrìr5r5r6r\xs)rì)r»r–)r`rqrór·rrrrur›r§r¨rúrr¼r½rrrœ) r3rqrrmrZ installed_allrrVr r5r5r6Ú_upgrade_internalYs "    zBase._upgrade_internalc Csttjj|ƒ}|j|jƒ}|d}|�rZtjj|ƒ}| oH|doH|dj�r*|dj}|jjƒj ƒj ƒ}|j j r||j |d�n|jjƒjdd�} | �s*|j |d�j ƒ} | sÔtdƒ} tj| |ƒtjjtdƒ||ƒ‚nV|djoðtjj|djƒ �r*| j|djd ��s*td ƒ} tj| d j||djƒƒ|j j �oH|d�oH|djƒ} |j|| ||ƒStjjtdƒ||ƒ‚dS) NrqÚnevra)rT)ri)rêz(Package %s available, but not installed.zNo match for argument: %s)r‡z?Package %s available, but installed for different architecture.z{}.{})rrsrtrr`r™rÕrêrqrórxr4rrúrrrrMrdrQÚPackagesNotInstalledErrorr‡rOZ has_just_namer!r ) r3rrmr|rrZwildcardÚpkg_nameróZ obsoletersZinstalled_namer¢rr5r5r6rœs0    &   z Base.upgradecCs|j|jjƒ|jj|dd�S)N)r)r!r`rqr4r)r3rmr5r5r6Ú upgrade_all�szBase.upgrade_allcCs�|dkr|jjƒnxtjj|ƒ}|j|jdd�}|djtj d�|j |||j j dd�}|spt jtdƒ|ƒdSx|D]}|jj|d �qvWd S) NF)rrq)Ú reponame__neqT)rrrzNo package %s installed.r)r»r–)rZdistupgrade_allrrsrtrr`rrrKZSYSTEM_REPO_NAMErr4rrMršrZ distupgrade)r3rrsrrr r5r5r6Ú distro_sync¥s   zBase.distro_syncc Csþt|||gƒrÆ||7}d}|rF|rFx4|D]}tdƒ}tj||ƒq(Wn|rX|j|ƒrXd}xX|D]P}y|j||d�Wn4tjjk r¨} ztj t | ƒƒWYdd} ~ Xq^Xd}q^W|sútjtdƒƒn4|j j ƒj |jj|jjd�} x| D]} |j| ƒqèWdS)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)rNzNo packages marked for removal.)rb)ÚanyrrMrdrérýrrQr ršrör`rqr©rÄrªr4rbr) r3rrürÚ filenamesrâZgrp_specr¢rrUr}rìr5r5r6r¢µs,      zBase.autoremovecsptjj|ƒjˆj|d�}‡‡fdd„|jƒDƒ}|sBˆj||ˆƒˆjj}x|D]}ˆj j ||d�qPWt |ƒS)z'Mark the specified package for removal.)rcs(g|] }ˆdks ˆjj|ƒˆkr|‘qS)N)rÄrS)rZrì)rmr3r5r6r\ÞszBase.remove..)rµ) rrsrtrvr`róÚ"_raise_package_not_installed_errorr4r¹rr¸rp)r3rrmrr rórµrìr5)rmr3r6rýØs z Base.removec s tjj|ƒ}|jˆjƒ}‡‡fdd„|jƒDƒ}|jƒ} |dk rL| j|d�|dk r`| j|d�tjj | ƒ} |s„tj j d|| j ƒƒ‚d} ˆj j} x\|D]T} y| t| ƒ}Wn*tk rÔ|sÀw–ˆjj| | d�YnXˆjj|ƒ| d7} q–W| dk�rtj jd||ƒ‚| S) Ncs(g|] }ˆdks ˆjj|ƒˆkr|‘qS)N)rÄrS)rZrì)Ú old_reponamer3r5r6r\îsz"Base.reinstall..)rm)r&zno package matchedr)rµr–)rrsrtrvr`rórrrrqZ_per_nevra_dictrQr#rœr4r¹r ÚKeyErrorrr¸rÅZPackagesNotAvailableError)r3rr+Z new_reponameZnew_reponame_neqZ remove_nar|rr²Z available_qZavailable_nevra2pkgrárµZ installed_pkgZ available_pkgr5)r+r3r6Ú reinstallés6          zBase.reinstallcCs |j|ƒ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)r3rr5r5r6Ú downgrade szBase.downgradec Cstjj|ƒ}|j|jƒ}|s6tdƒ|}tjj||ƒ‚d}|jƒ}t |j ƒj ƒƒ}|jj ƒj ƒj|d�} t| ƒdkr�tdƒ|}tjj|||ƒ‚xn| j ƒj ƒD]^} |jƒj| d�} | sÌtdƒ}tj|| ƒqžtjj|jƒ} | j| d�|jj| | d�d}qžW|S) z�Downgrade to specific version if specified otherwise downgrades to one version lower than the package installed. zNo match for argument: %sr)rêz6Packages for argument %s available, but not installed.zDPackage %s of lowest version already installed, cannot downgrade it.)rì)r»rÁr–)rrsrtrvr`rrQrrr Ú _name_dictrôrqrórrrpr#Z downgradesrúrMrdr¼r½rrrÅ) r3rr|r|rr¢râZavailable_pkgsZavailable_pkg_namesZ q_installedr$Zdowngrade_pkgsr r5r5r6r. s.       zBase.downgrade_tocsš|jjƒjˆd�}|r |ˆgfStjj|jˆƒ}|r>|ˆgfSˆjdƒsRˆjdƒr^dˆg}n&ˆjdƒrr|ˆgfS‡fdd„d Dƒ}|jjƒj|d�|fS) N)Z file__globú/bin/ú/sbin/z/usrrscsg|] }|ˆ‘qSr5r5)rZÚprefix)Ú provides_specr5r6r\E sz!Base.provides..ú /usr/bin/ú /usr/sbin/)r1r2r5r6)r`rqrrrZ _by_providesÚ startswith)r3r4Z providersZbinary_providesr5)r4r6r¥6 s      z Base.providesc CsÐdddœ}||krtdƒ‚||}|rDd|} |jj| tƒƒj|ƒ|rfd|} |jj| tƒƒj|ƒ|rˆd|} |jj| tƒƒj|ƒ|rªd|} |jj| tƒƒj|ƒ|rÌd |} |jj| tƒƒj|ƒ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/Ú setdefaultrr<) r3Zcmp_typerÏr9ZbugzillaZcvesZseverityZcmp_dictZcmpr±r5r5r6Úadd_security_filtersI s& zBase.add_security_filterscCs i|_dS)z, Reset all security filters N)r/)r3r5r5r6Úreset_security_filtersn szBase.reset_security_filtersc Cs>|jp |j s| r|S|jjƒjdd�}|jrRx|jD]}|j|ƒ}q8W|g|_|jr–x<|jjƒD].\}}|rx|d}||i} |j|jf| Žƒ}qdW|j|ƒ}|�s:|�r:|j ƒ}t |j ƒj ƒƒ} | dk�r:|dk�rt dƒj| ƒ} t dƒj| ƒ} tjt| | | ƒƒn2t dƒj|| ƒ} t d ƒj|| ƒ} tjt| | | ƒƒ|S) z† Merge Queries in _update_filters and return intersection with q Query @param q: Query @return: Query T)riZ __upgraderNz3No security updates needed, but {} update availablez4No security updates needed, but {} updates availablez    zBase._merge_update_filtersc sˆjrtdƒ}t|ˆƒ‚|jˆj‰ˆj|jk}|r:gnˆj}‡‡fdd„}d}|jjˆjƒ�x |D�]} t j j | ˆƒ} �x| D�]ö} t j |j| j| jƒdkr¼tdƒ}tj|| | jƒq„|jjrút jjj| j| jƒ} t jjj| ƒ} tjt jj| | ƒƒ| | _|jj�rt j j| | ƒn t j j | ƒd}|jj!�r:d}n¨|jj"�r¦|jj�r | t jj#j$t jj#j%fk�r„d}tjt jj&tdƒƒƒnd}tjt jj&td ƒƒƒnd}n<|�rÌ|ˆ| j| j| | j'| jd œƒ}n|�râ|ˆ| j| jƒ}|�sîd}q„|jj(t)j*ƒ}|�r|jj+ƒ}|jj,|t)j*ƒ|jj-t j.| jƒƒ}|�rD|jj,|ƒ|dk�rjtd ƒ|}t j/j0||ƒƒ‚tjtd ƒƒd}q„WqhW| �r¢|�r¢t j/j0td ƒƒ‚|�sÆtdƒˆj1}t j/j0||ƒƒ‚|j2ˆƒ\}}|dk�r|�rötdƒ}tj|ƒt3|ƒ}t j/j0||ƒƒ‚dS)aºRetrieve a key for a package. If needed, use the given callback to prompt whether the key should be imported. :param po: 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 z6Unable to retrieve a key for a commandline package: %scs0|tdƒˆd7}|tdƒdjˆjƒ7}|S)Nz. Failing package is: %sz zGPG Keys are configured as: %sz, )rržr€)r¢)rƒrSr5r6Ú_prov_key_dataµ sz1Base._get_key_for_package.._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)4rrr‹r^r~rPr1r€rÊrZcryptoZretriever Z keyInstalledrÎZrpm_idrCrMršZshort_idr4r®r¯ZKeyInfoZfrom_rpm_key_objectr@Zraw_keyZDNSSECKeyVerificationZverifyZ nice_user_msgÚurlZlog_dns_key_importZlog_key_importZassumenoZ assumeyesZValidityZVALIDZPROVEN_NONEXISTENCEZany_msgrBr9r(r:Z getTsFlagsrÒZpgpImportPubkeyZ procgpgkeyrQrcrêr‡r )r3rƒÚaskcbÚ fullaskcbr¢Z key_installedZkeyurlsr?Z user_cb_failrArôršZ dns_input_keyZ dns_resultZrcZ test_flagZ orig_flagsr†Úerrmsgr5)rƒrSr6Ú_get_key_for_packagež s’                zBase._get_key_for_packagecCs|j|||ƒ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)rH)r3rìrErFr5r5r6Úpackage_import_key$ szBase.package_import_keycCs4g}|jjƒx |jjƒD]}|jt|ƒƒqW|S)N)rÎr„Zproblemsrwr )r3ÚresultsZprobr5r5r6r45 s  zBase._run_rpm_checkúw+bcKstjj||j||f|ŽS)zˆ Open the specified absolute url, return a file object which respects proxy setting even for non-repo downloads )rr™Z_urlopenr4)r3rDrSÚmoder>r5r5r6Úurlopen@ sz Base.urlopencCs,|dkr|jjtjd�}|j|jjd�}|S)N)rð)r¥)rrqrKrþrúr4r¹)r3rZ installonlyr5r5r6ròH szBase._get_installonly_querycCsrtjj|dd�}|j|jdddd�}|drn|drn|djrn||ddjkrntjtdƒj |ddjƒƒdS) NT)r‹F)rjrkrlrqr"rz * Maybe you meant: {}) rrsrtrr`rêrMršrrO)r3rr|rr5r5r6Ú_report_icase_hintN s   zBase._report_icase_hintcCs dd„}g}g}x6|D].}|jƒr:|jtjkrD|j|ƒq|j|ƒqWtdƒ}|||ƒsjtjjtdƒƒ‚|j j r˜tdƒ}|||ƒs”tjjtdƒƒ‚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 cSsxd}xn|D]f}d}y |jƒ}Wn0tk rN}ztjt|ƒƒWYdd}~XnX|dk r tj|j||jƒƒd}q W|S)NTF)ZverifyLocalPkgrLrMrÕrörOrm)Zpkg_listZ logger_msgZall_packages_verifiedrìZpkg_successfully_verifiedrUr5r5r6Ú_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_pkgrmrKZCMDLINE_REPO_NAMErwrrrQrcr4r�)r3Z install_pkgsrOryZlocal_repository_pkgsrìr¢r5r5r6rtV s&       zBase._select_remote_pkgscCsx|D] }t|ƒqWdS)N)Ú_msg_installed)r3r‰rìr5r5r6ră s zBase._report_already_installedc Csª|jjtjd�}tjj|ƒ}|j|j|d|d�}|dk rH|dj|d�|dsdtj j t dƒ|ƒ‚nB|jjtj d�}|dj |ƒ}|r�t dƒ}nt dƒ}tj j ||ƒ‚dS) N)rðF)rrrqrq)rmzNo match for argumentz?All matches were filtered out by exclude filtering for argumentz?All matches were filtered out by modular filtering for argument)r`rqrKrþrrsrtrrrrQrrZIGNORE_REGULAR_EXCLUDESr·) r3rrrmÚ all_queryrsrZwith_regular_queryr¢r5r5r6r‡ s  z#Base._raise_package_not_found_errorc s ˆjjtjd�jƒ}tjj|ƒ}|jˆj|d|d�}|dsNtj j t dƒ|ƒ‚ˆdk rp‡‡fdd„|dDƒ}n|d}|s†t dƒ}nt d ƒ}tj j ||ƒ‚dS) N)rðF)rrrqrqzNo match for argumentcs g|]}ˆjj|ƒˆkr|‘qSr5)rÄrS)rZrì)rmr3r5r6r\¥ sz;Base._raise_package_not_installed_error..zCAll matches were installed from a different repository for argumentz?All matches were filtered out by exclude filtering for argument) r`rqrKrþrórrsrtrrQr#r) r3rrrmrQrsrrór¢r5)rmr3r6r*œ s  z'Base._raise_package_not_installed_errorcCs|jj|jdd�dS)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_confr4)r3r5r5r6Ú setup_loggers® szBase.setup_loggersc sâ|jjtjtjBtjB@r d}nd}t|jƒ}|j|ddœ}|jf|Ž}| rl|rlt j j |j ƒƒ}t j|ƒ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)rrZ ignore_weak)rcSstj|j|j|j|j|jd�S)N)rêÚepochÚversionÚreleaser‡)rKZNEVRArêrSrTrUr‡)Úitemr5r5r6rÈ sz&Base._skipped_packages.._nevracsg|] }ˆ|ƒ‘qSr5r5)rZr*)rr5r6r\Í sz*Base._skipped_packages..csg|]}ˆ|ƒˆkr|‘qSr5r5)rZrì)rÚtransaction_nevrasr5r6r\Ï scsg|]}ˆ|ƒˆkr|‘qSr5r5)rZrì)rrWr5r6r\Ñ s)rZactionsrKÚINSTALLZUPGRADEZ UPGRADE_ALLrr0rrr™rrrMrdrÚproblem_conflictsZproblem_broken_dependency) r3Zreport_problemsrŠrZngZparamsrr¢rYZproblem_dependencyZskipped_conflictsZskipped_dependencyr5)rrWr6Ú_skipped_packages¶ s(    zBase._skipped_packages)N)F)F)TT)T)N)FFF)F)F)N)T)NN)TN)rhNNFN)N)NTN)NT)TNN)NT)T)NNTN)NTN)F)T)N)N)N)N)NNNN)NN)NNNF)F)NTF)NN)NN)NrK)N)�Ú__name__Ú __module__Ú __qualname__r7r8r:r;r?rVÚ staticmethodrrgrrƒÚpropertyrr4r^Údeleterrr™Zlazyattrr†r`rarŠÚsetterr�r’r“r”r•r£r rÁrÆr9rÌr§rÅr(ZRPMTRANS_FLAG_NOSCRIPTSZRPMTRANS_FLAG_NOTRIGGERSZRPMTRANS_FLAG_NODOCSr:ZRPMTRANS_FLAG_JUSTDBZRPMTRANS_FLAG_NOCONTEXTSZRPMTRANS_FLAG_NOFILEDIGESTrÓr/rÑrîrïrÖr¤rÎr…rârÄrr r rrr!rAr8rLr;rUrqrzr~r‡rˆrÃr•rŽr´rºrrrÒrÓrÛrårærérìrêrërõrÃrúrþrrrørÅrrrrr r!rœr%r'r¢rýr-r/r.r¥r;r<r§rHrIr4rMròrNrtrÄrr*rRrZr5r5r5r6r[sþ   =      8 ; > =       '\ 8 l"] * B  ;  ) =  *     /   % &    #  & % )    -rcCs t|ƒ}tdƒ}tj||ƒdS)Nz Package %s is already installed.)r rrMrš)rìrêr¢r5r5r6rPÖ srP)HÚ__doc__Z __future__rrrrr÷rZlibdnf.transactionrˆrxrZ 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_baseroZ dnf.persistorZ dnf.pluginZ dnf.queryZdnf.repoZ dnf.repodictZdnf.rpm.connectionZdnf.rpm.miscutilsZdnf.rpm.transactionZdnf.sackZ dnf.selectorZ dnf.subjectZdnf.transactionZdnf.yum.rpmtransrØrÍrKr×r#rHrÞrÚrEr(r­rwZ getLoggerrMÚobjectrrPr5r5r5r6Úsª