a
    ©!cŠ>  ã                	   @   sH  d dl mZmZ d dl mZ d dl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ZdZdZdZd	Zd
ZdZdZeeegZeeegZejjejj ejj!ejj"ejj#ejj$ejj%ejj&ejj'h	Z(e )d¡Z*dd„ Z+G dd„ de,ƒZ-G dd„ de-ƒZ.G dd„ de-ƒZ/G dd„ de,ƒZ0dS )é    )Úprint_functionÚabsolute_import)Úunicode_literalsN)Ú_Úucdé
   é   é(   é2   é<   éF   éZ   éd   Údnfc                    s   t ‡ fdd„ƒ}|S )zb
    Wrapper to return a deprecated action constant
    while printing a deprecation warning.
    c                    s2   d| j jˆ ˆ f }tj|tdd ttjˆ ƒ}|S )Nz1%s.%s is deprecated. Use dnf.callback.%s instead.é   )Ú
stacklevel)Ú	__class__Ú__name__ÚwarningsÚwarnÚDeprecationWarningÚgetattrr   Úcallback)ÚselfÚmsgÚvalue©Úname© ú4/usr/lib/python3.9/site-packages/dnf/yum/rpmtrans.pyÚ_funcC   s    ÿz%_add_deprecated_action.<locals>._func)Úproperty)r   r    r   r   r   Ú_add_deprecated_action>   s    r"   c                   @   s˜   e Zd Zdd„ ZedƒZedƒZedƒZeZedƒZ	edƒZ
edƒZed	ƒZed
ƒZedƒZedƒZedƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTransactionDisplayc                 C   s   d S ©Nr   ©r   r   r   r   Ú__init__P   s    zTransactionDisplay.__init__ÚPKG_CLEANUPÚPKG_DOWNGRADEÚ
PKG_REMOVEÚPKG_INSTALLÚPKG_OBSOLETEÚPKG_REINSTALLÚPKG_UPGRADEÚ
PKG_VERIFYÚTRANS_PREPARATIONÚPKG_SCRIPTLETÚ
TRANS_POSTc                 C   s   dS )a  Report ongoing progress on a transaction item. :api

        :param package: a package being processed
        :param action: the action being performed
        :param ti_done: number of processed bytes of the transaction
           item being processed
        :param ti_total: total number of bytes of the transaction item
           being processed
        :param ts_done: number of actions processed in the whole
           transaction
        :param ts_total: total number of actions in the whole
           transaction

        Nr   )r   ÚpackageÚactionZti_doneZti_totalZts_doneZts_totalr   r   r   Úprogressb   s    zTransactionDisplay.progressc                 C   s   dS )z_Hook for reporting an rpm scriptlet output.

        :param msgs: the scriptlet output
        Nr   ©r   Úmsgsr   r   r   Ú	scriptouts   s    zTransactionDisplay.scriptoutc                 C   s   dS )z:Report an error that occurred during the transaction. :apiNr   ©r   Úmessager   r   r   Úerrorz   s    zTransactionDisplay.errorc                 C   s   dS )z|package is the same as in progress() - a package object or simple
           string action is also the same as in progress()Nr   )r   r2   r3   r   r   r   Úfilelog~   s    zTransactionDisplay.filelogc                 C   s   |   |tjjdd||¡ d S )Nr   )r4   r   Útransactionr.   )r   ÚpkgÚcountÚtotalr   r   r   Úverify_tsi_package„   s    z%TransactionDisplay.verify_tsi_packageN)r   Ú
__module__Ú__qualname__r&   r"   r'   r(   r)   Z	PKG_ERASEr*   r+   r,   r-   r.   r/   r0   r1   r4   r7   r:   r;   r@   r   r   r   r   r#   M   s$   r#   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚErrorTransactionDisplayz@An RPMTransaction display that prints errors to standard output.c                    s&   t t| ƒ |¡ tj d|tj¡ d S )NÚprint)ÚsuperrC   r:   r   ÚutilZ_terminal_messengerÚsysÚstderrr8   ©r   r   r   r:      s    zErrorTransactionDisplay.error)r   rA   rB   Ú__doc__r:   Ú__classcell__r   r   rI   r   rC   ‰   s   rC   c                       s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚLoggingTransactionDisplayz@
    Base class for a RPMTransaction display callback class
    c                    s   t t| ƒ ¡  t d¡| _d S )Nzdnf.rpm)rE   rL   r&   ÚloggingÚ	getLoggerÚ
