/usr/share/doc/bacula-common/examples/autochangers/locking-mtx-changer is in bacula-common 7.0.5+dfsg-4build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #!/bin/ksh
#
# Bacula interface to mtx autoloader
#
# This script is not needed with Bacula version 1.38 or later
# since the Storage daemon automatically ensures that only one
# thread accesses the script at a time.
#
#
# $Id$
#
# If you set in your Device resource
#
# Changer Command = "path-to-this-script/mtx-changer %c %o %S %a %d
# you will have the following input to this script:
#
# mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index"
# $1 $2 $3 $4 $5
#
# for example:
#
# mtx-changer /dev/sg0 load 1 /dev/nst0 0 (on a Linux system)
#
# If you need to an offline, refer to the drive as $4
# e.g. mt -f $4 offline
#
# Many changers need an offline after the unload. Also many
# changers need a sleep 60 after the mtx load.
#
# N.B. If you change the script, take care to return either
# the mtx exit code or a 0. If the script exits with a non-zero
# exit code, Bacula will assume the request failed.
#
MTX=/lysator/bin/mtx
LOCKDIR=/tmp
TMPDIR=/tmp
make_temp_file()
{
TMPFILE=`mktemp ${TMPDIR}/mtx$1.XXXXXXXXXX 2> /dev/null`
if test $? -ne 0 || test x${TMPFILE} = x; then
TMPFILE="${TMPDIR}/mtx$1.$$"
if test -f ${TMPFILE}; then
echo "ERROR: Temp file security problem on: ${TMPFILE}"
exit 1
fi
fi
}
if test $# -lt 2 ; then
echo "usage: mtx-changer ctl-device command slot archive-device drive"
echo " Insufficient number of arguments arguments given."
echo " Mimimum usage is first two arguments ..."
exit 1
fi
# Setup arguments
ctl=$1
cmd="$2"
slot=$3
device=$4
# If drive not given, default to 0
if test $# = 5 ; then
drive=$5
else
drive=0
fi
wait_for_drive() {
while ! mt -f $1 status >/dev/null 2>/dev/null; do
# echo "Device $1 - not ready, retrying..."
sleep 5
done
}
LOCKFILE="${LOCKDIR}/mtx-changer:`echo $ctl | tr / _`"
changer_lock() {
make_temp_file lock
echo "$$" >${TMPFILE}
while ! ln -n ${TMPFILE} $LOCKFILE 2>/dev/null; do
echo "$0: changer lock busy, retrying in 30 seconds..."
sleep 30
done
rm ${TMPFILE}
}
changer_unlock() {
LOCKPID="`cat $LOCKFILE 2>/dev/null`"
if [ "$LOCKPID" != $$ ]; then
echo "$0: Invalid lock file (${LOCKFILE}) - not owned by us!"
exit 1
fi
rm -f $LOCKFILE
}
#
# Check for special cases where only 2 arguments are needed,
# all others are a minimum of 3
case $cmd in
loaded)
;;
unload)
;;
list)
;;
slots)
;;
*)
if test $# -lt 3; then
echo "usage: mtx-changer ctl-device command slot archive-device drive"
echo " Insufficient number of arguments arguments given."
echo " Mimimum usage is first three arguments ..."
exit 1
fi
;;
esac
changer_lock $ctl
case $cmd in
unload)
# echo "Doing mtx -f $ctl unload $slot $drive"
#
# enable the following line if you need to eject the cartridge
mt -f $device offline
if test x$slot = x; then
${MTX} -f $ctl unload
rtn=$?
else
${MTX} -f $ctl unload $slot $drive
rtn=$?
fi
;;
load)
# echo "Doing mtx -f $ctl load $slot $drive"
${MTX} -f $ctl load $slot $drive
rtn=$?
wait_for_drive $device
changer_unlock $ctl
exit $rtn
;;
list)
# echo "Requested list"
${MTX} -f $ctl status | tr ':=' ' ' | nawk '($1 == "Storage" && $2 == "Element" && $4 == "Full") { printf "%s:%s\n", $3, $6 }'
rtn=$?
;;
loaded)
make_temp_file
${MTX} -f $ctl status >${TMPFILE}
rtn=$?
cat ${TMPFILE} | grep "^Data Transfer Element $drive:Full" | awk "{print \$7}"
cat ${TMPFILE} | grep "^Data Transfer Element $drive:Empty" | awk "{print 0}"
rm -f ${TMPFILE}
changer_unlock $ctl
exit $rtn
;;
slots)
# echo "Request slots"
${MTX} -f $ctl status | grep " *Storage Changer" | awk "{print \$5}"
rtn=$?
;;
esac
changer_unlock $ctl
exit $rtn
|