Imported Upstream version 2.5.1p3
[debian/amanda] / changer-src / chg-disk.sh.in
index 1f0b8518a441e26397da098d5fae1e590efab0f8..c4f59f700ddf86df8b17f3bdb21c956f203aac42 100644 (file)
@@ -1,4 +1,4 @@
-#! /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.
 #
 
@@ -75,25 +82,79 @@ fi
 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
 }
@@ -110,10 +171,8 @@ readstatus() {
 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
@@ -140,13 +199,13 @@ loadslot() {
     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
@@ -154,10 +213,10 @@ loadslot() {
     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
@@ -179,7 +238,7 @@ loadslot() {
 
 info() {
   readstatus
-  echo "$CURSLOT $LASTSLOT $FIRSTSLOT"
+  echo "$CURSLOT $NSLOT 1"
   exit 0
 }