a
    ©!ct­  ã                   @   sr  d Z ddlmZ ddlmZ ddlmZ zddlmZ W n eyV   ddlmZ Y n0 ddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlmZ dd	lmZ dd
lmZmZ ddlZddlZddlZddlZddlZddl Zddl!Zddl"Zddl#Zddl$Zddl%Zddl&Zddl'Zddl(Zddl)Zddl*Zddl+Zddl,Zddl-Zddl.Zddl/Zddl0Zddl1Zddl2Zddl3Zddl4Zddl5Zddl6Zddl7Zddl8Zddl9Zddl:Zddl;Zddl<Zddl=Zddl>Zddl?Zddl@ZddlAZddlBZddlCZddlDZe
 Ed¡ZFddd„ZGdd„ ZHdd„ ZIdd„ ZJG dd„ dejKƒZLG dd„ deMƒZNdS )z/
Command line interface yum class and related.
é    )Úprint_function)Úabsolute_import)Úunicode_literals)ÚSequenceNé   )Úoutput)ÚCliError)ÚucdÚ_ÚdnfÚ c                 C   s|   t |jƒd t |jƒ t |ƒ }t |jƒ}t |jƒ}d|fd|fd|ffD ],\}}| |  |d¡ | | |  d7  < qJdS )zl Get the length of each pkg's column. Add that to data.
        This "knows" about simpleList and printVer. r   ÚnaÚverÚridr   N)ÚlenÚnameÚarchZevrZ
_from_repoÚ
setdefault)ÚdataÚpkgÚindentr   r   r   ÚdÚv© r   ú//usr/lib/python3.9/site-packages/dnf/cli/cli.pyÚ_add_pkg_simple_list_lens]   s     

r   c                 C   s¸   i i i dœ}|j |j|j|j|j|jfD ]}|D ]}t||ƒ q0q(t|jƒdkrx|j	D ] \}}t||ƒ t||dd qV|d |d |d g}| j
|dd	}|d  |d  |d
  fS )zA Work out the dynamic size of the columns to pass to fmtColumns. )r   r   r   r   z    )r   r   r   r   r   )Zremainder_columné   )Ú	installedÚ	availableÚextrasÚ
autoremoveÚupdatesÚrecentr   r   Ú	obsoletesÚobsoletesTuplesZcalcColumns)r   Úyplr   Zlstr   ZnpkgZopkgÚcolumnsr   r   r   Ú_list_cmd_calc_columnsh   s    ÿ
r'   c           	      C   sÎ   dd„ }t j |¡}d}| ¡  ¡ j| dD ]œ}|r<tdƒ d}|jdkr`d|j|j	|j
f }nd	|j|j|j	|j
f }|j |j¡}ttd
ƒ||||jƒf ƒ ttdƒ|jr¶|jnd||jƒf ƒ q,d S )Nc                 S   s   t  dt  | ¡¡S )Nz%c)ÚtimeÚstrftimeÚgmtime)Úxr   r   r   Ú
sm_ui_timez   s    z"print_versions.<locals>.sm_ui_timeF)r   r   TÚ0z%s-%s.%sz%s:%s-%s.%sz  Installed: %s-%s at %sz  Built    : %s at %s)r   ÚsackÚ
rpmdb_sackÚqueryr   ÚfiltermÚprintZepochÚversionÚreleaser   ÚtermÚboldr   r
   ZinstalltimeZpackagerZ	buildtime)	ÚpkgsÚbaser   r,   r/   Zdoner   r   r   r   r   r   Úprint_versionsy   s&    
ÿÿÿr9   c              	   C   s:   t dƒ}|  ¡ D ]$\}}t | ||d |d ¡¡ qd S )NzTThe operation would result in switching of module '{0}' stream '{1}' to stream '{2}'r   r   )r
   ÚitemsÚloggerÚwarningÚformat)ÚswitchedModulesZmsg1Z
moduleNameZstreamsr   r   r   Úreport_module_switch’   s    r?   c                       sš   e Zd ZdZd!‡ fdd„	Zd"‡ fdd„	Zdd	„ Zd
d„ Zdd„ Zdd„ Z	d#dd„Z
dd„ Zg g dfdd„Zd$dd„Zd%dd„Z‡ fdd„Zdd „ Z‡  ZS )&ÚBaseCliz#This is the base class for yum cli.Nc                    s4   |pt j ¡ }tt| ƒj|d t | | j¡| _d S )N)Úconf)r   rA   ZConfÚsuperr@   Ú__init__r   ZOutput)ÚselfrA   ©Ú	__class__r   r   rC   œ   s    zBaseCli.__init__r   c              
      s  t jjrJ| jjsJt| j ¡ ƒ}|rJt|ƒ t	dƒj