rpm_loggerr%   rI   r   r   r&   –   s    z"LoggingTransactionDisplay.__init__c                 C   s   | j  |¡ d S r$   )rO   r:   r8   r   r   r   r:   š   s    zLoggingTransactionDisplay.errorc                 C   s.   t jj| }d||f }| j t jj|¡ d S )Nz%s: %s)r   r<   ZFILE_ACTIONSrO   ÚlogrM   ZSUBDEBUG)r   r2   r3   Z
action_strr   r   r   r   r;      s    z!LoggingTransactionDisplay.filelogc                 C   s   |r| j  t|ƒ¡ d S r$   )rO   Úinfor   r5   r   r   r   r7   ¢   s    z#LoggingTransactionDisplay.scriptout)	r   rA   rB   rJ   r&   r:   r;   r7   rK   r   r   rI   r   rL   ’   s
   rL   c                   @   sà   e Zd Zd9dd„Zd: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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d.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8S );ÚRPMTransactionFr   c                 C   sn   |st ƒ g}|| _|| _|| _d| _d | _d| _d| _d| _t	ƒ | _
d| _|  |jj¡ g | _d| _d | _d S )NFr   )rC   ÚdisplaysÚbaseÚtestÚtrans_runningÚfdÚtotal_actionsÚtotal_installedÚcomplete_actionsÚsetÚinstalled_pkg_namesÚtotal_removedÚ_setupOutputLoggingZconfÚrpmverbosityÚ_te_listÚ	_te_indexÚ
_tsi_cache)r   rT   rU   rS   r   r   r   r&   ¨   s     zRPMTransaction.__init__rQ   c                 C   s~   t  ¡ }|| _t|jdƒ| _| jj | j¡ ddddddœ 	||¡}d| 
¡  }tt|ƒs^d	}t tt|ƒ¡ t | j¡ d S )
Nzw+bZcritZemergÚerrrQ   Zwarning)ÚcriticalZ	emergencyr:   Zinformationr   ZRPMLOG_ZRPMLOG_INFO)ÚtempfileZNamedTemporaryFileÚ	_readpipeÚopenr   Ú
_writepiperT   Ú_tsZsetScriptFdÚgetÚupperÚhasattrÚrpmÚsetVerbosityr   Ú
setLogFile)r   r_   Zio_rr   r   r   r^   ½   s"    üü
z"RPMTransaction._setupOutputLoggingc                 C   s8   t  t j¡ t  tj¡ z| j ¡  W n   Y n0 d S r$   )rm   rn   ZRPMLOG_NOTICEro   rG   rH   rh   Úcloser%   r   r   r   Ú_shutdownOutputLoggingÎ   s    z%RPMTransaction._shutdownOutputLoggingc                 C   sD   z,| j  | j  ¡ ¡ | j  ¡ }|s(W d S |W S  ty>   Y n0 d S r$   )rf   ÚseekÚtellÚreadÚIOError)r   Úoutr   r   r   Ú_scriptOutput×   s    
zRPMTransaction._scriptOutputc                 c   s(   |   ¡ }|r$| ¡ D ]}t|ƒV  qd S r$   )rw   Ú
splitlinesr   )r   ÚmessagesÚliner   r   r   ry   ç   s    zRPMTransaction.messagesc                 C   s0   |   ¡ }| jD ]}| |¡ q| jj |¡ d S r$   )rw   rS   r7   rT   ÚhistoryZlog_scriptlet_output)r   r6   Údisplayr   r   r   Ú
_scriptoutí   s    
zRPMTransaction._scriptoutc                 C   s   |   ¡  d S r$   )rq   r%   r   r   r   Ú__del__ó   s    zRPMTransaction.__del__c                 C   sœ   t |dƒr|}|gS | j| j }tj |¡}| jrJt| jd ƒ|krJ| jS g }| jj	D ]&}|j
tvrfqVt|ƒ|krV| |¡ qV|rŒ|| _|S td| ƒ‚dS )z3Obtain the package related to the calling callback.r=   r   z%TransactionItem not found for key: %sN)rl   r`   ra   r   rF   Z	_te_nevrarb   ÚstrrT   r<   r3   ÚRPM_ACTIONS_SETÚappendÚRuntimeError)r   ZcbkeyZtsiZteZte_nevraÚitemsr   r   r   Ú_extract_cbkeyö   s$    

zRPMTransaction._extract_cbkeyc           
      C   sî  z¦t |tƒrt|ƒ}|tjkr.|  |¡ nx|tjkr<nj|tjkrV|  ||¡ nP|tj	krp|  
||¡ n6|tjkr†|  |¡W S |tjkrž|  |¡ n|tjkr´|  |¡ nò|tjkrÊ|  |¡ nÜ|tjkrä|  |||¡ nÂ|tjkrú|  |¡ n¬|tjkr|  |¡ n”|tjkr.|  |||¡ nx|tjkrF|  |¡ n`|tjkr^|  |¡ nH|tjkrz|   |||¡ n,|tj!kr’|  "|¡ n|tj#kr¦|  $¡  W n@ t%yè   t& '¡ \}}}t( )|||¡}	t* +d ,|	¡¡ Y n0 d S )NÚ )-Ú
isinstancer   r   rm   ZRPMCALLBACK_TRANS_STARTÚ_transStartZRPMCALLBACK_TRANS_STOPZRPMCALLBACK_TRANS_PROGRESSÚ_trans_progressZRPMCALLBACK_ELEM_PROGRESSÚ_elemProgressZRPMCALLBACK_INST_OPEN_FILEÚ_instOpenFileZRPMCALLBACK_INST_CLOSE_FILEÚ_instCloseFileZRPMCALLBACK_INST_STARTÚ_inst_startZRPMCALLBACK_INST_STOPÚ
_inst_stopZRPMCALLBACK_INST_PROGRESSÚ_instProgressZRPMCALLBACK_UNINST_STARTÚ_uninst_startZRPMCALLBACK_UNINST_STOPÚ_unInstStopZRPMCALLBACK_UNINST_PROGRESSÚ_uninst_progressZRPMCALLBACK_CPIO_ERRORÚ
_cpioErrorZRPMCALLBACK_UNPACK_ERRORÚ_unpackErrorZRPMCALLBACK_SCRIPT_ERRORÚ_scriptErrorZRPMCALLBACK_SCRIPT_STARTÚ_script_startZRPMCALLBACK_SCRIPT_STOPÚ_scriptStopÚ	ExceptionrG   Úexc_infoÚ	tracebackÚformat_exceptionÚloggerrd   Újoin)
r   ZwhatÚamountr?   ÚkeyZclient_dataÚexc_typeÚ	exc_valueÚexc_tracebackZexcept_listr   r   r   r     sR    










