a
    Tsg$[                     @   s   d Z ddlmZ ddlmZ ddlm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mZ ddlZddlZd
d ZG dd de	jZdS )zUpdateInfo CLI command.    )absolute_import)print_function)unicode_literalsN)commands)OptionParser)_exact_widthunicodec                 C   s   t dd | D S )z7Return maximum length of items in a non-empty iterable.c                 s   s   | ]}t |V  qd S N)r   ).0item r   ?/usr/lib/python3.9/site-packages/dnf/cli/commands/updateinfo.py	<genexpr>(       z_maxlen.<locals>.<genexpr>)max)iterabler   r   r   _maxlen&   s    r   c                       sF  e Zd ZdZejedejedejedej	edej
ediZededed	ed
eddZddhZddddddddZddgee  ZedZdZdddegZ fddZedd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$d8d9 Z%d:d; Z&  Z'S )<UpdateInfoCommandz)Implementation of the UpdateInfo command.bugfixenhancementsecurityunknown
newpackagezCritical/Sec.zImportant/Sec.zModerate/Sec.zMedium/Sec.zLow/Sec.)Critical	ImportantModerateMediumLowr   r   listinfosummary)zlist-updateinfozlist-securityzlist-seczinfo-updateinfozinfo-securityzinfo-seczsummary-updateinfoZ
updateinfoZupifz!display advisories about packages	available	installedupdatesallc                    s   t t| | d| _dS )zInitialize the command.N)superr   __init___installed_query)selfcli	__class__r   r   r(   H   s    zUpdateInfoCommand.__init__c              	   C   s.  |   }|jddddtdd |jddddtd	d |jd
dddtdd |jddddtdd g d}|   }|jddddtdd |jddddtdd |jddddtdd | jddddtdd  | jd!d"ddtd#d  | jd$d%ddtd&d  | jd'd(d)||d* tjtd+d, d S )-Nz--available_availabilityr#   store_constz?advisories about newer versions of installed packages (default))destconstactionhelpz--installedr$   z?advisories about equal and older versions of installed packagesz	--updatesr%   zbadvisories about newer versions of those installed packages for which a newer version is availablez--allr&   z3advisories about any versions of installed packages)r"   r    r!   z	--summary_spec_actionr"   z$show summary of advisories (default)z--listr    zshow list of advisoriesz--infor!   zshow info of advisoriesz
--with-cvewith_cveF
store_truez'show only advisories with CVE reference)r0   defaultr2   r3   z	--with-bzwith_bzz,show only advisories with bugzilla referencez--jsonjsonzDisplay in JSON format.spec*ZSPECr   zPackage specification)nargsmetavarchoicesr7   r2   r3   )Zadd_mutually_exclusive_groupadd_argumentr   r   ZPkgNarrowCallback)parseravailabilityZcmdsZoutput_formatr   r   r   set_argparserM   s`    






