X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fchg-disk.sh.in;h=c4f59f700ddf86df8b17f3bdb21c956f203aac42;hb=34197d9f46a5f4e944378cbb65fca32ee0eec7b9;hp=1f0b8518a441e26397da098d5fae1e590efab0f8;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/changer-src/chg-disk.sh.in b/changer-src/chg-disk.sh.in index 1f0b851..c4f59f7 100644 --- a/changer-src/chg-disk.sh.in +++ b/changer-src/chg-disk.sh.in @@ -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 @@ -34,16 +34,18 @@ # |- ... # |- 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 @@ -52,7 +54,12 @@ # } # --- 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 " 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 }