
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÌÐg±¬  ã               @   st  d Z ddlmZ ddlmZ ddlmZ yddlmZ W n  ek
rX   ddlmZ Y nX 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
jEdƒ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ƒ}xFd|fd|fd|ffD ],\}}| | j|dƒ | | |  d7  < qLW d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.6/cli.pyÚ_add_pkg_simple_list_lens]   s     

 r   c             C   sÄ   i i i dœ}x<|j |j|j|j|j|jfD ]}x|D ]}t||ƒ q4W q*W t|jƒdkr„x*|j	D ] \}}t||ƒ t||dd� q`W |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   ú é   )r   r   r   r   r   )Zremainder_columné   z    )Ú	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j|ƒ}d}x´|jƒ jƒ j| d�D ]œ}|r>tdƒ d}|jdkrbd|j|j	|j
f }nd	|j|j|j	|j
f }|jj|jƒ}ttd
ƒ||||jƒf ƒ ttdƒ|jr¸|jnd||jƒf ƒ q.W d S )Nc             S   s   t jdt j| ƒƒS )Nz%c)ÚtimeÚstrftimeZ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-   r0   Údoner   r   r   r   r   r   Úprint_versionsy   s     
r;   c             C   s>   t dƒ}x0| jƒ D ]$\}}tj|j||d |d ƒƒ qW 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    rA   c                   sª   e Zd ZdZd ‡ fdd„	Zf f‡ fdd„	Zdd„ Zd	d
„ Zdd„ Zdd„ Z	f dddfdd„Z
dd„ Zg g dfdd„Zdf df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jƒ }tt| ƒj|d� tj| | jƒ| _d S )N)Úconf)r   rC   ZConfÚsuperrB   Ú__init__r   ZOutput)ÚselfrC   )Ú	__class__r   r   rE   œ   s    zBaseCli.__init__c                s  t jjrJ| jjsJt| jjƒ ƒ}|rJt|ƒ t	dƒj
t jjd�}t jj|ƒ‚| j}| jj|ƒ}|rjtj|ƒ |ræg }g }d}xF|D ]>}	|	jt jjkr |j|	jƒ q€|	jt jjkr€d}|j|	jƒ q€W | `|sØ| jj|ƒ n| jj||ƒ |�s| jjƒ �s| j�r’| jj�s| jj�r’| jj �r:tjt	dƒj
t jj!d�ƒ n(d| jj"k�rbtjt	dƒj
t jj!d�ƒ | j#ƒ �r¤| jj$�s„| jj%ƒ  �r¤t&t	dƒƒ‚ntjt	d	ƒƒ d
S |�rD|�r:tjt	dƒƒ y| jj'}
| j(|| jj)|
ƒ W n\ t jj*k
�r8 } z:t j+j
j,t-|ƒƒ}t	dƒd|  }t.ƒ  t jj|ƒ‚W Y d
d
}~X nX | j/|ƒ | jj �rRd
S t0|t1ƒ�sd|g}tj2ƒ gt3|ƒ }t4t5| ƒj6|ƒ}|d
k	�r¸| j7j8|gƒd }t j9jj:| j7|j;ƒ}nd
}|�rt.ƒ  t.dj<| jj=|ƒƒƒ t.ƒ  x.|D ]&}	|	j>t?jj@k�rêt jjt	dƒƒ‚�qêW |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.Z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   r9   ZWITH_MODULESrC   Zmodule_stream_switchÚdictZ_moduleContainerZgetSwitchedStreamsrA   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	   r3   ÚgpgsigcheckÚ
isinstancer   ZCliTransactionDisplayÚlistrD   rB   Údo_transactionÚhistoryÚoldZdbZRPMTransactionZ_transÚjoinZpost_transaction_outputÚstateÚlibdnfZTransactionItemState_ERROR)rF   Zdisplayr@   ÚmsgZtransZpkg_strZinstall_pkgsZrmpkgsZinstall_onlyZtsiZtotal_cbÚeZspecificZerrstrÚtid)rG   r   r   r^   ¡   sŠ    







