source: trunk/conflock.in @ 449

Revision 449, 3.5 KB checked in by blee, 2 years ago (diff)

Ensure that lock files are world-readable, which removes the need for
conf_system_is_locked to use sudo.

See #80

  • Property svn:executable set to *
  • Property svn:keywords set to Id
Line 
1#!@BASH@
2#
3# Copyright (c) 2008, Christopher Cowart and contributors
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# * Redistributions of source code must retain the above copyright
10#   notice, this list of conditions and the following disclaimer.
11# * Redistributions in binary form must reproduce the above copyright
12#   notice, this list of conditions and the following disclaimer in the
13#   documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26#
27# $Id$
28
29# The locking mechanisms had to be factored out into a separate script so
30# they could be sudo'd as necessary.
31
32# Atomically checks and obtains the specified lock file or returns non-zero
33function lock {
34    local pid="$1"
35    local lockfile="$2"
36    local count=0
37
38    if [ -z "$lockfile" ] ; then
39        echo "No lock file specified in conflock" >&2; exit 2;
40    fi
41
42    if ! [ -d `dirname "$lockfile"` ] ; then
43        echo "Lock file directory does not exist" >&2; exit 2;
44    fi
45
46    if [ -f "$lockfile" ] && [ "x`cat $lockfile`" = "x$pid" ] ; then
47        return 0
48    fi
49
50    # Ensure that the lock is world-readable
51    umask 022
52
53    # This is a race-free bourne lock.
54    until ( set -o noclobber; echo "$pid" > "$lockfile"; ) 2>/dev/null ; do
55        if ps `cat $lockfile` >/dev/null 2>&1 ; then
56
57            if [ "${count}" -eq 10 ] ; then
58                echo "Giving up..." >&2
59                return 1
60            fi
61
62            echo "waiting for lock on ${lockfile}..." >&2
63            sleep 1
64            count=$((${count} + 1))
65        else
66            echo "Removing lockfile for dead process" \
67                "`cat $lockfile`: $lockfile" >&2
68            rm -f "$lockfile"
69        fi
70    done
71    return 0
72}
73
74# Immediately deletes the lock file
75function unlock {
76    local pid="$1"
77    local lockfile="$2"
78
79    if [ -z "$lockfile" ] ; then
80        echo "No lock file specified in conflock" >&2; exit 2;
81    fi
82
83    if ! [ -f "$lockfile" ] ; then
84        echo "Cannot unlock: not locked." >&2
85        exit 2
86    fi
87
88    if [ "x`cat $lockfile`" = "x$pid" ] ; then
89        rm -f "$lockfile"
90    else
91        echo "Cannot unlock: PID does not match." >&2
92        exit 2
93    fi
94}
95
96function haslock {
97    local pid="$1"
98    local lockfile="$2"
99
100    if [ -z "$lockfile" ] ; then
101        echo "No lock file specified in conflock" >&2; exit 2;
102    fi
103
104    if [ -f "$lockfile" ] && [ "x`cat $lockfile`" = "x$pid" ] ; then
105        return 0
106    else
107        return 1
108    fi
109}
110
111action="$1"
112shift
113
114case "$action" in
115    lock)       lock "$@";;
116    unlock)     unlock "$@";;
117    haslock)    haslock "$@";;
118    *)      echo "Unknown argument to conflock: $1" >&2; exit 2;;
119esac
120
121exit $?
122
Note: See TracBrowser for help on using the repository browser.