a
    ©!cÊ  ã                   @   sÒ   d dl mZ d dl mZ d dlmZmZ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Zd dlZd dlZd dlZd dlZd dlZe d¡Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )é    )Úabsolute_import)Úunicode_literals)ÚProcessLockErrorÚThreadLockErrorÚ	LockError)Ú_)ÚmiscNÚdnfc                 C   s6   t j ¡ s2t |  d¡¡ ¡ }tj 	t
 ¡ d|¡} | S )Núutf-8Zlocks)r	   ÚutilZ	am_i_rootÚhashlibZsha1ÚencodeZ	hexdigestÚosÚpathÚjoinr   ZgetCacheDir)Zdir_Zhexdir© r   ú,/usr/lib/python3.9/site-packages/dnf/lock.pyÚ_fit_lock_dir&   s    
r   c                 C   s   t tj t| ƒd¡d| ƒS )Nzdownload_lock.pidÚcachedir©ÚProcessLockr   r   r   r   ©r   Úexit_on_lockr   r   r   Úbuild_download_lock/   s    ÿr   c                 C   s   t tj t| ƒd¡d| ƒS )Nzmetadata_lock.pidÚmetadatar   r   r   r   r   Úbuild_metadata_lock3   s    ÿr   c                 C   s   t tj t| ƒd¡d| ƒS )Nzrpmdb_lock.pidZRPMDBr   )Z
persistdirr   r   r   r   Úbuild_rpmdb_lock8   s    ÿr   c                 C   s   t tj t| ƒd¡d| ƒS )Nzlog_lock.pidÚlogr   )Zlogdirr   r   r   r   Úbuild_log_lock=   s    ÿr   c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )r   Fc                 C   s&   || _ d| _|| _|| _t ¡ | _d S )Nr   )ÚblockingÚcountÚdescriptionÚtargetÚ	threadingÚRLockÚthread_lock)Úselfr"   r!   r   r   r   r   Ú__init__C   s
    zProcessLock.__init__c                 C   s2   | j jdds d| j }t|ƒ‚|  jd7  _d S )NF)r   z'%s already locked by a different threadé   )r%   Úacquirer!   r   r    )r&   Úmsgr   r   r   Ú_lock_threadJ   s    
zProcessLock._lock_threadc              
   C   s†  t  | jt jt jB d¡}zZzt |tjtjB ¡ W nL t	y€ } z4|j
t
jkrjW Y d }~W t  |¡ dS ‚ W Y d }~n
d }~0 0 t  |d¡}t|ƒdkrÀt  |t|ƒ d¡¡ |W t  |¡ S zt|ƒ}W n( tyô   tdƒ| j }t|ƒ‚Y n0 ||kr|W t  |¡ S t  d| t j¡sft  |dt j¡ t  |d¡ t  |t|ƒ d¡¡ |W t  |¡ S |W t  |¡ S t  |¡ 0 d S )Ni¤  éÿÿÿÿé   r   r
   z–Malformed lock file found: %s.
Ensure no other dnf/yum process is running and remove the lock file manually or run systemd-tmpfiles --remove dnf.conf.z/proc/%d/stat)r   Úopenr"   ÚO_CREATÚO_RDWRÚfcntlZflockZLOCK_EXZLOCK_NBÚOSErrorÚerrnoZEWOULDBLOCKÚcloseÚreadÚlenÚwriteÚstrr   ÚintÚ
ValueErrorr   r   ÚaccessÚF_OKÚlseekÚSEEK_SETÚ	ftruncate)r&   ÚpidÚfdÚeZold_pidr*   r   r   r   Ú	_try_lockP   sL     
à
çý

ô
û
ýzProcessLock._try_lockc                 C   s   |  j d8  _ | j ¡  d S ©Nr(   )r    r%   Úrelease)r&   r   r   r   Ú_unlock_threadz   s    zProcessLock._unlock_threadc                 C   s¦   t j tj | j¡¡ |  ¡  d}t ¡ }|  	|¡}||kr¢|dkrŒ| j
sj|  ¡  d| j|f }t||ƒ‚||krŒtdƒ| }t |¡ |}t d¡ |  	|¡}q4d S )Nr,   z%s already locked by %dz*Waiting for process with pid %d to finish.r(   )r	   r   Z
ensure_dirr   r   Údirnamer"   r+   ÚgetpidrC   r   rF   r!   r   r   ÚloggerÚinfoÚtimeÚsleep)r&   Zprev_pidZmy_pidr@   r*   r   r   r   Ú	__enter__~   s"    



zProcessLock.__enter__c                 G   s"   | j dkrt | j¡ |  ¡  d S rD   )r    r   Úunlinkr"   rF   )r&   Zexc_argsr   r   r   Ú__exit__‘   s    
zProcessLock.__exit__N)F)	Ú__name__Ú
__module__Ú__qualname__r'   r+   rC   rF   rM   rO   r   r   r   r   r   B   s   
*r   )Z
__future__r   r   Zdnf.exceptionsr   r   r   Zdnf.i18nr   Zdnf.yumr   Zdnf.loggingr	   Zdnf.utilr3   r1   r   Zloggingr   r#   rK   Z	getLoggerrI   r   r   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s(   
	