t jjd}t j |¡‚| j}| j |¡}|rjt |¡ |râg }g }d}|D ]>}	|	jt jjv rž| |	j¡ q~|	jt jjv r~d}| |	j¡ q~| `|sÔ| j |¡ n| j ||¡ |s| j ¡ s| jrŒ| jjs| jjrŒ| jj r6t t	dƒj
t jj!d¡ n(d| jj"v r^t t	dƒj
t jj!d¡ |  #¡ rž| jj$s~| j %¡ sžt&t	dƒƒ‚nt t	d	ƒ¡ d
S |r@|r6t t	dƒ¡ z| jj'}
|  (|| jj)|
¡ W n^ t jj*y4 } z@t j+j
 ,t-|ƒ¡}t	dƒd|  }t.ƒ  t j |¡‚W Y d
}~n
d
}~0 0 |  /|¡ | jj rNd
S t0|t1ƒs`|g}t 2¡ gt3|ƒ }t4t5| ƒ 6|¡}|d
ur´| j7 8|g¡d }t j9j :| j7|j;¡}nd
}|rt.ƒ  t.d <| j =|¡¡ƒ t.ƒ  |D ]&}	|	j>t?jj@krät j t	dƒ¡‚qä|S )zóTake care of package downloading, checking, user
        confirmation and actually running the transaction.

        :param display: `rpm.callback.TransactionProgress` object(s)
        :return: history database transaction ID or None
        aQ  It is not possible to switch enabled streams of a module unless explicitly enabled via configuration option module_stream_switch.
It is recommended to rather remove all installed content from the module, and reset the module using '{prog} module reset <module_name>' command. After you reset the module, you can install the other stream.©ÚprogTFz7{prog} will only download packages for the transaction.ÚtestzP{prog} will only download packages, install gpg keys, and check the transaction.zOperation aborted.zNothing to do.NzDownloading Packages:zError downloading packages:z
%sr   Ú
zTransaction failed)Ar   r8   ZWITH_MODULESrA   Zmodule_stream_switchÚdictZ_moduleContainerZgetSwitchedStreamsr?   r
   r=   ÚutilÚ	MAIN_PROGÚ
exceptionsÚErrorZtransactionr   Zlist_transactionr;   ÚinfoÚactionZFORWARD_ACTIONSÚappendr   ZBACKWARD_ACTIONSZ_tsZreportRemoveSizeZreportDownloadSizeZ	isChangedZ_historyÚgroupÚenvÚdownloadonlyÚMAIN_PROG_UPPERZtsflagsÚ_promptWantedÚassumenoÚuserconfirmr   Zdownload_callback_total_cbZdownload_packagesÚprogressZDownloadErrorÚcliZindent_blockr	   r2   ÚgpgsigcheckÚ
isinstancer   ZCliTransactionDisplayÚlistrB   r@   Údo_transactionÚhistoryÚoldZdbZRPMTransactionZ_transÚjoinZpost_transaction_outputÚstateÚlibdnfZTransactionItemState_ERROR)rD   Zdisplayr>   ÚmsgZtransZpkg_strZinstall_pkgsZrmpkgsZinstall_onlyZtsiZtotal_cbÚeZspecificZerrstrÚtidrE   r   r   r_   ¡   sš    û
ÿÿÿ
ÿ
ÿ
"


zBaseCli.do_transactionc           
         sö   g }|D ]À}ˆ   |¡\}}|dkr&qq|dkr¾ˆ jjo>ˆ jj }tjrPtj ¡ sd|sdtj 	t
dƒ¡‚‡ fdd„}zˆ  ||¡ W qÈ tjj	tfyº } z| t|ƒ¡ W Y d}~qÈd}~0 0 q| |¡ q|rò|D ]}	t |	¡ qÒtj 	t
dƒ¡‚dS )a  Perform GPG signature verification on the given packages,
        installing keys if possible.

        :param pkgs: a list of package objects to verify the GPG
           signatures of
        :raises: Will raise :class:`Error` if there's a problem
        r   r   zTRefusing to automatically import keys when running unattended.
Use "-y" to override.c                    s
   ˆ j  ¡ S ©N)r   rY   )r+   ÚyÚz©rD   r   r   Ú<lambda>$  ó    z%BaseCli.gpgsigcheck.<locals>.<lambda>NzGPG check FAILED)Z_sig_check_pkgrA   Ú	assumeyesrX   ÚsysÚstdinÚisattyr   rN   rO   r
   Z_get_key_for_packageÚ
