-#! /bin/sh
+#! @SHELL@
#
# Amanda, The Advanced Maryland Automatic Network Disk Archiver
# Copyright (c) 1991-1999 University of Maryland at College Park
# |- ...
# |- slotn
# where 'slot_root_dir' is the tapedev 'file:xxx' parameter and 'n'
-# is the tapecycle parameter.
-#
+# is the LASTSLOT value of your changerfile config file. If LASTSLOT is
+# not defined, the value of the tapecycle parameter is used.
+#
# To use this driver, just put the line 'tpchanger "chg-disk"' in your
# amanda.conf.
#
-# Example of use:
+# Example of use (amanda.conf):
# --- cut here ---
# tapedev "file:/BACKUP2/slots/"
# rawtapedev "file:/BACKUP2/slots/"
# changerdev "/dev/null"
+# changerfile "chg-disk"
# tpchanger "chg-disk"
# changerfile "/usr/local/amanda/etc/changer"
# tapetype HARD-DISK
# }
# --- cut here ---
#
-# The number of slot is equal to your tapecyle.
+# Example changerfile (chg-disk.conf):
+# --- cut here ---
+# LASTSLOT=12
+# --- cut here ---
+#
+# The number of slot is equal to your LASTSLOT or tapecycle.
# You must create the slots and data directory.
#
MYNAME=$0
TAPE=`amgetconf$SUF tapedev`
+if test X"$TAPE" == X""; then
+ echo "<none> tapedev not specified in amanda.conf." 1>&2
+ exit 2
+fi
SLOTDIR=`echo $TAPE | sed 's/^file://'`
+isinteger() {
+ # should be exactly one arg
+ [ $# = 1 ] || return 1
+ # if arg is null, no expr needed
+ [ "${1}" = '' ] && return 1
+ # expr will return 0 on match
+ expr "$1" : '[0-9][0-9]*$' > /dev/null 2>&1
+}
+
+# Need rwx access to the virtual tape itself.
+if ! test -d $SLOTDIR; then
+ echo "Virtual-tape directory $SLOTDIR does not exist." 1>&2
+ exit 2
+fi
+if ! test -w $SLOTDIR; then
+ echo "Virtual-tape directory $SLOTDIR is not writable." 1>&2
+ exit 2
+fi
+
+
+# need rwx access to directory of changer file
CHANGERFILE=`amgetconf$SUF changerfile`
+conf_match=`expr "$CHANGERFILE" : .\*\.conf\$`
+if [ $conf_match -ge 6 ]; then
+ CONFIGFILE=$CHANGERFILE
+ CHANGERFILE=`echo $CHANGERFILE | sed 's/.conf$//g'`
+else
+ CONFIGFILE=$CHANGERFILE.conf
+fi
+
+CFDir=`dirname ${CHANGERFILE}`
+[ -d ${CFDir} -a -r ${CFDir} -a -w ${CFDir} -a -x ${CFDir} ] ||
+ { echo "$MYNAME: need 'rwx' access to '$CFDir'" 1>&2 ; exit 2 ; }
+
+# check or create changer metadata files
ACCESSFILE=$CHANGERFILE-access
+[ -f $ACCESSFILE -a -r $ACCESSFILE -a -w $ACCESSFILE ] ||
+ echo 0 > $ACCESSFILE ||
+ { echo "$MYNAME: could not access or create '$ACCESSFILE'" 1>&2 ; exit 2 ; }
CLEANFILE=$CHANGERFILE-clean
+[ -f $CLEANFILE -a -r $CLEANFILE -a -w $CLEANFILE ] ||
+ echo 0 > $CLEANFILE ||
+ { echo "$MYNAME: could not access or create '$CLEANFILE'" 1>&2 ; exit 2 ; }
SLOTFILE=$CHANGERFILE-slot
-[ ! -f $ACCESSFILE ] && echo 0 > $ACCESSFILE
-[ ! -f $CLEANFILE ] && echo 0 > $CLEANFILE
-[ ! -f $SLOTFILE ] && echo 0 > $SLOTFILE
+[ -f $SLOTFILE -a -r $SLOTFILE -a -w $SLOTFILE ] ||
+ echo 0 > $SLOTFILE ||
+ { echo "$MYNAME: could not access or create '$SLOTFILE'" 1>&2 ; exit 2 ; }
+
+# read and check metadata
ACCESSCOUNT=`cat $ACCESSFILE`
+isinteger $ACCESSCOUNT || { ACCESSCOUNT=0 ; echo 0 > $ACCESSFILE ; }
CLEANCOUNT=`cat $CLEANFILE`
+isinteger $CLEANCOUNT || { CLEANCOUNT=0 ; echo 0 > $CLEANFILE ; }
FIRSTSLOT=1
LASTSLOT=`amgetconf$SUF tapecycle`
+if test -r $CONFIGFILE; then
+ . $CONFIGFILE
+fi
CURSLOT=0
CLEANSLOT=$LASTSLOT
+NSLOT=`expr $LASTSLOT - $FIRSTSLOT + 1`
load() {
WHICHSLOT=$1;
+ # unload should have been called, but just in case ...
+ [ -h $SLOTDIR/data ] && unload
ln -s $SLOTDIR/slot$WHICHSLOT $SLOTDIR/data
echo $WHICHSLOT > $SLOTFILE
}
loadslot() {
WHICHSLOT=$1
- case $WHICHSLOT in
- [0-9]*) TYPE="digit";;
- *) TYPE="string";;
- esac
+ TYPE=string # default if not numeric
+ isinteger $WHICHSLOT && TYPE=digit
readstatus
NEWSLOT=0
if [ $WHICHSLOT -ge $FIRSTSLOT -a $WHICHSLOT -le $LASTSLOT ]; then
NEWSLOT=$WHICHSLOT
else
- echo "0 illegal request"
+ echo "$WHICHSLOT illegal slot"
exit 1
fi
elif [ $WHICHSLOT = "clean" ]; then
NEWSLOT=$CLEANSLOT
else
- echo "0 illegal request"
+ echo "$WHICHSLOT illegal request"
exit 1
fi
if [ $NEWSLOT = $CURSLOT ]; then
exit 0
fi
if [ $NEWSLOT = $CLEANSLOT ]; then
- expr $CLEANCOUNT + 1 > $CLEANFILE
+ expr ${CLEANCOUNT:=0} + 1 > $CLEANFILE
echo 0 > $ACCESSFILE
else
- expr $ACCESSCOUNT + 1 > $ACCESSFILE
+ expr ${ACCESSCOUNT:=0} + 1 > $ACCESSFILE
if [ $ACCESSCOUNT -gt $LASTSLOT ]; then
$MYNAME -slot clean >/dev/null
fi
info() {
readstatus
- echo "$CURSLOT $LASTSLOT $FIRSTSLOT"
+ echo "$CURSLOT $NSLOT 1"
exit 0
}