3 0Q=j. @ s d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dlZG dd de Z G dd dZdd Ze d kreje p~d dS ) N)EWOULDBLOCKEEXIST)bstrc @ s e Zd ZdZdS )LockfileLockedExceptionz$thrown ONLY when pid file is locked.N)__name__ __module____qualname____doc__ r r !/usr/lib/python3.6/rhnLockfile.pyr s r c @ s* e Zd ZdZd ddZdd Zdd ZdS ) 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. Nc C s" t jjt jjt jj|| _|| _| js4t j | _t jj| j}t jj |syt j | W n8 tk r tj d }t|dr|jtkrn Y nX t j| jt jt jB t jB t jB t jB d| _t j| j}tj|j s|jt j krt j| j td| jt j |j|jf | j dS )zlcreate (if need be), and acquire lock on lockfile lockfile example: '/var/run/up2date.pid' errnoi zSrefusing to use lockfile %s: not a regular file owned by uid %d (mode 0o%o, uid %d)N) ospathabspath expanduser expandvarslockfilepidgetpiddirnameexistsmakedirsOSErrorsysexc_infohasattrr r openO_RDWRO_CREATO_SYNC O_NOFOLLOW O_CLOEXECffstatstatS_ISREGst_modest_uidgeteuidcloseacquire)selfr r r estr r r __init__% s0 $ zLockfile.__init__c C s yt j| jt jt jB W nD tk r^ tj d jt krXt d| j dtj d n Y nX t j | jt jd t j| jd t j| jtt| jd dS )z5acquire the lock; else raise LockfileLockedException.r zcannot acquire lock on %s.N r )fcntlflockr$ ZLOCK_EXZLOCK_NBIOErrorr r r r r r ZF_SETFDr ftruncatewriter strr )r- r r r r, ^ s zLockfile.acquirec C s~ y4t j| j}t j| j}|j|jko0|j|jk}W n tk rL d}Y nX |r^t j| j t j | jt j t j| j d S )NF) r r% r$ lstatr st_devst_inor unlinkr3 r4 ZLOCK_UNr+ )r- Zfd_stZpath_stZ same_inoder r r releaseo s zLockfile.release)N)r r r r r0 r, r= r r r r r s 9r c C sz yt d} W n6 tk rB tjjdtj d tjd Y n4X td td ddl}|j d | j td dS )z test codez ./test.pidz%s r zlock acquired z...sleeping for 10 secondsr N zlock released )r r r stderrr7 r exitprinttimeZsleepr= )LrC r r r main s rE __main__)r r r&