zBaseCli.do_transactionc       
         s  g }xÌ|D ]Ä}ˆ j |ƒ\}}|dkr(q
q
|dkrÄˆ jjo@ˆ jj }tj sVtjjƒ  rl| rltjj	t
dƒƒ‚‡ fdd„}yˆ j||ƒ W qÎ tjj	tfk
rÀ } z|jt|ƒƒ W Y dd}~X qÎX q
|j|ƒ q
W |rþx|D ]}	tj|	ƒ qÜW tj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 jƒ S )N)r   rX   )r,   ÚyÚz)rF   r   r   Ú<lambda>$  s    z%BaseCli.gpgsigcheck.<locals>.<lambda>NzGPG check FAILED)Z_sig_check_pkgrC   Ú	assumeyesrW   ÚsysÚstdinÚisattyr   rM   rN   r
   Z_get_key_for_packageÚ
ValueErrorrQ   Ústrr=   Úcritical)
rF   r8   Zerror_messagesÚpoÚresultÚerrmsgZayÚfnre   rd   r   )rF   r   r[     s&    
"
zBaseCli.gpgsigcheckc                sX   d‰ x:| j jjd|jƒD ]$}|tj }|rtjj|d ƒ‰ P qW ‡ fdd„|j	D ƒ}|S )zBReturn list of changelogs for package newer then installed versionNr   r   c                s$   g | ]}ˆ d ks|d ˆ kr|‘qS )NÚ	timestampr   )Ú.0Zchlog)Únewestr   r   ú
<listcomp>=  s    z-BaseCli.latest_changelogs.<locals>.<listcomp>)
Z_rpmconnZreadonly_tsZdbMatchr   ÚrpmZRPMTAG_CHANGELOGTIMEÚdatetimeZdateZfromtimestampÚ
changelogs)rF   ÚpackageZmiZchangelogtimesZchlogsr   )rw   r   Úlatest_changelogs3  s    
zBaseCli.latest_changelogsc             C   s4   d|d j dƒtjj|d ƒtjj|d ƒf }|S )z*Return changelog formatted as in spec filez* %s %s
%s
ru   z%a %b %d %X %YZauthorÚtext)r+   r   Zi18nr	   )rF   Z	changelogZ	chlog_strr   r   r   Úformat_changelogA  s
    zBaseCli.format_changelogc             C   s˜   t ƒ }x&|D ]}|j|jp|jg ƒj|ƒ qW xdt|jƒ ƒD ]T}|| }ttdƒj	dj
dd„ |D ƒƒƒƒ x$| j|d ƒD ]}t| j|ƒƒ qzW q<W d S )NzChangelogs for {}z, c             S   s   g | ]}t |ƒ‘qS r   )ro   )rv   r   r   r   r   rx   Q  s    z,BaseCli.print_changelogs.<locals>.<listcomp>r   )rJ   r   Úsource_namer   rQ   ÚsortedÚkeysr3   r
   r?   ra   r}   r   )rF   ZpackagesZbysrpmÚpr€   Zbin_packagesZchlr   r   r   Úprint_changelogsI  s    
"zBaseCli.print_changelogsTFc          	   C   sR  | j d||d�}| jjs | jjr@| j d||d�}|j|_|j|_|�rDt| j|ƒ}t|jƒdkröi }| jj	j
d }	|	r¶x>t|jƒD ]0}
|
jƒ }tjj|ƒr‚|
jƒ r‚|
||
j|
jf< q‚W | jj}| jj}| jj|jdd||||dœd	� |rö| j|jƒ t|jƒdk�rDttd
ƒƒ x0t|jtjdƒd�D ]}| jj|d|d� �q(W |j�pP|jS )z?Check updates matching given *patterns* in selected repository.Zupgrades)Úreponamer%   r   r7   r   r]   )ú=znot in)Z
outputTypeÚhighlight_nar(   Úhighlight_modeszObsoleting Packages)Úkey)r(   )ÚreturnPkgListsrC   r%   Úverboser&   r)   r   r   r#   r6   ÚMODEr�   ZlocalPkgÚosÚpathÚexistsZverifyLocalPkgr   r   Úcolor_update_localÚcolor_update_remoteÚlistPkgsr„   r3   r
   ÚoperatorÚ
itemgetterÚupdatesObsoletesList)rF   Úpatternsr…   Zprint_r{   r'   Ztyplr(   Ú
local_pkgsÚ	highlightrq   ZlocalÚculÚcurÚobtupr   r   r   Úcheck_updatesU  s:    
zBaseCli.check_updatesc             C   sr   | j jƒ }t|ƒdkr | jƒ  nx|D ]}| j|ƒ q&W | j jƒ | }|dkrn| j jƒ  rntdƒ}tj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   rM   rN   )rF   ZuserlistZoldcountÚpkg_specZcntrd   r   r   r   Údistro_sync_userlist{  s    


zBaseCli.distro_sync_userlistc       
      C   sJ  d}xf|D ]^}y| j ||d� d}W q
 tjjk