ValueErrorrR   Ústrr;   Úcritical)
rD   r7   Zerror_messagesÚpoÚresultÚerrmsgZayÚfnrf   re   r   rk   r   r\     s&    &zBaseCli.gpgsigcheckc                    sV   d‰ | j j d|j¡D ]&}|tj }|rtj |d ¡‰  q>q‡ fdd„|j	D ƒ}|S )zBReturn list of changelogs for package newer then installed versionNr   r   c                    s$   g | ]}ˆ d u s|d ˆ kr|‘qS )NÚ	timestampr   )Ú.0Zchlog©Znewestr   r   Ú
<listcomp>=  s   ÿz-BaseCli.latest_changelogs.<locals>.<listcomp>)
Z_rpmconnZreadonly_tsZdbMatchr   ÚrpmZRPMTAG_CHANGELOGTIMEÚdatetimeÚdateZfromtimestampÚ
changelogs)rD   ÚpackageÚmiZchangelogtimesZchlogsr   r{   r   Úlatest_changelogs3  s    
zBaseCli.latest_changelogsc                 C   s4   d|d   d¡tj |d ¡tj |d ¡f }|S )z*Return changelog formatted as in spec filez* %s %s
%s
ry   z%a %b %d %X %YZauthorÚtext)r)   r   Zi18nr	   )rD   Z	changelogZ	chlog_strr   r   r   Úformat_changelogA  s    ýzBaseCli.format_changelogc                 C   sŒ   t ƒ }|D ]}| |jp|jg ¡ |¡ q
t| ¡ ƒD ]P}|| }ttdƒ 	d 
dd„ |D ƒ¡¡ƒ |  |d ¡D ]}t|  |¡ƒ qrq6d S )NzChangelogs for {}ú, c                 S   s   g | ]}t |ƒ‘qS r   )rs   )rz   r   r   r   r   r|   Q  rm   z,BaseCli.print_changelogs.<locals>.<listcomp>r   )rK   r   Úsource_namer   rR   ÚsortedÚkeysr2   r
   r=   rb   rƒ   r…   )rD   ZpackagesZbysrpmÚpr‡   Zbin_packagesZchlr   r   r   Úprint_changelogsI  s    "zBaseCli.print_changelogsTFc              	   C   sJ  | j d||d}| jjs | jjr@| j d||d}|j|_|j|_|r<t| j|ƒ}t|jƒdkròi }| jj	j
d }	|	r²t|jƒD ]0}
|
 ¡ }tj |¡r€|
 ¡ r€|
||
j|
jf< q€| jj}| jj}| jj|jdd||||dœd	 |rò|  |j¡ t|jƒdkr<ttd
ƒƒ t|jt d¡dD ]}| jj|d|d q"|jpH|jS )z?Check updates matching given *patterns* in selected repository.Zupgrades)Úreponamer#   r   r6   r   r^   ©ú=únot in)Z
outputTypeÚhighlight_nar&   Úhighlight_modesúObsoleting Packages©Úkey©r&   )ÚreturnPkgListsrA   r#   Úverboser$   r'   r   r   r!   r5   ÚMODErˆ   ZlocalPkgÚosÚpathÚexistsZverifyLocalPkgr   r   Úcolor_update_localÚcolor_update_remoteÚlistPkgsr‹   r2   r
   ÚoperatorÚ
itemgetterÚupdatesObsoletesList)rD   ÚpatternsrŒ   Úprint_r€   r%   Ztyplr&   Ú
local_pkgsÚ	highlightru   ZlocalÚculÚcurÚobtupr   r   r   Úcheck_updatesU  s@    þÿ

ÿ
zBaseCli.check_updatesc                 C   sl   | j  ¡ }t|ƒdkr |  ¡  n|D ]}|  |¡ q$| j  ¡ | }|dkrh| j  ¡ shtdƒ}tj |¡‚dS )ab   Upgrade or downgrade packages to match the latest versions available
            in the enabled repositories.

            :return: (exit_code, [ errors ])

            exit_code is::
                0 = we're done, exit
                1 = we've errored, exit with error string
                2 = we've got work yet to do, onto the next stage
        r   z4No packages marked for distribution synchronization.N)	Z_goalZ
