summaryrefslogtreecommitdiff
path: root/sysutils/bacula-server/files/chio-bacula
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/bacula-server/files/chio-bacula')
-rw-r--r--sysutils/bacula-server/files/chio-bacula138
1 files changed, 138 insertions, 0 deletions
diff --git a/sysutils/bacula-server/files/chio-bacula b/sysutils/bacula-server/files/chio-bacula
new file mode 100644
index 000000000000..dd6b9e8b88d8
--- /dev/null
+++ b/sysutils/bacula-server/files/chio-bacula
@@ -0,0 +1,138 @@
+#!/bin/sh
+#
+# Bacula interface to mtx autoloader
+# (By Lars Köller, lars+bacula@koellers.net)
+#
+# If you set in your Device resource
+#
+# Changer Command = "path-to-this-script/chio-bacula" %c %o %S %a
+# you will have the following input to this script:
+#
+# chio-bacula "changer-device" "command" "slot" "archive-device"
+#
+# for example:
+#
+# chio-bacula /dev/sg0 load 1 /dev/nst0 (on a FreeBSD system)
+#
+# If you need to to an offline, refer to the drive as $4
+# e.g. mt -f $f 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.
+#
+
+# This simulates a barcode reader in the changer.
+# The labes of the virtual barcode reader are located in the BARCODE_FILE
+SIMULATE_BARCODE=true
+BARCODE_FILE=/usr/local/etc/bacula-barcodes
+
+me=$(basename $0)
+
+# Debug
+echo "$me $@" > /dev/console
+
+if [ -z "$1" ] ; then
+ usage;
+fi
+
+if [ -z "$2" ] ; then
+ usage;
+fi
+
+MTX=/bin/chio
+CHANGER=$1
+COMMAND=$2
+if [ ! -z "$3" ]; then
+ SLOT=$3
+fi
+if [ ! -z "$4" ]; then
+ TAPE=$4
+else
+ TAPE=/dev/nrsa2
+fi
+
+# Time to wait for loading
+SLEEP=20
+# What drive of the autochanger should be used primary
+# At the moment bacula (1.31a) could not deal with more drives
+DRIVE=1
+
+usage()
+{
+ echo ""
+ echo "The $me script for bacula"
+ echo "--------------------------------------"
+ echo ""
+ echo "usage: $me <changer-device> <command> [slot] [devicename of tapedrive]"
+ echo ""
+ echo "Valid commands:"
+ echo ""
+ echo "unload Unloads a tape into the slot"
+ echo " from where it was loaded."
+ echo "load <slot> Loads a tape from the slot <slot>"
+ echo " (slot-base is calculated to 1 as first slot)"
+ echo "list Lists full storage slots"
+ echo "loaded Gives slot from where the tape was loaded."
+ echo " 0 means the tape drive is empty."
+ echo "slots Gives Number of aviable slots."
+ echo ""
+ echo "Example:"
+ echo " mtx-changer /dev/changer load 1 loads a tape from slot 1"
+ echo ""
+ exit 2
+}
+
+
+case ${COMMAND} in
+ unload)
+ # enable the following line if you need to eject the cartridge
+ #mt -f ${TAPE} off
+ #sleep 2
+ ${MTX} -f ${CHANGER} return drive ${DRIVE}
+ ;;
+
+ load)
+ ${MTX} -f ${CHANGER} move slot $((${SLOT}-1)) drive ${DRIVE}
+ rtn=$?
+ # Increase the sleep time if you have a slow device
+ sleep $SLEEP
+ exit $rtn
+ ;;
+
+ list)
+ if [ "${SIMULATE_BARCODE}" = "true" ]; then
+ if [ -f "$BARCODE_FILE" ]; then
+ cat $BARCODE_FILE | grep -v "^#"
+ exit 0
+ else
+ echo "Barcode file $BARCODE_FILE missing ... exiting!"
+ exit 1
+ fi
+ else
+ ${MTX} -f ${CHANGER} status | grep "^slot .*: .*FULL>" | awk '{print $2}' | awk -F: '{print $1+1" "}' | tr -d "[\r\n]"
+ fi
+ ;;
+
+ loaded)
+ # echo "Request loaded"
+ ${MTX} -f ${CHANGER} status -S > /tmp/mtx.$$
+ rtn=$?
+ cat /tmp/mtx.$$ | grep "^drive ${DRIVE}: <FULL>" | awk '{print $6+1}' | tr -d ">"
+ cat /tmp/mtx.$$ | grep "^drive ${DRIVE}: source: <>" | awk "{print 0}"
+ rm -f /tmp/mtx.$$
+ exit $rtn
+ ;;
+
+ slots)
+ # echo "Request slots"
+ ${MTX} -f ${CHANGER} status | grep "^slot " | tail -1 | awk '{print $2+1}' | tr -d ":"
+ ;;
+
+ *)
+ usage
+ ;;
+esac