rf } z"tjtdƒ| jjj	|j
ƒƒ W Y dd}~X q
X q
W xÂ|D ]º}y| j||d� d}W qr tjjk
rÐ } z$tdƒ}	tj|	| jjj	|ƒƒ W Y dd}~X qr tjjk
�r } z"tjtdƒ| jjj	|jƒƒ W Y dd}~X qr tjjk
�r*   Y qrX qrW |�sFtj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   rM   ZMarkingErrorr=   rO   r
   r   r6   r7   ÚlocationZdowngrade_toZPackageNotFoundErrorZPackagesNotInstalledErrorr�   rN   )
rF   ZspecsZ	file_pkgsrŸ   rr   r   re   ÚargÚerrrd   r   r   r   ÚdowngradePkgs’  s,    	

(
&
"
zBaseCli.downgradePkgsÚallc       !      C   sD  y$| j jjd }| j||||d�}W n0 tjjk
rT } zdt|ƒgfS d}~X �nìX i }i }	i }
d}|dkrzt| j |ƒ}|rÈ|j	rÈxB|j
|j |j D ],}|j|jf}||ks¼||| kr˜|||< q˜W |oÐ|j�rx8|jD ].}|j|jf}||	k�s||	| krÜ||	|< qÜW |�rP|j�rPx2t|jƒD ]$}|jtjk�r(||
|j|jf< �q(W | 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ƒƒ xLt|j(t)j*dƒd�D ]}| j j+|d|d� �qŽW n| j j|j&tdƒ||d�}| j j|j,tdƒ||d�} t%|ƒ�r@| dk�r@|dk�r@|dk�r@|dk�r@|dk�r@|dk�r@|dk�r@tjjtdƒƒ‚dS )zJOutput selection *pkgnarrow* of packages matching *patterns* and *repoid*.r7   )Úinstalled_availabler…   r   Nr]   zInstalled Packages)ú>ú<r†   znot in)r‡   r(   rˆ   zAvailable Packages)r§   r¦   r†   znot inzAutoremove Packages)r(   zExtra PackageszAvailable Upgrades)r†   znot inr   zObsoleting Packages)r‰   r%   zRecently Added PackageszNo matching Packages to list)-r   r6   rŒ   rŠ   r   rM   rN   ro   r)   r   Úhidden_availableÚreinstall_availableZold_availabler   r   r    Úhidden_installedr#   r�   r…   ÚhawkeyZSYSTEM_REPO_NAMErC   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%   r3   r&   r“   r”   r•   r$   )!rF   ÚbasecmdÚ	pkgnarrowr–   r…   r˜   r'   re   Zupdate_pkgsZ	inst_pkgsr—   r(   r   r‰   rq   ZclioZclinZclirZclieZripZclauZcladZclarZclaiZrapZraepZrepr™   rš   ZrupZropr›   Zrrapr   r   r   Úoutput_packages´  s†    







F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rvx(|jD ]}|j rT| rT|jj|ƒ qTW |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_listsrC   Úshowdupesfromreposr©   r   r    rQ   r¨   rª   )	rF   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 }x4|D ],}tt| ƒj|ƒ\}}|j|ƒ |j|ƒ qW x t|ƒD ]}| jj|||ƒ qXW || j _|sŒt	j
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 foundN)rC   r¯   rD   rB   ÚprovidesÚextendr�   r   Zmatchcallback_verboser   rM   rN   r
   )	rF   ÚargsZold_sdupZmatchesZused_search_stringsÚspecr1   Zused_search_stringr   )rG   r   r   r°   ?  s    