req_lengthr   Zdistro_syncZreq_has_distupgrade_allr
   r   rN   rO   )rD   ZuserlistZoldcountÚpkg_specZcntre   r   r   r   Údistro_sync_userlist{  s    

zBaseCli.distro_sync_userlistc           
      C   sF  d}|D ]`}z| j ||d d}W q tjjyf } z(t tdƒ| jj 	|j
¡¡ W Y d}~qd}~0 0 q|D ]¼}z| j||d d}W qn tjjyÎ } z*tdƒ}	t |	| jj 	|¡¡ W Y d}~qnd}~0  tjjy } z(t tdƒ| jj 	|j¡¡ W Y d}~qnd}~0  tjjy(   Y qn0 qn|sBtj tdƒ¡‚dS )	aa  Attempt to take the user specified list of packages or
        wildcards and downgrade them. If a complete version number is
        specified, attempt to downgrade them to the specified version

        :param specs: a list of names or wildcards specifying packages to downgrade
        :param file_pkgs: a list of pkg objects from local files
        F)ÚstrictTzNo match for argument: %sNzNo package %s available.z6Packages for argument %s available, but not installed.z!No packages marked for downgrade.)Zpackage_downgrader   rN   ZMarkingErrorr;   rP   r
   r   r5   r6   ÚlocationZdowngrade_toZPackageNotFoundErrorZPackagesNotInstalledErrorrª   rO   )
rD   ZspecsZ	file_pkgsr¬   rv   r   rf   ÚargÚerrre   r   r   r   ÚdowngradePkgs’  s0    	
ÿ*
ÿzBaseCli.downgradePkgsÚallc           !      C   s<  z$| j jjd }| j||||d}W n6 tjjyZ } zdt|ƒgfW  Y d}~S d}~0 0 i }i }	i }
d}|dkr€t| j |ƒ}|rÊ|j	rÊ|j
|j |j D ],}|j|jf}||vsÀ||| krœ|||< qœ|r|jr|jD ].}|j|jf}||	vs||	| krÞ||	|< qÞ|rL|jrLt|jƒD ]$}|jtjkr&||
|j|jf< q&| jj}| jj}| jj}| jj}| j j|j	tdƒ|||||||dœd}| jj}| jj}| jj}| jj }| j j|jtd	ƒ||	|||||d
œd}| j j|j!tdƒ||d}| j j|j"tdƒ||d}| jj#}| jj$}| j j|jtdƒ||
|||dœd}t%|j&ƒdkr¤|dkr¤t%|j&ƒ}t'tdƒƒ t|j(t) *d¡dD ]}| j j+|d|d qˆn| j j|j&tdƒ||d}| j j|j,tdƒ||d} t%|ƒr8| dkr8|dkr8|dkr8|dkr8|dkr8|dkr8|dkr8tj tdƒ¡‚dS )zJOutput selection *pkgnarrow* of packages matching *patterns* and *repoid*.r6   )Úinstalled_availablerŒ   r   Nr^   zInstalled Packages)ú>ú<rŽ   r   )r   r&   r‘   zAvailable Packages)r´   r³   rŽ   r   zAutoremove Packagesr•   zExtra PackageszAvailable Upgradesr   r   r’   r“   r#   zRecently Added PackageszNo matching Packages to list)-r   r5   r˜   r–   r   rN   rO   rs   r'   r   Úhidden_availableÚreinstall_availableZold_availabler   r   r   Úhidden_installedr!   rˆ   rŒ   ÚhawkeyZSYSTEM_REPO_NAMErA   Zcolor_list_installed_olderZcolor_list_installed_newerZcolor_list_installed_reinstallZcolor_list_installed_extrarž   r
   Zcolor_list_available_upgradeZcolor_list_available_downgradeZcolor_list_available_reinstallZcolor_list_available_installr    r   rœ   r   r   r#   r2   r$   rŸ   r    r¡   r"   )!rD   ÚbasecmdÚ	pkgnarrowr¢   rŒ   r¥   r%   rf   Zupdate_pkgsZ	inst_pkgsr¤   r&   r   r”   ru   ZclioZclinZclirZclieZripZclauZcladZclarZclaiZrapZraepZrepr¦   r§   ZrupZropr¨   Zrrapr   r   r   Úoutput_packages´  s¼    ÿ
$
ÿþ


ÿþÿþÿÿþ
ÿ

ÿÿÿ
ÿÿÿÿÿÿÿzBaseCli.output_packagesc           	      C   sš   d}d}|r|dkrd}d}n|r2|dkr2d}d}| j ||d|d}| jjrn|jD ]}|jsR|sR|j |¡ qR|r‚|j|_|j|_|rŒg |_|r–g |_|S )a#  Return a :class:`dnf.yum.misc.GenericHolder` object containing
        lists of package objects that match the given names or wildcards.

        :param pkgnarrow: a string specifying which types of packages
           lists to produce, such as updates, installed, available, etc.
        :param patterns: a list of names or wildcards specifying
           packages to list
        :param installed_available: whether the available package list
           is present as .hidden_available when doing all, available,
           or installed
        :param reponame: limit packages list to the given repository

        :return: a :class:`dnf.yum.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
        Fr   Tr±   r   )Zignore_caserŒ   )	Z_do_package_listsrA   Úshowdupesfromreposr¶   r   r   rR   rµ   r·   )	rD   rº   r¢   r²   rŒ   Zdone_hidden_availableZdone_hidden_installedr%   r   r   r   r   r–     s.    ÿ

