1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#! /usr/bin/python
# Copyright (C) 2013, 2016 Canonical Ltd.
# Author: Colin Watson <cjwatson@ubuntu.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""PID files containing multiple PIDs.
This implements two operations, namely test-add (test non-empty, add PID,
return state of test) and remove-test (remove PID, test non-empty, return
state of test), which are sufficient for use as a shared lock which only
opens when all users have unlocked. Dead processes are automatically
ignored and removed. It is an error to call test-add with a PID that is
already in the file, or remove-test with a PID that is not already in the
file.
The state is returned on stdout; a non-zero exit status indicates an error.
"""
from __future__ import print_function
from optparse import OptionParser
import os
import sys
sys.path.insert(0, os.path.join(sys.path[0], os.pardir, "lib"))
def main():
from cdimage.multipidfile import MultiPIDFile, MultiPIDFileError
parser = OptionParser("%prog FILE test-add|remove-test PID")
_, args = parser.parse_args()
if len(args) < 1:
parser.error("need file name")
if len(args) < 2:
parser.error("need operation")
if len(args) < 3:
parser.error("need PID")
path, mode, pid = args[:3]
multipidfile = MultiPIDFile(path)
try:
if mode == "test-add":
for pid in sorted(multipidfile.test_add(int(pid))):
print(pid)
elif mode == "remove-test":
for pid in sorted(multipidfile.remove_test(int(pid))):
print(pid)
else:
parser.error("unknown multipidfile operation '%s'" % mode)
except MultiPIDFileError as e:
print(e, file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
|