zBaseCli.providesc             C   s   | j jr| j j rdS dS )NFT)rC   rj   rW   )rF   r   r   r   rV   ^  s    zBaseCli._promptWanted)N)r¤   NFN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   r^   r[   r}   r   r„   rœ   rž   r£   r®   rŠ   r°   rV   Ú__classcell__r   r   )rG   r   rB   ™   s   k'&"Y 
1rB   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jƒ | _| jtjj	j
jƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	jjƒ | jtjj	j j!ƒ | jtjj	j"j#ƒ | jtjj	j$j%ƒ | jtjj	j&j'ƒ | jtjj	j(j)ƒ | jtjj	j*j+ƒ | jtjj	j,j-ƒ | jtjj	j.j/ƒ | jtjj	j0j1ƒ | jtjj	j2j3ƒ | jtjj	j4j5ƒ | jtjj	j6j7ƒ | jtjj	j8ƒ | jtjj	j9ƒ | jtjj	j:ƒ | jtjj	j;ƒ | jtjj	j<ƒ | jtjj	j=ƒ d S )N)>r9   Úcli_commandsÚcommandr   rZ   ZdemandZDemandSheetÚdemandsÚregister_commandZcommandsÚaliasZAliasCommandr"   ZAutoremoveCommandZcheckZCheckCommandZcleanZCleanCommandZ
distrosyncZDistroSyncCommandZdeplistZDeplistCommandZ	downgradeZDowngradeCommandrR   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)rF   r9   r   r   r   rE   f  sB    zCli.__init__c             C   s  | j j|ƒ |jr^xJ|jjƒ D ]<\}}| j jj|| j j|gd�}|j|ƒ |jj	|dfƒ qW |j
rŠ|jjddƒ |jjdd„ |j
D ƒƒ tƒ }yzxt|jD ]j\}}| j jj|ƒ}|sè| j jjrÞ|dkrÞtdƒ}	tjj|	| ƒ‚|j|ƒ |dk� rü|jƒ  qš|jƒ  qšW W nF tjjk
�rP }
 z$tj|
ƒ | jjƒ  tjd	ƒ W Y d d }
~
X nX x|D ]}tjtd
ƒ|ƒ �qXW | j jj ƒ }|d k�r”| j jj!ƒ }x,|D ]$}| j jj"|ƒ}|�rš|j#j$ƒ  �qšW | j j%j&ƒ \}| j _'| j jj(ƒ j)|ƒ t%j*| j | j j%ƒ}| j jj(ƒ j+|ƒ d S )N)ZbaseurlÚenabler   Ú*Údisablec             S   s   g | ]}|d f‘qS )rÄ   r   )rv   Úrr   r   r   rx   •  s    z(Cli._configure_repos.<locals>.<listcomp>zUnknown repo: '%s'r   zNo repository match: %s)rÅ   rÆ   ),r9   Zread_all_reposZrepofrompathr<   ÚreposZadd_new_reporC   Ú_configure_from_optionsZrepos_edrQ   ÚrepoÚinsertr±   ÚsetZget_matchingrŸ   r
   r   rM   Z	RepoErrorÚaddrÄ   rÆ   ÚConfigErrorr=   rp   Ú	optparserÚ
print_helprk   Úexitr>   Z_repo_persistorZget_expired_reposr‚   ÚgetÚ_repoÚexpirer   Zsetup_progress_callbacksZ_ds_callbackr¤   Úset_progress_barZCliKeyImportZ_set_key_import)rF   ÚoptsZlabelrŽ   Z	this_repoZnotmatchrÊ   Z	operationrÁ   rd   re   Zexpired_reposr   ZbarZ
key_importr   r   r   Ú_configure_reposŠ  sL    








zCli._configure_reposc             C   sv   t jdjtjjd�tjjƒ t jtj	j
d| jƒ t jtj	j
d| jjjƒ t jtj	j
d| jjjƒ t jd| jjjƒ d S )Nz{prog} version: %s)rH   zCommand: %szInstallroot: %szReleasever: %szcachedir: %s)r=   Údebugr?   r   rK   rU   ÚconstÚVERSIONÚlogÚloggingÚDDEBUGÚ	cmdstringr9   rC   ÚinstallrootÚ
releaseverÚcachedir)rF   r   r   r   Ú_log_essentials½  s    



zCli._log_essentialsc             C   s  | j }| jj}|jr.tjjƒ s.tjjt	dƒƒ‚|j
rLx|jƒ D ]
}d|_q>W |js\| jjjrŠd| jj_xn|jƒ D ]}|jjtjjƒ qpW nL|jr®xD|jƒ D ]}|jjƒ  qšW n(|jsÖx |jƒ D ]}|jjtjjƒ q¾W |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¼   r9   rÈ   Z	root_userr   rK   Z	am_i_rootrM   rN   r
   r{   Úiter_enabledZload_metadata_otherÚ	cacheonlyrC   ÚvaluesrÓ   ZsetSyncStrategyrÊ   ZSYNC_ONLY_CACHEÚfreshest_metadatarÔ   Zfresh_metadataZ	SYNC_LAZYZsack_activationZ	fill_sackrä   Zavailable_repos)rF   r¼   rÈ   rÊ   r   r   r   Ú_process_demandsÈ  s.    



