#!/bin/sh
#
# Bacula interface to autoloader
#
# By Pascal Pederiva <freebsd@paped.com>
#
# Known to work on FreeBSD 5.2 with a TZ875 changer.
#
# This script mimics mtx-changer with the following differences
# - it automatically stows the cartridge to the slot it came from when
# unloading.
# - a load will automatically unload the drive if there is a
# different cartridge loaded.
# - it uses chio instead of mtx (which is
# available as a package)
#
# If you set in your Device resource
#
# Changer Command = "path-to-this-script/chio-changer %c %o %S %a"
# you will have the following input to this script:
#
# chio-changer "changer-device" "command" "slot" "archive-device"
#
# for example:
#
# chio-changer /dev/sg0 load 1 /dev/nst0 (on a Linux system)
#
# If you need to 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 chio load.
#
# N.B. If you change the script, take care to return either
# the chio exit code or a 0. If the script exits with a non-zero
# exit code, Bacula will assume the request failed.
#
# Examples:
# chio-changer load 1 ; load slot 1 into drive 0 (and unload old cartridge if necessary)
# chio-changer unload N ; unload drive into source slot (slot number is ignored)
# chio-changer loaded N ; Return loaded slot #
# chio-changer /dev/ch0 loaded N /dev/nsa0 ; has the same effect
#echo `date` "chio: $*" >>/tmp/changer
# If the first parameter is not a device, assume it is a command
# and you want to use the default changer
if [ -c $1 ]; then
CHANGER=$1
shift
else
CHANGER=/dev/ch0
fi
COMMAND=$1
ELEMENT=$2
DRIVE=$3
MTX=chio
##############################################################################
case "$COMMAND" in
unload)
# enable the following line if you need to eject the cartridge
# mt -f $DRIVE offline
SOURCE=`${MTX} status -S | grep drive | grep FULL | cut -d: -f 3 | tr -d '<>a-z '`
if [ ! -z "$SOURCE" ]; then
echo -n "Unloading Data Transfer Element into Storage Element $ELEMENT..."
${MTX} -f $CHANGER move drive 0 slot $SOURCE
rtn=$?
echo "done"
else
echo "Storage Element $ELEMENT is Already Full"
fi
exit $rtn
;;
load)
if [ -z "$ELEMENT" ]; then
echo "ERROR: load <element> reguired"
return 1
fi
TARGET=$ELEMENT
if [ $TARGET -le 0 ]; then
TARGET=1
fi
TARGET=`expr $TARGET - 1`
SOURCE=`${MTX} status -S | grep drive | grep FULL | cut -d: -f 3 | tr -d '<>a-z '`
if [ ! -z "$SOURCE" ]; then
if [ "$SOURCE" != "$TARGET" ]; then
# Only unload if there is something different in the drive
${MTX} -f $CHANGER move drive 0 slot $SOURCE
fi
fi
if [ "$SOURCE" != "$TARGET" ]; then
${MTX} -f $CHANGER move slot $TARGET drive 0
rtn=$?
fi
exit $rtn
;;
list)
${MTX} -f $CHANGER status slot | grep "FULL" | awk '{print $2+1":"}'
;;
loaded)
SOURCE=`${MTX} status -S | grep drive | grep FULL | cut -d: -f 3 | tr -d '<>a-z '`
rtn=$?
if [ -z "$SOURCE" ]; then
SOURCE=-1
fi
echo `expr 1 + ${SOURCE}`
exit $rtn
;;
slots)
${MTX} -f $CHANGER status slot | wc -l
;;
esac
syntax highlighted by Code2HTML, v. 0.9.1