zBaseCli.returnPkgListsc           	         sˆ   | j j}d| j _g }g }|D ],}tt| ƒ |¡\}}| |¡ | |¡ qt|ƒD ]}| j |||¡ qR|| j _|s„t	j
 tdƒ¡‚dS )a¼  Print out a list of packages that provide the given file or
        feature.  This a cli wrapper to the provides methods in the
        rpmdb and pkgsack.

        :param args: the name of a file or feature to search for
        :return: (exit_code, [ errors ])

        exit_code is::

            0 = we're done, exit
            1 = we've errored, exit with error string
            2 = we've got work yet to do, onto the next stage
        Tz{No matches found. If searching for a file, try specifying the full path or using a wildcard prefix ("*/") at the beginning.N)rA   r¼   rB   r@   ÚprovidesÚextendrˆ   r   Zmatchcallback_verboser   rN   rO   r
   )	rD   ÚargsZold_sdupZmatchesZused_search_stringsÚspecr0   Zused_search_stringr   rE   r   r   r½   ?  s    
zBaseCli.providesc                 C   s   | j jr| j jsdS dS )NFT)rA   rn   rX   rk   r   r   r   rW   `  s    zBaseCli._promptWanted)N)r   )r   NTF)r±   r   N)r±   NFN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rC   r_   r\   rƒ   r…   r‹   r©   r«   r°   r»   r–   r½   rW   Ú__classcell__r   r   rE   r   r@   ™   s    k'
&"
Y  ÿ
2!r@   c                   @   sŠ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Zd dd„Z	d!dd„Z
d"dd„Zejfdd„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )#ÚClic                 C   s"  || _ i | _d | _tjj ¡ | _|  tjj	j
j¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	jj¡ |  tjj	j j!¡ |  tjj	j"j#¡ |  tjj	j$j%¡ |  tjj	j&j'¡ |  tjj	j(j)¡ |  tjj	j*j+¡ |  tjj	j,j-¡ |  tjj	j.j/¡ |  tjj	j0j1¡ |  tjj	j2j3¡ |  tjj	j4j5¡ |  tjj	j6j7¡ |  tjj	j8¡ |  tjj	j9¡ |  tjj	j:¡ |  tjj	j;¡ |  tjj	j<¡ |  tjj	j=¡ d S rh   )>r8   Úcli_commandsÚcommandr   r[   ZdemandZDemandSheetÚdemandsÚregister_commandZcommandsÚaliasZAliasCommandr    ZAutoremoveCommandZcheckZCheckCommandZcleanZCleanCommandZ
distrosyncZDistroSyncCommandZdeplistZDeplistCommandZ	downgradeZDowngradeCommandrS   ZGroupCommandr`   ZHistoryCommandZinstallZInstallCommandZ	makecacheZMakeCacheCommandZmarkZMarkCommandÚmoduleZModuleCommandZ	reinstallZReinstallCommandÚremoveZRemoveCommandÚrepolistZRepoListCommandZ	repoqueryZRepoQueryCommandÚsearchZSearchCommandÚshellZShellCommandZswapZSwapCommandZ
updateinfoZUpdateInfoCommandZupgradeZUpgradeCommandZupgrademinimalZUpgradeMinimalCommandZInfoCommandZListCommandZProvidesCommandZCheckUpdateCommandZRepoPkgsCommandZHelpCommand)rD   r8   r   r   r   rC   h  sB    zCli.__init__c              
   C   s   | j  |¡ |jrZ|j ¡ D ]<\}}| j jj|| j j|gd}| |¡ |j 	|df¡ q|j
r†|j dd¡ |j dd„ |j
D ƒ¡ tƒ }zt|jD ]h\}}| j j |¡}|sâ| j jjrØ|dkrØtdƒ}	tj |	| ¡‚| |¡ |dkrô| ¡  q”| ¡  q”W nH tjjyH }
 z*t |
¡ | j ¡  t d¡ W Y d }
~
n
d }
~
0 0 |D ]}t td	ƒ|¡ qN| j j  ¡ }|d u rˆ| j j !¡ }|D ]$}| j j "|¡}|rŒ|j# $¡  qŒ| j j% &¡ \}| j _'| j j (¡  )|¡ t% *| j | j j%¡}| j j (¡  +|¡ d S )
N)ZbaseurlÚenabler   )Ú*Údisablec                 S   s   g | ]}|d f‘qS )rÑ   r   )rz   Úrr   r   r   r|   —  rm   z(Cli._configure_repos.<locals>.<listcomp>zUnknown repo: '%s'r   zNo repository match: %s),r8   Zread_all_reposZrepofrompathr:   ÚreposZadd_new_reporA   Ú_configure_from_optionsZrepos_edrR   ÚrepoÚinsertr¾   ÚsetZget_matchingr¬   r
   r   rN   Z	RepoErrorÚaddrÑ   rÓ   ÚConfigErrorr;   rt   Ú	optparserÚ
