This file is indexed.

/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