zUpdateInfoCommand.set_argparserc                 C   s  d| j j_d| j j_| jj| jv r6| j| jj | j_n| jjrJ| jj| j_| jj	r`| jj	| j_
n8| jjrz| jjd | jvr| j| j_
n| jjd| j_
t | j_| jjr| jjtj | jjr| jjtj | jjr| jjtj | jjr| jjtj | jjr| jjd}|dkr8| jjtj n|dkrT| jjtj np|dv rp| jjtj nT|dkr| jjtj n8|dv rd| j_n$|dkrd| j_n| jjd| | jjr| j jt j!t j!d	 | jj"r| jj#| jj" d
S )zADo any command-specific configuration based on command arguments.Tr   r   r   )r   Zsecr   )Z	bugzillasZbzscves)stdoutstderrN)$r+   ZdemandsZavailable_reposZsack_activationoptsZcommanddirect_commandsspec_actionr4   r.   rA   r:   availabilitiesavailability_defaultpopset_advisory_typesr   addhawkeyADVISORY_BUGFIXr   ADVISORY_ENHANCEMENTr   ADVISORY_NEWPACKAGEr   ADVISORY_SECURITYr8   r5   insertr9   Zredirect_loggersysmaxsizeadvisoryextend)r*   r:   r   r   r   	configurev   sN    














zUpdateInfoCommand.configurec                 C   s   | j jr0| j| j jr0t| j| j j| j _| j jdkrT| | j j}t	d}n^| j jdkrx| 
| j j}t	d}n:| j jdkr| | j j}t	d}n| | j j}t	d}| j jdkr| | n$| j jdkr| | n| || dS )z#Execute the command with arguments.r$   r%   r&   r#   r    r!   N)rF   severity	MODERATESintersectionr    unionrA   installed_apkg_adv_instsr:   r   updating_apkg_adv_instsall_apkg_adv_instsavailable_apkg_adv_instsrH   display_listdisplay_infodisplay_summary)r*   apkg_adv_instsdescriptionr   r   r   run   s$    


zUpdateInfoCommand.runc                 C   s@   | j d u r | jj   | _ | j j|j|jd}t	|dkS )N)nameZevr__gter   )
r)   basesackqueryr$   Zapplyfilterrh   evrlen)r*   apackageqr   r   r   _newer_equal_installed   s    
z(UpdateInfoCommand._newer_equal_installedc                    s  | j js<| j js<| j js<| j js<| j js<| j js<| j js<dS  j| j jv rNdS t	 fdd| j jD rldS | j jr j| j jv rdS | j jrt	 fdd| j jD rdS | j jrt	 fdd| j jD rdS | j jrt	dd  j
D rdS | j jrt	dd  j
D rdS d	S )
NTc                 3   s   | ]}t  j|V  qd S r   )fnmatchfnmatchcaseidr   patrW   r   r   r      r   z6UpdateInfoCommand._advisory_matcher.<locals>.<genexpr>c                    s   g | ]}  |qS r   )Z	match_bug)r   Zbugrw   r   r   
<listcomp>   r   z7UpdateInfoCommand._advisory_matcher.<locals>.<listcomp>c                    s   g | ]}  |qS r   )Z	match_cve)r   cverw   r   r   rx      r   c                 S   s   g | ]}|j tjkqS r   )typerO   REFERENCE_CVEr   refr   r   r   rx      r   c                 S   s   g | ]}|j tjkqS r   )rz   rO   REFERENCE_BUGZILLAr|   r   r   r   rx      r   F)rF   rM   r:   rZ   bugzillarC   r5   r8   rz   any
references)r*   rW   r   rw   r   _advisory_matcher   s>    ""
z#UpdateInfoCommand._advisory_matcherc                 #   sd   | |D ]T  | jj}| |}t fdd| jjD }|sH|r
|  } ||fV  q
dS )z4Return (adv. package, advisory, installed) triplets.c                 3   s   | ]}t  j|V  qd S r   )rr   rs   rh   ru   ro   r   r   r      s   zAUpdateInfoCommand._apackage_advisory_installed.<locals>.<genexpr>N)	Zget_advisory_pkgsZget_advisoryri   rj   r   r   rF   r:   rq   )r*   Z
pkgs_queryZcmptypespecsrW   Zadvisory_matchZapackage_matchr$   r   r   r   _apackage_advisory_installed   s    

z.UpdateInfoCommand._apackage_advisory_installedc                 C   s@   | j j}| jdd}| }|r<|| j|jd}|S )z<Return query containing packages of currently running kernelT)empty)	sourcerpm)ri   rj   rk   filtermZget_running_kernelr]   r   )r*   rj   rp   Zkernelr   r   r   running_kernel_pkgs   s    z%UpdateInfoCommand.running_kernel_pkgsc                 C   s8   | j j  d}||   }| |tj	|S )z5Return available (adv. package, adv., inst.) triplets   )
ri   rj   rk   r$   Zlatestr]   r   r   rO   GT)r*   r   rp   r   r   r   ra     s    z*UpdateInfoCommand.available_apkg_adv_instsc                 C   s"   |  | jj  tjtjB |S z5Return installed (adv. package, adv., inst.) triplets)r   ri   rj   rk   r$   rO   LTEQr*   r   r   r   r   r^   	  s    z*UpdateInfoCommand.installed_apkg_adv_instsc                 C   s    |  | jj jddtj|S )z4Return updating (adv. package, adv., inst.) tripletsT)Z
upgradable)r   ri   rj   rk   r   rO   r   r   r   r   r   r_     s    z)UpdateInfoCommand.updating_apkg_adv_instsc                 C   s(   |  | jj  tjtjB tjB |S r   )	r   ri   rj   rk   r$   rO   r   r   r   r   r   r   r   r`     s     z$UpdateInfoCommand.all_apkg_adv_instsc                 C   sR   i }|D ]:\}}}|j ||j< |j tjkr|j |jf||j|jf< qt| S )zMake the summary of advisories.)rz   rt   rO   rS   rZ   collectionsCountervalues)r*   re   id2typeapkgrW   r$   r   r   r   _summary  s    zUpdateInfoCommand._summaryc           	      C   sh  |  |}|rNttd|  dtd|tj fdtd|tj fdtd|tjdf fdtd|tjd	f fdtd
|tjdf fdtd|tjdf fdtd|tjdf fdtd|tjdf fdtd|tj fdtd|tj fdtd|tj fg}t	dd |D }|D ]4\}}}|s,qtd|d|  t
||f  q| jjjrd| j  dS )z"Display the summary of advisories.zUpdates Information Summary: r   zNew Package notice(s)zSecurity notice(s)r   zCritical Security notice(s)r   zImportant Security notice(s)r   zModerate Security notice(s)r   zMedium Security notice(s)r   zLow Security notice(s)r   zUnknown Security notice(s)NzBugfix notice(s)zEnhancement notice(s)zother notice(s)c                 s   s"   | ]}|d  rt |d  V  qdS )   Nr	   )r   vr   r   r   r   <  r   z4UpdateInfoCommand.display_summary.<locals>.<genexpr>z
    %*s %s   )r   printr   rO   rR   rS   rP   rQ   ADVISORY_UNKNOWNr   r
   ri   confZautocheck_running_kernelr+   Z_check_running_kernel)	r*   re   rf   Ztyp2cntZlabel_countswidthindentlabelcountr   r   r   rd   $  sD    