print_helpro   Úexitr<   Z_repo_persistorZget_expired_reposr‰   ÚgetÚ_repoÚexpirer   Zsetup_progress_callbacksZ_ds_callbackr±   Úset_progress_barZCliKeyImportZ_set_key_import)rD   ÚoptsZlabelrš   Z	this_repoZnotmatchr×   Z	operationrÎ   re   rf   Zexpired_reposr   ZbarZ
key_importr   r   r   Ú_configure_reposŒ  sL    




 
zCli._configure_reposc                 C   sv   t  djtjjdtjj¡ t  tj	j
d| j¡ t  tj	j
d| jjj¡ t  tj	j
d| jjj¡ t  d| jjj¡ d S )Nz{prog} version: %srG   zCommand: %szInstallroot: %szReleasever: %szcachedir: %s)r;   Údebugr=   r   rL   rV   ÚconstÚVERSIONÚlogÚloggingÚDDEBUGÚ	cmdstringr8   rA   ÚinstallrootÚ
releaseverÚcachedirrk   r   r   r   Ú_log_essentials¿  s    ÿ
ÿ

ÿÿzCli._log_essentialsc                 C   sð   | j }| jj}|jr.tj ¡ s.tj t	dƒ¡‚|j
rH| ¡ D ]
}d|_q<|jsX| jjjr‚d| jj_| ¡ D ]}|j tjj¡ qjnD|jr¢| ¡ D ]}|j ¡  qn$|jsÆ| ¡ D ]}|j tjj¡ q°|jrì| jj| j jrÞdnd| j jd d S )Nz[This command has to be run with superuser privileges (under the root user on most systems).TÚautoF)Úload_system_repoZload_available_repos)rÉ   r8   rÕ   Z	root_userr   rL   Z	am_i_rootrN   rO   r
   r€   Úiter_enabledZload_metadata_otherÚ	cacheonlyrA   Úvaluesrà   ZsetSyncStrategyr×   ZSYNC_ONLY_CACHEÚfreshest_metadatará   Zfresh_metadataZ	SYNC_LAZYZsack_activationZ	fill_sackrñ   Zavailable_repos)rD   rÉ   rÕ   r×   r   r   r   Ú_process_demandsÊ  s2    
ÿ
þzCli._process_demandsc                 C   s°   |j }| j |¡}|du r~t tdƒ|tjd ¡ | jj	j
r`t tdƒjtjjtjjd|¡ nt tdƒjtjjd¡ t‚|| ƒ| _ t tjjd|¡ t tjjd	|¡ dS )
z,Check that the requested CLI command exists.Nz)No such command: %s. Please use %s --helpr   zLIt could be a {PROG} plugin command, try: "{prog} install 'dnf-command(%s)'")rH   ZPROGzRIt could be a {prog} plugin command, but loading of plugins is currently disabled.rG   zBase command: %szExtra commands: %s)rÈ   rÇ   rß   r;   rt   r
   ro   Úargvr8   rA   Zpluginsr=   r   rL   rM   rV   r   rè   ré   rê   )rD   rã   r¿   r¹   Úcommand_clsr   r   r   Ú_parse_commandsé  s&    

ÿ
þþþ
zCli._parse_commandsNc           	   
   C   s”  t jj ¡ }| |¡}|du r*t jj ¡ n|| _| j |¡}|j	rpt
t jjƒ t| jjj| j| jjƒ t d¡ |jr‚d|_d|_|jr˜t jj |_|_zh|jrÄ| jj d| jjjt jj¡ d| j_| jj |¡ |  |j ¡ d|v rò|j!| jj_!| jj "¡  W n  t j#j$t%fyH } z&t& 't(dƒ|¡ t d¡ W Y d}~nbd}~0  t)y  } z@d	t*t+|ƒƒt,|j-ƒf }t& 't(dƒ|¡ t d¡ W Y d}~n
d}~0 0 |j.durê|j.| jj_.| jjj/sê|j0d
vrêt& 't(dƒ¡ t d¡ |j1sú|j2r|j0dkrt& 't(dƒ¡ t d¡ |j3dur@t4 5t6 7|j3d ¡¡ | j 8| j9d¡ | j :|j;|j<| ¡ | j 8| j9d¡ |j0s| j =¡  t d¡ || j_>| jj?d | _@| jj>D ]}|  j@d| 7  _@q®|  A¡  z|  B||¡ W n tCyþ   t d¡ Y n0 |jDr | j =| j0¡ t d¡ | j E| j0|¡}|jFrJ|jF| j_Gd| j_H|jIr\|jI| j_I|jJrnd| jj_K|jLr€d| jj_L| j0 M¡  | j N¡  | j O¡  |  P|¡ | j Q¡  | jj |¡ | j0 R¡  | jjj.rüt jS T| jjj.¡ | jjj.| jjU V¡ _W| jjjXdkr$| jjjYjZ| jjjXd t[ \d¡dv rd}| jjU ]¡ D ]}|j^rTqDd|_^d}qD| jjj_s|d| jj__d}|rt& `t(dƒ¡ dS )a  Parse command line arguments, and set up :attr:`self.base.conf` and
        :attr:`self.cmds`, as well as logger objects in base instance.

        :param args: a list of command line arguments
        :param option_parser: a class for parsing cli options
        Nr   r   rî   Tr   zConfig error: %sr   z%s: %s)Zdownloadzsystem-upgradeZreposyncZ
