X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fscripts%2Fmtx-changer.in;h=fe23051edf93bb8b2584f5fe4194a3af72d00cde;hb=b2bcd97a63f21e04dafb66819ac41021f2361695;hp=152bda5979b387e53ba8799cfcba5daa4ad9fe1c;hpb=2d6309754e7a3ef719e8e950d5677f29ff53d1e5;p=bacula%2Fbacula diff --git a/bacula/scripts/mtx-changer.in b/bacula/scripts/mtx-changer.in index 152bda5979..fe23051edf 100644 --- a/bacula/scripts/mtx-changer.in +++ b/bacula/scripts/mtx-changer.in @@ -2,8 +2,6 @@ # # Bacula interface to mtx autoloader # -# $Id$ -# # If you set in your Device resource # # Changer Command = "path-to-this-script/mtx-changer %c %o %S %a %d" @@ -23,6 +21,20 @@ # the SCSI control channel is /dev/sg0, and the read/write device # is /dev/nst0. # +# The commands are: +# Command Function +# unload unload a given slot +# load load a given slot +# loaded which slot is loaded? +# list list Volume names (requires barcode reader) +# slots how many slots total? +# listall list all info +# transfer +# +# Slots are numbered from 1 ... +# Drives are numbered from 0 ... +# +# # If you need to an offline, refer to the drive as $4 # e.g. mt -f $4 offline # @@ -34,14 +46,20 @@ # exit code, Bacula will assume the request failed. # +# source our conf file +if test ! -f @scriptdir@/mtx-changer.conf ; then + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "ERROR: @scriptdir@/mtx-changer.conf file not found!!!!" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + exit 1 +fi +. @scriptdir@/mtx-changer.conf + MTX=@MTX@ -# -# log whats done -# -# to turn on logging, uncomment the following line -#touch @working_dir@/mtx.log -# +if test ${debug_log} -ne 0 ; then + touch @working_dir@/mtx.log +fi dbgfile="@working_dir@/mtx.log" debug() { if test -f $dbgfile; then @@ -54,16 +72,39 @@ debug() { # Create a temporary file # make_temp_file() { - TMPFILE=`mktemp -t mtx.XXXXXXXXXX` + TMPFILE=`mktemp @working_dir@/mtx.XXXXXXXXXX` if test x${TMPFILE} = x; then TMPFILE="@working_dir@/mtx.$$" if test -f ${TMPFILE}; then - echo "Temp file security problem on: ${TMPFILE}" + echo "ERROR: Temp file security problem on: ${TMPFILE}" exit 1 fi fi } +# +# Create a temporary file for stderr +# +# Note, this file is used because sometime mtx emits +# unexpected error messages followed by the output +# expected during success. +# So we separate STDOUT and STDERR in +# certain of the mtx commands. The contents of STDERR +# is then printed after the STDOUT produced by mtx +# thus we sometimes get better changer results. +# +make_err_file() { + ERRFILE=`mktemp @working_dir@/mtx.err.XXXXXXXXXX` + if test x${ERRFILE} = x; then + ERRFILE="@working_dir@/mtx.err.$$" + if test -f ${ERRFILE}; then + echo "ERROR: Temp file security problem on: ${ERRFILE}" + exit 1 + fi + fi +} + + # # The purpose of this function to wait a maximum # time for the drive. It will @@ -72,11 +113,13 @@ make_temp_file() { # Note, this is very system dependent, so if you are # not running on Linux, you will probably need to # re-write it, or at least change the grep target. +# We've attempted to get the appropriate OS grep targets +# in the code at the top of this script. # wait_for_drive() { i=0 while [ $i -le 300 ]; do # Wait max 300 seconds - if mt -f $1 status | grep ONLINE >/dev/null 2>&1; then + if mt -f $1 status 2>&1 | grep "${ready}" >/dev/null 2>&1; then break fi debug "Device $1 - not ready, retrying..." @@ -91,8 +134,8 @@ check_parm_count() { pCount=$1 pCountNeed=$2 if test $pCount -lt $pCountNeed; then - echo "usage: mtx-changer ctl-device command [slot archive-device drive-index]" - echo " Insufficient number of arguments arguments given." + echo "ERROR: usage: mtx-changer ctl-device command [slot archive-device drive-index]" + echo " Insufficient number of arguments given." if test $pCount -lt 2; then echo " Mimimum usage is first two arguments ..." else @@ -106,12 +149,15 @@ check_parm_count() { # all others are a minimum of 5 # case $2 in - list) + list|listall) check_parm_count $# 2 ;; slots) check_parm_count $# 2 ;; + transfer) + check_parm_count $# 4 + ;; *) check_parm_count $# 5 ;; @@ -130,39 +176,98 @@ debug "Parms: $ctl $cmd $slot $device $drive" case $cmd in unload) debug "Doing mtx -f $ctl unload $slot $drive" -# -# enable the following line if you need to eject the cartridge -# mt -f $device offline -# sleep 10 - ${MTX} -f $ctl unload $slot $drive + + if test ${offline} -eq 1 ; then + mt -f $device offline + fi + if test ${offline_sleep} -ne 0 ; then + sleep ${offline_sleep} + fi + make_err_file + ${MTX} -f $ctl unload $slot $drive 2>${ERRFILE} + rtn=$? + cat ${ERRFILE} + rm -f ${ERRFILE} >/dev/null 2>&1 + exit $rtn ;; load) debug "Doing mtx -f $ctl load $slot $drive" - ${MTX} -f $ctl load $slot $drive + make_err_file + ${MTX} -f $ctl load $slot $drive 2>${ERRFILE} rtn=$? -# -# Increase the sleep time if you have a slow device -# or remove the sleep and add the following: -# wait_for_drive $device - sleep 15 + if test ${load_sleep} -ne 0 ; then + sleep ${load_sleep} + fi + wait_for_drive $device + cat ${ERRFILE} + rm -f ${ERRFILE} >/dev/null 2>&1 exit $rtn ;; list) debug "Doing mtx -f $ctl -- to list volumes" make_temp_file -# Enable the following if you are using barcodes and need an inventory -# $(MTX) -f $ctl inventory + if test ${inventory} -ne 0 ; then + ${MTX} -f $ctl inventory + fi ${MTX} -f $ctl status >${TMPFILE} rtn=$? - cat ${TMPFILE} | grep " *Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//" + if test ${vxa_packetloader} -ne 0 ; then + cat ${TMPFILE} | grep " *Storage Element [0-9]*:.*Full" | sed "s/ Storage Element //" | sed "s/Full :VolumeTag=//" + else + cat ${TMPFILE} | grep " Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//" + fi cat ${TMPFILE} | grep "^Data Transfer Element [0-9]*:Full (Storage Element [0-9]" | awk '{printf "%s:%s\n",$7,$10}' rm -f ${TMPFILE} >/dev/null 2>&1 -# -# If you have a VXA PacketLoader and the above does not work, try -# turning it off and enabling the following line. -# ${MTX} -f $ctl status | grep " *Storage Element [0-9]*:.*Full" | sed "s/*Storage Element //" | sed "s/Full :VolumeTag=//" + exit $rtn + ;; + + listall) +# Drive content: D:Drive num:F:Slot loaded:Volume Name +# D:0:F:2:vol2 or D:Drive num:E +# D:1:F:42:vol42 +# D:3:E +# +# Slot content: +# S:1:F:vol1 S:Slot num:F:Volume Name +# S:2:E or S:Slot num:E +# S:3:F:vol4 +# +# Import/Export tray slots: +# I:10:F:vol10 I:Slot num:F:Volume Name +# I:11:E or I:Slot num:E +# I:12:F:vol40 + + debug "Doing mtx -f $ctl -- to list all" + make_temp_file + if test ${inventory} -ne 0 ; then + ${MTX} -f $ctl inventory + fi + ${MTX} -f $ctl status >${TMPFILE} + rtn=$? + # can be converted to awk+sed+cut, see below + perl -ne ' +/Data Transfer Element (\d+):Empty/ && print "D:$1:E\n"; +/Data Transfer Element (\d+):Full \(Storage Element (\d+) Loaded\)(:VolumeTag =\s*(.+))?/ && print "D:$1:F:$2:$4\n"; +/Storage Element (\d+):Empty/ && print "S:$1:E\n"; +/Storage Element (\d+):Full( :VolumeTag=(.+))?/ && print "S:$1:F:$3\n"; +/Storage Element (\d+) IMPORT.EXPORT:Empty/ && print "I:$1:E\n"; +/Storage Element (\d+) IMPORT.EXPORT:Full( :VolumeTag=(.+))?/ && print "I:$1:F:$3\n";' ${TMPFILE} + # If perl isn't installed, you can use by those commands +#cat ${TMPFILE} | grep "Data Transfer Element" | awk "{print \"D:\"\$4 \$7 \$9 \$10}" | sed "s/=/:/" | sed "s/Full/F:/" | sed "s/Empty/E/" +#cat ${TMPFILE} | grep -v "Data Transfer Element" | grep "Storage Element" | grep -v "IMPORT/EXPORT" | awk "{print \"S:\"\$3 \$4 \$5}" | sed "s/IMPORT\/EXPORT//" | sed "s/Full *:VolumeTag=/F:/" | sed "s/Empty/E/" +#cat ${TMPFILE} | grep -v "Data Transfer Element" | grep "Storage Element" | grep "IMPORT/EXPORT" | awk "{print \"I:\"\$3 \$4 \$5}" | sed "s/IMPORT\/EXPORT//" | sed "s/Full *:VolumeTag=/F:/" | sed "s/Empty/E/" + + rm -f ${TMPFILE} >/dev/null 2>&1 + exit $rtn + ;; + + transfer) + slotdest=$device + debug "Doing transfer from $slot to $slotdest" + ${MTX} -f $ctl transfer $slot $slotdest + rtn=$? exit $rtn ;;