3 0Q=j.@sddlZddlZddlZddlZddlmZmZddlmZddlZGddde Z GdddZ dd Z e d kreje p~ddS) N) EWOULDBLOCKEEXIST)bstrc@seZdZdZdS)LockfileLockedExceptionz$thrown ONLY when pid file is locked.N)__name__ __module__ __qualname____doc__r r !/usr/lib/python3.6/rhnLockfile.pyrsrc@s*eZdZdZd ddZddZddZdS) Lockfilezclass that provides simple access to a PID-style lockfile. methods: __init__(lockfile), acquire(), and release() NOTE: currently acquires upon init The *.pid file will be acquired, or an LockfileLockedException is raised. NcCs"tjjtjjtjj||_||_|js4tj|_tjj|j}tjj |sytj |Wn8t k rt j d}t|dr|jtkrnYnXtj|jtjtjBtjBtjBtjBd|_tj|j}tj|j s|jtjkrtj|jt d|jtj|j|jf|jdS)zlcreate (if need be), and acquire lock on lockfile lockfile example: '/var/run/up2date.pid' errnoizSrefusing to use lockfile %s: not a regular file owned by uid %d (mode 0o%o, uid %d)N) ospathabspath expanduser expandvarslockfilepidgetpiddirnameexistsmakedirsOSErrorsysexc_infohasattrrropenO_RDWRO_CREATO_SYNC O_NOFOLLOW O_CLOEXECffstatstatS_ISREGst_modest_uidgeteuidcloseacquire)selfrrrestr r r __init__%s0    $  zLockfile.__init__c Csytj|jtjtjBWnDtk r^tjdjt krXt d|j dtjdnYnXtj|jtj dt j|jdt j|jtt|jddS)z5acquire the lock; else raise LockfileLockedException.r zcannot acquire lock on %s.Nr )fcntlflockr$ZLOCK_EXZLOCK_NBIOErrorrrrrrrZF_SETFDr ftruncatewriterstrr)r-r r r r,^szLockfile.acquirec Cs~y4tj|j}tj|j}|j|jko0|j|jk}Wntk rLd}YnX|r^tj|jt j |jt j tj |jdS)NF) rr%r$lstatrst_devst_inorunlinkr3r4ZLOCK_UNr+)r-Zfd_stZpath_stZ same_inoder r r releaseos     zLockfile.release)N)rrrr r0r,r=r r r r r s 9r c Cszy td}Wn6tk rBtjjdtjdtjd Yn4Xtdtdddl}|j d|j td dS) z test codez ./test.pidz%s r zlock acquired z...sleeping for 10 secondsrN zlock released ) r rrstderrr7rexitprinttimeZsleepr=)LrCr r r mains  rE__main__)rrr&r3rrrZrhn.i18nr Exceptionrr rErrAr r r r s h