modulesynczb--destdir or --downloaddir must be used with --downloadonly or download or system-upgrade command.zconfig-managerz_--enable, --set-enabled and --disable, --set-disabled must be used with config-manager command.é<   ÚmainZpluginú z%s rð   )Úcolorz%_pkgverify_level)Z	signaturer±   Fz‘Warning: Enforcing GPG signature check globally as per active RPM security policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message))ar   r[   ÚaliasesZAliasesÚresolveÚoption_parserZOptionParserrÜ   Zparse_main_argsr3   r2   ræ   rç   r9   r8   rA   Zhistory_record_packagesr   ro   rÞ   ÚquietZ
debuglevelZ
errorlevelr—   ZVERBOSE_LEVELró   Z
_set_valueZsystem_cachedirZPRIO_DEFAULTrÉ   rÖ   Ú_read_conf_filerí   r   Z_adjust_conf_optionsrN   rÛ   rr   r;   rt   r
   ÚIOErrorr	   rs   ÚreprÚfilenameZdestdirrU   rÈ   Zset_enabledZset_disabledZ	sleeptimer(   ÚsleepÚrandomZ	randrangeZadd_commandsrÇ   Zinit_pluginsZdisablepluginZenablepluginrÝ   r¿   rH   rë   rï   rù   r   ÚhelpZparse_command_argsZallowerasingZallow_erasingZ_allow_erasingrõ   ZdebugsolverZdebug_solverr#   Zpre_configureZpre_configure_pluginsZ_activate_persistorrä   Zconfigure_pluginsÚ	configurerL   Z
ensure_dirrÕ   r±   Zpkgdirrý   r5   Zreinitr}   ZexpandMacrorò   ZgpgcheckZlocalpkg_gpgcheckr<   )	rD   r¿   r   rþ   rã   rf   r®   Zforcingr×   r   r   r   r	  ÿ  sÌ    
ÿÿÿ
ÿ 
ÿ














ÿzCli.configurec                 C   s<  t j d¡}| jj}| d¡ | d¡ | d¡}| d¡t jj	krft
j |¡sft j tdƒ |¡¡‚|jt jjd | d¡}| d¡t jj	kr–d}|j}|j|| d¡d |d u rÒ|jd u rÒt j |j¡}n|dkræt j |¡}|d urô||_|jd u rt td	ƒ¡ d
D ]}| |¡ q| jj |¡ |ƒ  |S )NZconfigZconfig_file_pathzConfig file "{}" does not exist)ZpriorityZreposdirÚvarsdirú/)r
  zPUnable to detect release version (use '--releasever' to specify release version))rî   ZlogdirZ
persistdir)r   ré   ZTimerr8   rA   Z_check_remote_fileZ_search_inside_installrootZ
_get_valueZ_get_priorityZPRIO_COMMANDLINEr™   rš   ÚisfilerN   rÛ   r
   r=   ÚreadZPRIO_MAINCONFIGZsubstitutionsZupdate_from_etcrí   r}   Zdetect_releaseverrì   r;   r<   Zprepend_installrootÚ_loggingZ_setup_from_dnf_conf)rD   rí   ZtimerrA   r  Z	from_rootÚsubstÚoptr   r   r   r  Ž  s8    



ÿ
zCli._read_conf_fileÚeqc                 C   sŒ   |du r|du rdS g }|j s"|r,| d¡ |js6|r@| d¡ |jsJ|rT| d¡ |js^|rh| d¡ | jj|||j|j|j	|j
d dS )zz

        :param opts:
        :param cmp_type: string supported "eq", "gte"
        :param all:
        :return:
        NÚbugfixÚenhancementÚ
newpackageÚsecurity)ÚtypesÚadvisoryÚbugzillaÚcvesÚseverity)r  rR   r  r  r  r8   Zadd_security_filtersr  r  r  r  )rD   rã   Zcmp_typer±   r  r   r   r   Ú _populate_update_security_filter»  s    