"z!UpdateInfoCommand.display_summaryc                    s^   fdd} fdd}t  }|D ]\}}}d|j|j|jf } jjsP jjr|jD ]V}	|	jt	j
krr jjsrqVn|	jt	jkr jjsqV|j|jf||||jft  |	j< qVq"|j|jf||||jft  |j< q"g }
d } }}t| dd d	D ]\\}}}}t|t|}| D ]\}}t|t|}|\}}|| } j|td
} j|td}|dd  }t|t|}|
||||||||f qq jjrg }|
D ]*\}}}}}}}||||||d qttj|tdd n\|
D ]V\}}}}}}} jj j!r>td||||||||f  ntd||||||f  qdS )zDisplay the list of advisories.c                    s     j jdksdS | rdS dS d S )Nr&    zi   )rF   rA   )instr*   r   r   	inst2markF  s
    z1UpdateInfoCommand.display_list.<locals>.inst2markc                    s2   | t jkr j|tdS  j| tdS d S )NzUnknown/Sec.r   )rO   rS   SECURITY2LABELgetr   
TYPE2LABEL)typsevr   r   r   
type2labelN  s    
z2UpdateInfoCommand.display_list.<locals>.type2labelz%s-%s.%sr   c                 S   s   | d S )Nr   r   xr   r   r   <lambda>f  r   z0UpdateInfoCommand.display_list.<locals>.<lambda>keyunspecifiedNone/)rh   rz   rZ   nevraZ	buildtimer   r7   r   z%s%-*s %-*s %-*s %sz%s%-*s %-*s %sN)"dictrh   rm   archrF   r5   r8   r   rz   rO   r~   r{   rZ   
setdefaultupdatedrt   sorteditemsr   rn   r   r   r   r   splitstripappendr9   r   dumpsstrri   r   verbose)r*   re   r   r   Znevra_inst_dictr   rW   r$   r   r}   ZadvlistZidwZtlwZnwr   Zaupdatedr   ZaidZatypesevr   r   r   ZatypeZasevZdtlstr   r   r   rb   D  sX    
 ""
	zUpdateInfoCommand.display_listc                 C   s  t |dd}g }t |dg D ]x}t |dds.qt |ddt |ddt |ddd}|d d|d }|dr|d	|d 7 }|| qd
