3 ©ft`Êã@sÒddlmZddlmZddlmZmZmZddlmZddl m Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZejdƒZdd „Zd d „Zd d „Zdd„Zdd„ZGdd„deƒZdS)é)Úabsolute_import)Úunicode_literals)ÚProcessLockErrorÚThreadLockErrorÚ LockError)Ú_)ÚmiscNÚdnfcCs6tjjƒs2tj|jdƒƒjƒ}tjj t j ƒd|ƒ}|S)Nzutf-8Zlocks) r ÚutilZ am_i_rootÚhashlibZsha1ÚencodeZ hexdigestÚosÚpathÚjoinrZ getCacheDir)Zdir_Zhexdir©rú/usr/lib/python3.6/lock.pyÚ _fit_lock_dir&s rcCsttjjt|ƒdƒd| ƒS)Nzdownload_lock.pidÚcachedir)Ú ProcessLockr rrr)rÚ exit_on_lockrrrÚbuild_download_lock/srcCsttjjt|ƒdƒd| ƒS)Nzmetadata_lock.pidZmetadata)rr rrr)rrrrrÚbuild_metadata_lock3srcCsttjjt|ƒdƒd| ƒS)Nzrpmdb_lock.pidZRPMDB)rr rrr)Z persistdirrrrrÚbuild_rpmdb_lock8srcCsttjjt|ƒdƒd| ƒS)Nz log_lock.pidÚlog)rr rrr)ZlogdirrrrrÚbuild_log_lock=src@s>eZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „ZdS)rFcCs&||_d|_||_||_tjƒ|_dS)Nr)ÚblockingÚcountÚ descriptionÚtargetÚ threadingÚRLockÚ thread_lock)ÚselfrrrrrrÚ__init__Cs zProcessLock.__init__cCs2|jjdd�s d|j}t|ƒ‚|jd7_dS)NF)rz'%s already locked by a different threadé)r!Úacquirerrr)r"ÚmsgrrrÚ _lock_threadJs zProcessLock._lock_threadc Cs>tj|jtjtjBdƒ}�zytj|tjtjBƒWn4t k rh}z|j t j krVdS‚WYdd}~XnXtj |dƒ}t |ƒdkrœtj|t|ƒjdƒƒ|Sy t|ƒ}Wn*tk rÒtdƒ|j}t|ƒ‚YnX||krà|Stjd|tjƒ�s*tj|dtjƒtj|dƒtj|t|ƒjdƒƒ|S|Stj|ƒXdS) Ni¤r$érzutf-8z–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ÚfcntlZflockZLOCK_EXZLOCK_NBÚOSErrorÚerrnoZ EWOULDBLOCKÚreadÚlenÚwriteÚstrr ÚintÚ ValueErrorrrÚaccessÚF_OKÚlseekÚSEEK_SETÚ ftruncateÚclose)r"ÚpidÚfdÚeZold_pidr&rrrÚ _try_lockPs6     zProcessLock._try_lockcCs|jd8_|jjƒdS)Nr$)rr!Úrelease)r"rrrÚ_unlock_threadzszProcessLock._unlock_threadcCsªtjjtjj|jƒƒ|jƒd}tjƒ}|j |ƒ}xp||kr¤|dkrŽ|j sl|j ƒd|j |f}t ||ƒ‚||krŽtdƒ|}tj|ƒ|}tjdƒ|j |ƒ}q6WdS)Nr$z%s already locked by %dz*Waiting for process with pid %d to finish.r)r))r r Z ensure_dirr rÚdirnamerr'Úgetpidr?rrArrrÚloggerÚinfoÚtimeZsleep)r"Zprev_pidZmy_pidr<r&rrrÚ __enter__~s"      zProcessLock.__enter__cGs"|jdkrtj|jƒ|jƒdS)Nr$)rr ÚunlinkrrA)r"Zexc_argsrrrÚ__exit__‘s  zProcessLock.__exit__N)F) Ú__name__Ú __module__Ú __qualname__r#r'r?rArGrIrrrrrBs  *r)Z __future__rrZdnf.exceptionsrrrZdnf.i18nrZdnf.yumrZ dnf.loggingr Zdnf.utilr/r-r Zloggingr rrFZ getLoggerrDrrrrrÚobjectrrrrrÚs(