þz$Cli._populate_update_security_filterc                 C   s4   |dur| j jj |¡ |dur0| j jj |¡ dS )zü
        Change minimal logger level for terminal output to stdout and stderr according to specific
        command requirements
        @param stdout: logging.INFO, logging.WARNING, ...
        @param stderr:logging.INFO, logging.WARNING, ...
        N)r8   r  Zstdout_handlerZsetLevelZstderr_handler)rD   ÚstdoutÚstderrr   r   r   Úredirect_loggerÔ  s    zCli.redirect_loggerc                 C   s.   t jj |¡}|| jj_| jj ¡  |¡ d S rh   )	r   r[   rZ   ZMultiFileProgressMeterr8   r   rÕ   r±   râ   )rD   ZforZ   r   r   r   Úredirect_repo_progressá  s    
zCli.redirect_repo_progressc                 C   s€   | j j ¡ }|d u rd S | j j ¡ j|jd}| ¡ }|jdd |}|D ]}||krJ|}qJ||kr|td| ƒ td| ƒ d S )N)r½   r  )Zadvisory_typez,Security: %s is an installed security updatez-Security: %s is the currently running version)r8   r.   Zget_running_kernelr0   r1   r   r   r2   )rD   ZkernelÚqZikpkgr   r   r   r   Ú_check_running_kernelæ  s    zCli._check_running_kernelc                 C   s*   t | j ¡ ƒ tj td ||¡ƒ¡‚d S )Nz)argument {}: not allowed with argument {})r2   rÜ   Zprint_usager   rN   rO   r
   r=   )rD   Zoption_string_1Zoption_string_2r   r   r   Ú_option_conflictø  s    ÿzCli._option_conflictc                 C   s8   |j D ],}|| jv r(tj tdƒ| ¡‚|| j|< qdS )zRegister a Command. :apizCommand "%s" already definedN)rþ   rÇ   r   rN   rÛ   r
   )rD   rø   r   r   r   r   rÊ   ý  s    

zCli.register_commandc              	   C   sè   |   ¡  | jjjr8t tdƒd tt	| jjjƒƒ¡ ¡ | jjj
rht tdƒd tt	| jjj
ƒƒ¡ ¡ | jj ¡ D ]h}|jrªt tdƒ|j d d tt	|jƒƒ¡ ¡ |j
rtt tdƒ|j d d tt	|j
ƒƒ¡ ¡ qt| j ¡ S )a2  Call the base command, and pass it the extended commands or
           arguments.

        :return: (exit_code, [ errors ])

        exit_code is::

            0 = we're done, exit
            1 = we've errored, exit with error string
            2 = we've got work yet to do, onto the next stage
        zExcludes in dnf.conf: r†   zIncludes in dnf.conf: zExcludes in repo z: zIncludes in repo )rö   r8   rA   Zexcludepkgsr;   rå   r
   rb   rˆ   rÙ   ZincludepkgsrÕ   rò   ÚidrÈ   Úrun)rD   r×   r   r   r   r$    s&    
ÿ
ÿÿÿzCli.run)N)N)r  N)NN)rÁ   rÂ   rÃ   rC   rä   rï   rö   rù   r	  r  r  r  ro   r  r  r!  r"  rÊ   r$  r   r   r   r   rÆ   g  s   $3
 
-

rÆ   )r   )OrÄ   Z
__future__r   r   r   Úcollections.abcr   ÚImportErrorÚcollectionsr~   ré   rŸ   r™   r  r}   ro   r(   r¸   Zlibdnf.transactionrd   r   r   Zdnf.clir   Zdnf.i18nr	   r
   r   Zdnf.cli.aliasesZdnf.cli.commandsZdnf.cli.commands.aliasZdnf.cli.commands.autoremoveZdnf.cli.commands.checkZdnf.cli.commands.cleanZdnf.cli.commands.deplistZdnf.cli.commands.distrosyncZdnf.cli.commands.downgradeZdnf.cli.commands.groupZdnf.cli.commands.historyZdnf.cli.commands.installZdnf.cli.commands.makecacheZdnf.cli.commands.markZdnf.cli.commands.moduleZdnf.cli.commands.reinstallZdnf.cli.commands.removeZdnf.cli.commands.repolistZdnf.cli.commands.repoqueryZdnf.cli.commands.searchZdnf.cli.commands.shellZdnf.cli.commands.swapZdnf.cli.commands.updateinfoZdnf.cli.commands.upgradeZdnf.cli.commands.upgrademinimalZdnf.cli.demandZdnf.cli.formatZdnf.cli.option_parserZdnf.confZdnf.conf.substitutionsZ	dnf.constZdnf.db.historyZdnf.exceptionsZdnf.loggingZdnf.persistorZ
dnf.pluginZdnf.rpmZdnf.sackZdnf.transactionZdnf.utilZdnf.yum.miscZ	getLoggerr;   r   r'   r9   r?   ZBaser@   ÚobjectrÆ   r   r   r   r   Ú<module>   s   

   Q