ddddd}g }t |dg D ]r}	t |	ddt |	dd|t |	ddd
t |	ddpt |	ddpt |	ddd}
dd |
 D }
||
 q||t |ddt |dd| jt |dtdt |ddt |ddpt |ddpt |ddt |d drt |d d!d"ndt |d#dd!t |d$d|d|id%i}|S )&z7Convert DNF advisory object directly to desired format.rt   Npackagesrh   rm   r   )rh   rm   r   -.r   r   ry   Zvendorr   )r   r   r      r   r   titlerz   r   Zhrefurllink)TitleZIdTypeZUrlc                 S   s   i | ]\}}|d ur||qS r   r   )r   kr   r   r   r   
<dictcomp>  r   z7UpdateInfoCommand._process_advisory.<locals>.<dictcomp>rZ   r   r   ZstatusZauthorfromr   r   z%Y-%m-%d %H:%M:%Srf   rights)Namer   Severityr   ZStatusZVendorZIssuedDescriptionZMessageRightsr   r   )getattrr   r   r   r   r   strftime)r*   rW   Zadvisory_idZpackage_listpkgZpkg_infoZpkg_strZREFERENCE_TYPESr   r}   Zref_dictresultr   r   r   _process_advisory  sZ    





&







z#UpdateInfoCommand._process_advisoryc           	         s   j j  j jjtdtdtdtdtdtdtdtdtd	td
f
 fdd}i }t }|D ].\}}}|| |||}|	| qvj
jrttj|tdd ntdt|dd d dS )z/Display the details about available advisories.z	Update IDr   ZUpdatedZBugsZCVEsr   r   r   ZFilesZ	Installedc                    s  | j gj| jtdgt| jgg g | jp0d | j	g| j
pBd tt fdd| jD d g
}| jD ]L}|jtjkr|d d|j |jpd ql|jtjkrl|d |j  ql|d   |d   sd |d< d |d	< jjd
kr|rtdntdg|d< t}g }|d |d| j  |d t|D ]f\}}|d d gfv rfqJt|D ]>\}}	|dkr|nd}
|t|
 }|d|d|
|	f  qnqJd|S )Nr   r   c                 3   s   | ]}|j  v r|jV  qd S r   )r   filename)r   r   )archesr   r   r     s   
zHUpdateInfoCommand.display_info.<locals>.advisory2info.<locals>.<genexpr>r   z{} - {}r         r&   trueZfalse	   zO===============================================================================r   r   z	%*s%s: %s
)rt   r   r   rz   r   r
   r   rf   
splitlinesrZ   r   r   rL   r   r   rO   r~   r   formatr   r{   sortrF   rA   r   zip	enumerater   join)rW   r$   Z
attributesr}   r   linesr   Z	atr_linesiliner   Zkey_paddingr   labelsr*   r   r   r   advisory2info  sH    

 

z5UpdateInfoCommand.display_info.<locals>.advisory2infor   r   z

c                 S   s   |   S r   )lowerr   r   r   r   r     r   z0UpdateInfoCommand.display_info.<locals>.<lambda>r   N)ri   rj   Zlist_archesr   r   r   rL   updater   rN   rF   r9   r   r   r   r   r   )	r*   re   r   Zdt_advisoriesZ
advisoriesr   rW   r$   Zformatted_attributesr   r   r   rc     s     
(
zUpdateInfoCommand.display_info)(__name__
__module____qualname____doc__rO   rP   r   rQ   rS   r   rR   r   r   r[   rG   r    keysaliasesr"   rJ   rI   r(   staticmethodrB   rY   rg   rq   r   r   r   ra   r^   r_   r`   r   rd   rb   r   rc   __classcell__r   r   r,   r   r   +   sX   





(:	 B8r   )r   Z
__future__r   r   r   r   rr   rO   Zdnf.clir   Zdnf.cli.option_parserr   Zdnf.i18nr   r   Z
dnf.pycompr
   rU   r9   r   ZCommandr   r   r   r   r   <module>   s   