zRPMTransaction.callbackc                 C   s(   || _ | jrd S d| _t| jjƒ| _d S )NT)rX   rU   rV   ÚlistrT   ri   r`   )r   r?   r   r   r   r‡   <  s    
zRPMTransaction._transStartc              	   C   s0   t jj}| jD ]}| d||d |dd¡ qd S )Nr…   é   )r   r<   r/   rS   r4   )r   r   r?   r3   r|   r   r   r   rˆ   B  s    
zRPMTransaction._trans_progressc                 C   sL   || _ |  jd7  _| jsH|  |¡}| jD ]}| |d j|d j¡ q*d S )Nr£   r   )ra   rZ   rU   r„   rS   r;   r=   r3   )r   rž   ÚindexÚtransaction_listr|   r   r   r   r‰   G  s    

zRPMTransaction._elemProgressc              
   C   s¤   d | _ |  |¡}|d j}| ¡ }zt|ƒ| _W nB tyr } z*| jD ]}| d||f ¡ qFW Y d }~n6d }~0 0 | j	r–|  j
d7  _
| j |j¡ | j ¡ S d S )Nr   zError: Cannot open file %s: %sr£   )Zlastmsgr„   r=   ZlocalPkgrg   rW   ru   rS   r:   rV   rY   r\   Úaddr   Úfileno)r   rž   r¥   r=   ZrpmlocÚer|   r   r   r   rŠ   O  s    


*zRPMTransaction._instOpenFilec                 C   s   | j  ¡  d | _ d S r$   )rW   rp   ©r   rž   r   r   r   r‹   _  s    
zRPMTransaction._instCloseFilec                 C   s   d S r$   r   r©   r   r   r   rŒ   c  s    zRPMTransaction._inst_startc              	   C   sP   | j s| jsd S |  ¡  | j| jkrLtjj}| jD ]}| 	d |d d d d ¡ q2d S r$   )
rU   rV   r}   rZ   rX   r   r<   r1   rS   r4   )r   rž   r3   r|   r   r   r   r   f  s    
zRPMTransaction._inst_stopc              	   C   sF   |   |¡}|d j}|d j}| jD ]}| ||||| j| j¡ q$d S ©Nr   ©r„   r=   r3   rS   r4   rZ   rX   ©r   r   r?   rž   r¥   r=   r3   r|   r   r   r   rŽ   r  s
    



zRPMTransaction._instProgressc                 C   s   |  j d7  _ d S )Nr£   )r]   r©   r   r   r   r   y  s    zRPMTransaction._uninst_startc              	   C   sF   |   |¡}|d j}|d j}| jD ]}| ||||| j| j¡ q$d S rª   r«   r¬   r   r   r   r‘   |  s
    



zRPMTransaction._uninst_progressc                 C   s   | j r
d S |  ¡  d S r$   )rU   r}   r©   r   r   r   r   ƒ  s    zRPMTransaction._unInstStopc                 C   s2   |   |¡}d|d j }| jD ]}| |¡ qd S )Nz'Error in cpio payload of rpm package %sr   ©r„   r=   rS   r:   ©r   rž   r¥   r   r|   r   r   r   r’   ‰  s    

zRPMTransaction._cpioErrorc                 C   s2   |   |¡}d|d j }| jD ]}| |¡ qd S )NzError unpacking rpm package %sr   r­   r®   r   r   r   r“     s    

zRPMTransaction._unpackErrorc           	      C   sJ   t j |d¡}|  |¡}|d jj}d||f }| jD ]}| |¡ q6d S )Nz	<unknown>r   z'Error in %s scriptlet in rpm package %s)rm   Ztagnamesrj   r„   r=   r   rS   r:   )	r   r   r?   rž   Zscriptlet_namer¥   r   r   r|   r   r   r   r”   •  s    

zRPMTransaction._scriptErrorc              	   C   s”   t jj}|d u r | jg kr d}n|  |¡}|d j}| jdkrN| jdkrN| jnd}| jdkrl| jdkrl| jnd}| jD ]}| 	||dd||¡ qvd S )NÚNoner   r£   r   )
r   r<   r0   r`   r„   r=   rX   rZ   rS   r4   )r   rž   r3   r=   r¥   Zcompleter?   r|   r   r   r   r•   ¢  s    

