summaryrefslogtreecommitdiff
path: root/sysutils/bareos17-server/files/chio-bareos
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/bareos17-server/files/chio-bareos')
-rw-r--r--sysutils/bareos17-server/files/chio-bareos190
1 files changed, 190 insertions, 0 deletions
diff --git a/sysutils/bareos17-server/files/chio-bareos b/sysutils/bareos17-server/files/chio-bareos
new file mode 100644
index 000000000000..f006ef78e6ce
--- /dev/null
+++ b/sysutils/bareos17-server/files/chio-bareos
@@ -0,0 +1,190 @@
+#!/bin/sh
+#
+# BAREOS interface to tape libraries and autoloaders for FreeBSD
+# (by Rudolf Cejka <cej...@fit.vutbr.cz>, v1.2, 2012/11/14)
+#
+# If you set in your Device resource
+# Changer Command = "path-to-this-script/chio-changer %c %o %S %a %d"
+# you will have the following input to this script:
+# chio-changer "changer-device" "command" "slot" "tape-device" "drive-index"
+# $1 $2 $3 $4 $5
+# for example (on a FreeBSD system):
+# chio-changer /dev/ch0 load 1 /dev/nsa0 0
+#
+# 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, BAREOS
+# will assume the request failed.
+#
+
+PROGNAME=`basename $0`
+
+# Uncomment the following line, if you want to log debug output.
+#DEBUG=/var/run/bareos/${PROGNAME}.log
+
+# Uncomment the following line, if you need to eject a tape before moving
+# it from the drive.
+#OFFLINE=yes
+
+# Uncomment one or more of the following lines, if you need to wait for
+# some time (in seconds) after unloading, loading or transferring a tape.
+#OFFLINE_SLEEP=10
+#LOAD_SLEEP=10
+#MOVE_SLEEP=10
+
+# Uncomment the following line, if you do not have a changer with volume
+# reader.
+#FAKE_BARCODES=/usr/local/etc/bareos-barcodes
+
+usage()
+{
+ cat <<EOF
+Usage: ${PROGNAME} <changer-device> <cmd> [slot] [tape-device] [drive-index]
+
+Commands (<cmd>):
+ unload Unload a tape into the slot from where it was loaded
+ load <slot> Load a tape from the slot <slot> (1-based)
+ transfer <slot> <slotdst> Transfer a tape from the slot <slot> to
+ the slot <slotdst> (1-based)
+ list List full storage slots
+ listall List all storage slots and drives with source information
+ loaded Give slot from where the tape was loaded (0 = empty drive)
+ slots Give number of available slots
+
+Example:
+ ${PROGNAME} /dev/ch0 load 1 Load a tape from the slot 1
+
+EOF
+ exit 1
+}
+
+# Default settings
+CHANGER=/dev/ch0
+TAPE=/dev/nsa0
+DRIVE=0
+
+CHIO=/bin/chio
+MT=/usr/bin/mt
+
+if [ -n "${DEBUG}" ]; then
+ MSG=$0
+ for PAR; do MSG="${MSG} \"${PAR}\""; done
+ echo `date +"%Y/%m/%d %H:%M:%S"` ${MSG} >> ${DEBUG}
+fi
+
+if [ -n "$1" ]; then
+ CHANGER=$1;
+fi
+COMMAND=$2
+SLOT=$3
+SLOTDST=$4
+if [ -n "$4" ]; then
+ TAPE=$4
+fi
+if [ -n "$5" ]; then
+ DRIVE=$5
+fi
+
+case ${COMMAND} in
+unload)
+ if [ "${OFFLINE}" = yes ]; then
+ ${MT} -f ${TAPE} offline
+ if [ $? = 0 -a -n "${OFFLINE_SLEEP}" ]; then
+ sleep ${OFFLINE_SLEEP}
+ fi
+ fi
+ if [ -z "${SLOT}" ]; then
+ ${CHIO} -f ${CHANGER} return drive ${DRIVE}
+ else
+ ${CHIO} -f ${CHANGER} move drive ${DRIVE} slot $((${SLOT} - 1))
+ fi
+ if [ $? -ne 0 ]; then
+ # In case of an error, try to unload the cartridge to the first free slot
+ FREE=`${CHIO} -f ${CHANGER} status slot | \
+ sed -ne '/FULL/d;s/^slot *\([0-9]*\):.*/\1/p' | \
+ awk 'BEGIN { n = 0 } { n = $1 + 1; exit } END { print n }'`
+ if [ ${FREE} -gt 0 ]; then
+ ${CHIO} -f ${CHANGER} move drive ${DRIVE} slot $((${FREE} - 1))
+ else
+ exit 1
+ fi
+ fi
+ ;;
+load)
+ if [ -z "${SLOT}" ]; then
+ usage
+ fi
+ ${CHIO} -f ${CHANGER} move slot $((${SLOT} - 1)) drive ${DRIVE}
+ if [ $? -ne 0 ]; then
+ exit 1
+ fi
+ if [ -n "${LOAD_SLEEP}" ]; then
+ sleep ${LOAD_SLEEP}
+ fi
+ ;;
+transfer)
+ if [ -z "${SLOT}" -o -z "${SLOTDST}" ]; then
+ usage
+ fi
+ ${CHIO} -f ${CHANGER} move slot $((${SLOT} - 1)) slot $((${SLOTDST} - 1))
+ if [ $? -ne 0 ]; then
+ exit 1
+ fi
+ if [ -n "${MOVE_SLEEP}" ]; then
+ sleep ${MOVE_SLEEP}
+ fi
+ ;;
+list)
+ if [ -z "${FAKE_BARCODES}" ]; then
+ ${CHIO} -f ${CHANGER} status -v slot | \
+ sed -ne 's/^slot *\([0-9]*\):.*FULL.*voltag.*<\([^:]*\):.*/\1:\2/p' | \
+ awk -F: '{ print $1 + 1 ":" $2 }'
+ else
+ if [ -f "${FAKE_BARCODES}" ]; then
+ grep -v -e "^#" -e "^$" < ${FAKE_BARCODES}
+ else
+ echo "${PROGNAME}: Barcode file ${FAKE_BARCODES} is missing"
+ exit 1
+ fi
+ fi
+ ;;
+listall)
+ if [ -z "${FAKE_BARCODES}" ]; then
+ ${CHIO} -f ${CHANGER} status -vS | \
+ sed -ne '
+ s/^slot *\([0-9]*\):.*ENAB.*FULL.*voltag.*<\([^:]*\):.*/I:\1:F:\2/p;t
+ s/^slot *\([0-9]*\):.*FULL.*voltag.*<\([^:]*\):.*/S:\1:F:\2/p;t
+ s/^drive *\([0-9]*\):.*FULL.*voltag.*<\([^:]*\):.*source.*<[^0-9]*\([0-9]*\)>.*/D:\1:F:\3:\2/p;t
+ s/^slot *\([0-9]*\):.*ENAB.*voltag.*<\([^:]*\):.*/I:\1:E/p;t
+ s/^slot *\([0-9]*\):.*voltag.*<\([^:]*\):.*/S:\1:E/p;t
+ s/^drive *\([0-9]*\):.*voltag.*<\([^:]*\):.*/D:\1:E/p' | \
+ awk -F: '{ for (n = 1; n <= NF; n++) printf "%s%s",
+ (n == ($1 == "D" ? 4 : 2)) ? ($n == "" ? 0 : $n + 1) : $n,
+ (n == NF) ? "\n" : ":" }'
+ else
+ if [ -f "${FAKE_BARCODES}" ]; then
+ grep -v -e "^#" -e "^$" < ${FAKE_BARCODES} | \
+ awk -F: '{ print "S:" $1 (match($2, "^ *$") ? ":E" : ":F:" $2) }'
+ else
+ echo "${PROGNAME}: Barcode file ${FAKE_BARCODES} is missing"
+ exit 1
+ fi
+ fi
+ ;;
+loaded)
+ # If a tape is loaded, but the source slot is unknown (for example,
+ # after library reboot), try to report the first free slot
+ FREE=`${CHIO} -f ${CHANGER} status slot | \
+ sed -ne '/FULL/d;s/^slot *\([0-9]*\):.*/\1/p' | \
+ awk 'BEGIN { n = 0 } { n = $1 + 1; exit } END { print n }'`
+ ${CHIO} -f ${CHANGER} status -S drive | \
+ sed -ne 's/^drive *'${DRIVE}':.*FULL.*source.*<[^0-9]*\([0-9]*\)>.*/\1/p' \
+ | awk 'BEGIN { n = 0 } { n = ($1 == "") ? '${FREE}' : $1 + 1 } \
+ END { print n }'
+ ;;
+slots)
+ ${CHIO} -f ${CHANGER} status | grep -c "^slot "
+ ;;
+*)
+ usage
+ ;;
+esac