zCli._process_demandsc             C   s°   |j }| jj|ƒ}|dkr~tjtdƒ|tjd ƒ | jj	j
r`tjtdƒjtjjtjjd�|ƒ ntjtdƒjtjjd�ƒ t‚|| ƒ| _ tjtjjd|ƒ tj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.)rH   zBase command: %szExtra commands: %s)r»   rº   rÒ   r=   rp   r
   rk   Úargvr9   rC   Zpluginsr?   r   rK   rL   rU   r   rÛ   rÜ   rÝ   )rF   rÖ   r²   r¬   Úcommand_clsr   r   r   Ú_parse_commandsç  s    


zCli._parse_commandsNc       	      C   sœ  t jjjƒ }|j|ƒ}|dkr*t jjjƒ n|| _| jj|ƒ}|j	rpt
t jjƒ t| jjj| j| jjƒ tjdƒ |jr‚d|_d|_|jr˜t jj |_|_yh|jrÄ| jjjd| jjjt jjƒ d| j_| jjj|ƒ | j|j ƒ d|krò|j!| jj_!| jjj"ƒ  W nœ t j#j$t%fk
�rF } z t&j't(dƒ|ƒ tjdƒ W Y dd}~X nX t)k
�rœ } z:d	t*t+|ƒƒt,|j-ƒf }t&j't(dƒ|ƒ tjdƒ W Y dd}~X nX |j.dk	�rè|j.| jj_.| jjj/ �rè|j0dk�rèt&j't(dƒƒ tjdƒ |j1�sø|j2�r|j0dk�rt&j't(dƒƒ tjdƒ |j3dk	�r>t4j5t6j7|j3d ƒƒ | jj8| j9dƒ | jj:|j;|j<| ƒ | jj8| j9dƒ |j0�sŽ| jj=ƒ  tjdƒ || j_>| jj?d | _@x$| jj>D ]}|  j@d| 7  _@�q®W | jAƒ  y| jB||ƒ W n  tCk
�r   tjdƒ Y nX |jD�r$| jj=| j0ƒ tjdƒ | jjE| j0|ƒ}|jF�rN|jF| j_Gd| j_H|jI�r`|jI| j_I|jJ�rrd| jj_K|jL�r„d| jj_L| j0jMƒ  | jjNƒ  | jjOƒ  | jP|ƒ | jjQƒ  | jjj|ƒ | j0jRƒ  | jjj.�r t jSjT| jjj.ƒ | jjj.| jjUjVƒ _W| jjjXdk�r(| jjjYjZ| jjjXd� t[j\dƒdk�r˜d}x,| jjUj]ƒ D ]}|j^�rZ�qJd|_^d}�qJW | jjj_�s„d| jj__d}|�r˜t&j`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Údownloadúsystem-upgradeÚreposyncÚ
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pluginr   z%s rã   )Úcolorz%_pkgverify_levelÚ	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))rí   rî   rï   rð   )rô   r¤   )ar   rZ   ÚaliasesZAliasesZresolveÚoption_parserZOptionParserrÏ   Zparse_main_argsr4   r3   rÙ   rÚ   r;   r9   rC   Zhistory_record_packagesr   rk   rÑ   ÚquietZ
debuglevelZ
errorlevelr‹   ZVERBOSE_LEVELræ   Z
_set_valueZsystem_cachedirZPRIO_DEFAULTr¼   rÉ   Ú_read_conf_filerà   r   Z_adjust_conf_optionsrM   rÎ   rn   r=   rp   r
   ÚIOErrorr	   ro   ÚreprÚfilenameZdestdirrT   r»   Zset_enabledZset_disabledZ	sleeptimer*   Z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Ú	configurerK   Z
ensure_dirrÈ   r¤   Zpkgdirró   r6   Zreinitry   ZexpandMacrorå   ZgpgcheckZlocalpkg_gpgcheckr>   )	rF   r²   rö   rõ   rÖ   re   r¡   ZforcingrÊ   r   r   r   rþ   ý  sÀ    





















zCli.configurec             C   sB  t jjdƒ}| jj}|jdƒ |jdƒ |jdƒ}|jdƒt jj	krht
jj|ƒ rht jjtdƒj|ƒƒ‚|jt jjd� |jdƒ}|jdƒt jj	kr˜d}|j}|j||jdƒd� |d krÔ|jd krÔt jj|jƒ}n|dkrèt jj|ƒ}|d k	rö||_|jd k�rtjtd	ƒƒ xdD ]}|j|ƒ �qW | jjj|ƒ |ƒ  |S )NÚ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á   ÚlogdirÚ
persistdir)rá   r  r  )r   rÜ   ZTimerr9   rC   Z_check_remote_fileZ_search_inside_installrootZ
_get_valueZ_get_priorityZPRIO_COMMANDLINEr�   rŽ   ÚisfilerM   rÎ   r
   r?   ÚreadZPRIO_MAINCONFIGZsubstitutionsZupdate_from_etcrà   ry   Zdetect_releaseverrß   r=   r>   Zprepend_installrootÚ_loggingZ_setup_from_dnf_conf)rF   rà   ZtimerrC   rû   Z	from_rootZsubstÚoptr   r   r   rø   Œ  s6    




zCli._read_conf_fileÚeqc             C   sŒ   |dkr|dkrdS g }|j s"|r,|jdƒ |js6|r@|jdƒ |jsJ|rT|jdƒ |js^|rh|j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	  rQ   r
  r  r  r9   Zadd_security_filtersr  r  r  r  )rF   rÖ   Zcmp_typer¤   r  r   r   r   Ú _populate_update_security_filter¹  s    







z$Cli._populate_update_security_filterc             C   s4   |dk	r| j jjj|ƒ |dk	r0| j 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)r9   r  Zstdout_handlerZsetLevelZstderr_handler)rF   ÚstdoutÚstderrr   r   r   Úredirect_loggerÒ  s    zCli.redirect_loggerc             C   s.   t jjj|ƒ}|| jj_| jjjƒ j|ƒ d S )N)	r   rZ   rY   ZMultiFileProgressMeterr9   r   rÈ   r¤   rÕ   )rF   ZforY   r   r   r   Úredirect_repo_progressß  s    
zCli.redirect_repo_progressc             C   s„   | j jjƒ }|d krd S | j jjƒ j|jd�}|jƒ }|jdd� |}x|D ]}||krL|}qLW ||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)r9   r/   Zget_running_kernelr1   r2   r   r   r3   )rF   ZkernelÚqZikpkgr   r   r   r   Ú_check_running_kernelä  s    
zCli._check_running_kernelc             C   s*   t | jjƒ ƒ tjjtdj||ƒƒƒ‚d S )Nz)argument {}: not allowed with argument {})r3   rÏ   Zprint_usager   rM   rN   r
   r?   )rF   Zoption_string_1Zoption_string_2r   r   r   Ú_option_conflictö  s    zCli._option_conflictc             C   s<   x6|j D ],}|| jkr*tjjtdƒ| ƒ‚|| j|< qW dS )zRegister a Command. :apizCommand "%s" already definedN)rõ   rº   r   rM   rÎ   r
   )rF   rë   r   r   r   r   r½   û  s    
zCli.register_commandc             C   sì   | j ƒ  | jjjr8tjtdƒdjtt	| jjjƒƒƒ ƒ | jjj
rhtjtdƒdjtt	| jjj
ƒƒƒ ƒ xx| jjjƒ D ]h}|jr¬tjtdƒ|j d djtt	|jƒƒƒ ƒ |j
rvtjtdƒ|j d djtt	|j
ƒƒƒ ƒ qvW | j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: z, zIncludes in dnf.conf: zExcludes in repo z: zIncludes in repo )ré   r9   rC   Zexcludepkgsr=   rØ   r
   ra   r�   rÌ   ZincludepkgsrÈ   rå   Úidr»   Úrun)rF   rÊ   r   r   r   r    s    
"
"(,zCli.run)N)N)r  N)NN)r´   rµ   r¶   rE   r×   râ   ré   rì   rþ   rø   r  r  rk   r  r  r  r  r½   r  r   r   r   r   r¹   e  s   $3
 
-

r¹   )r   )Or·   Z
__future__r   r   r   Úcollections.abcr   ÚImportErrorÚcollectionsrz   rÜ   r“   r�   rü   ry   rk   r*   r«   Zlibdnf.transactionrc   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)   r;   rA   ZBaserB   Úobjectr¹   r   r   r   r   Ú<module>   s�   

   O