ÿ
zRPMTransaction._script_startc                 C   s   |   ¡  d S r$   )r}   r%   r   r   r   r–   °  s    zRPMTransaction._scriptStopc                 C   s   | j D ]}| |||¡ qd S r$   )rS   r@   )r   r=   r>   r?   r|   r   r   r   r@   ³  s    
z!RPMTransaction.verify_tsi_packageN)Fr   )rQ   )r   rA   rB   r&   r^   rq   rw   ry   r}   r~   r„   r   r‡   rˆ   r‰   rŠ   r‹   rŒ   r   rŽ   r   r‘   r   r’   r“   r”   r•   r–   r@   r   r   r   r   rR   §   s4   

	.rR   )1Z
__future__r   r   r   Zlibdnf.transactionZlibdnfZdnf.i18nr   r   Zdnf.callbackr   Zdnf.transactionZdnf.utilrm   ÚosrM   rG   re   r™   r   Z	TS_UPDATEZ
TS_INSTALLZTS_ERASEZTS_OBSOLETEDZTS_OBSOLETINGZTS_AVAILABLEZ
TS_UPDATEDZ	TS_FAILEDZTS_INSTALL_STATESZTS_REMOVE_STATESr<   ZTransactionItemAction_INSTALLZTransactionItemAction_DOWNGRADEZ TransactionItemAction_DOWNGRADEDZTransactionItemAction_OBSOLETEZTransactionItemAction_OBSOLETEDZTransactionItemAction_UPGRADEZTransactionItemAction_UPGRADEDZTransactionItemAction_REMOVEZ!TransactionItemAction_REINSTALLEDr€   rN   r›   r"   Úobjectr#   rC   rL   rR   r   r   r   r   Ú<module>   sN   

ø

<	