]> git.sur5r.net Git - bacula/bacula/commitdiff
Add new chio-changer-freebase from bug #2115
authorKern Sibbald <kern@sibbald.com>
Sun, 27 Dec 2015 12:51:45 +0000 (13:51 +0100)
committerKern Sibbald <kern@sibbald.com>
Sun, 27 Dec 2015 12:51:45 +0000 (13:51 +0100)
bacula/examples/autochangers/chio-changer-freebsd [new file with mode: 0755]
bacula/examples/autochangers/rc-chio-changer [deleted file]

diff --git a/bacula/examples/autochangers/chio-changer-freebsd b/bacula/examples/autochangers/chio-changer-freebsd
new file mode 100755 (executable)
index 0000000..b9cec93
--- /dev/null
@@ -0,0 +1,194 @@
+#!/bin/sh
+#
+# Copyright (C) 2015 Rudolf Cejka
+# License: BSD 2-Clause; see file LICENSE-FOSS
+#
+# Bacula interface to tape libraries and autoloaders for FreeBSD
+# (by Rudolf Cejka <cejkar@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, Bacula
+# will assume the request failed.
+#
+
+PROGNAME=`basename $0`
+
+# Uncomment the following line, if you want to log debug output.
+#DEBUG=/var/run/bacula/${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/bacula-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
diff --git a/bacula/examples/autochangers/rc-chio-changer b/bacula/examples/autochangers/rc-chio-changer
deleted file mode 100644 (file)
index 7007842..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-#!/bin/sh
-#
-# Bacula interface to chio autoloader
-# (by Rudolf Cejka <cejkar@fit.vutbr.cz>)
-#
-# $Id$
-#
-# 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, Bacula
-# will assume the request failed.
-#
-
-# Uncomment the following line, if you need to eject a tape before moving
-# it from the drive.
-#OFFLINE=yes
-
-# Uncomment the following line, if you need to wait for some time
-# (in seconds) after (un)loading a tape.
-#SLEEP=10
-
-# Uncomment the following line, if you do not have a changer with volume
-# reader.
-#FAKE_BARCODES=/usr/local/etc/bacula-barcodes
-
-PROGNAME=`basename $0`
-
-usage()
-{
-  cat <<EOF
-Usage: ${PROGNAME} <changer-device> <cmd> [slot] [tape-device] [drive-index]
-
-Commands (<cmd>):
-  unload          Unloads a tape into the slot from where it was loaded.
-  load <slot>     Loads a tape from the slot <slot> (1-based).
-  list            Lists full storage slots.
-  loaded          Gives slot from where the tape was loaded (0 = empty drive).
-  slots           Gives number of available slots.
-
-Example:
-  ${PROGNAME} /dev/ch0 load 1        Loads a tape from first slot 1.
-
-EOF
-}
-
-# Default settings
-CHANGER=/dev/ch0
-TAPE=/dev/nsa0
-DRIVE=0
-
-CHIO=/bin/chio
-MT=/usr/bin/mt
-
-if [ $# -lt 2 ]; then
-  usage
-  exit 1
-fi
-
-if [ -n "$1" ]; then
-  CHANGER=$1;
-fi
-COMMAND=$2
-SLOT=$3
-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
-  fi
-  if [ -n "${SLEEP}" ]; then
-    sleep ${SLEEP}
-  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
-    # 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' | head -1`
-    if [ -n "${FREE}" ]; then
-      ${CHIO} -f ${CHANGER} move drive ${DRIVE} slot ${FREE}
-    else
-      exit 1
-    fi
-  fi
-  ;;
-load)
-  ${CHIO} -f ${CHANGER} move slot $((${SLOT} - 1)) drive ${DRIVE}
-  RET=$?
-  if [ -n "${SLEEP}" ]; then
-    sleep ${SLEEP}
-  fi
-  exit ${RET}
-  ;;
-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
-  ;;
-loaded)
-  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