a ©!cÊã@sÒddlmZddlmZddlmZmZmZddlmZddl m Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZe d¡Zdd „Zd d „Zd d „Zdd„Zdd„ZGdd„deƒZdS)é)Úabsolute_import)Úunicode_literals)ÚProcessLockErrorÚThreadLockErrorÚ LockError)Ú_)ÚmiscNÚdnfcCs6tj ¡s2t | d¡¡ ¡}tj  t   ¡d|¡}|S)Núutf-8Úlocks) r ÚutilZ am_i_rootÚhashlibZsha1ÚencodeZ hexdigestÚosÚpathÚjoinrZ getCacheDir)Zdir_Zhexdir©rú,/usr/lib/python3.9/site-packages/dnf/lock.pyÚ _fit_lock_dir&s rcCsttj t|ƒd¡d| ƒS)Nzdownload_lock.pidÚcachedir©Ú ProcessLockrrrr©rÚ exit_on_lockrrrÚbuild_download_lock/sÿrcCsttj t|ƒd¡d| ƒS)Nzmetadata_lock.pidÚmetadatarrrrrÚbuild_metadata_lock3sÿrcCsttj t|ƒd¡d| ƒS)Nzrpmdb_lock.pidZRPMDBr)Z persistdirrrrrÚbuild_rpmdb_lock8sÿrcCsttj t|ƒd¡d| ƒS)Nz log_lock.pidÚlogr)ZlogdirrrrrÚbuild_log_lock=sÿrc@s>eZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „ZdS)rFcCs&||_d|_||_||_t ¡|_dS)Nr)ÚblockingÚcountÚ descriptionÚtargetÚ threadingÚRLockÚ thread_lock)Úselfr#r"r rrrÚ__init__Cs zProcessLock.__init__cCs2|jjdds d|j}t|ƒ‚|jd7_dS)NF)r z'%s already locked by a different threadé)r&Úacquirer"rr!)r'ÚmsgrrrÚ _lock_threadJs zProcessLock._lock_threadc Cs†t |jtjtjBd¡}zZzt |tjtjB¡WnLt y€}z4|j t j krjWYd}~Wt  |¡dS‚WYd}~n d}~00t  |d¡}t|ƒdkrÀt |t|ƒ d¡¡|Wt  |¡Sz t|ƒ}Wn(tyôtdƒ|j}t|ƒ‚Yn0||kr|Wt  |¡St d|tj¡sft |dtj¡t |d¡t |t|ƒ d¡¡|Wt  |¡S|Wt  |¡St  |¡0dS)Ni¤éÿÿÿÿérr 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ÚfcntlZflockZLOCK_EXZLOCK_NBÚOSErrorÚerrnoZ EWOULDBLOCKÚcloseÚreadÚlenÚwriteÚstrrÚintÚ ValueErrorrrÚaccessÚF_OKÚlseekÚSEEK_SETÚ ftruncate)r'ÚpidÚfdÚeZold_pidr+rrrÚ _try_lockPsL  à   ç  ý  ô  û ýzProcessLock._try_lockcCs|jd8_|j ¡dS©Nr))r!r&Úrelease)r'rrrÚ_unlock_threadzszProcessLock._unlock_threadcCs¦tj tj |j¡¡| ¡d}t ¡}|  |¡}||kr¢|dkrŒ|j sj|  ¡d|j |f}t ||ƒ‚||krŒtdƒ|}t |¡|}t d¡|  |¡}q4dS)Nr-z%s already locked by %dz*Waiting for process with pid %d to finish.r))r r Z ensure_dirrrÚdirnamer#r,ÚgetpidrDr rGr"rrÚloggerÚinfoÚtimeÚsleep)r'Zprev_pidZmy_pidrAr+rrrÚ __enter__~s"     zProcessLock.__enter__cGs"|jdkrt |j¡| ¡dSrE)r!rÚunlinkr#rG)r'Zexc_argsrrrÚ__exit__‘s  zProcessLock.__exit__N)F) Ú__name__Ú __module__Ú __qualname__r(r,rDrGrNrPrrrrrBs  *r)Z __future__rrZdnf.exceptionsrrrZdnf.i18nrZdnf.yumrZ dnf.loggingr Zdnf.utilr4r2r Zloggingrr$rLZ getLoggerrJrrrrrÚobjectrrrrrÚs(