From ef23fca1763181f817e5e19b0ba2f5fb65a27c30 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 9 Jun 2010 08:56:17 +0200 Subject: [PATCH] Add first cut Volume names to disk-changer --- bacula/scripts/disk-changer.in | 248 ++++++++++++++++++-------------- bacula/src/stored/autochanger.c | 10 +- regress/tests/disk-changer-test | 7 +- 3 files changed, 156 insertions(+), 109 deletions(-) diff --git a/bacula/scripts/disk-changer.in b/bacula/scripts/disk-changer.in index 1d5dc74154..2990bfc74e 100644 --- a/bacula/scripts/disk-changer.in +++ b/bacula/scripts/disk-changer.in @@ -4,7 +4,7 @@ # # Written by Kern Sibbald # -# Copyright (C) 2000-2009 Free Software Foundation Europe e.V. +# Copyright (C) 2000-2010 Free Software Foundation Europe e.V. # # The main author of Bacula is Kern Sibbald, with contributions from # many others, a complete list can be found in the file AUTHORS. @@ -29,18 +29,17 @@ # Switzerland, email:ftf@fsfeurope.org. # # -# $Id$ -# # If you set in your Device resource # # Changer Command = "path-to-this-script/disk-changer %c %o %S %a %d" # you will have the following input to this script: # # So Bacula will always call with all the following arguments, even though -# in come cases, not all are used. +# in come cases, not all are used. Note, the Volume name is not always +# included. # -# disk-changer "changer-device" "command" "slot" "archive-device" "drive-index" -# $1 $2 $3 $4 $5 +# disk-changer "changer-device" "command" "slot" "archive-device" "drive-index" "volume" +# $1 $2 $3 $4 $5 $6 # # By default the autochanger has 10 Volumes and 1 Drive. # @@ -50,8 +49,8 @@ # # changer-device is the name of a file that overrides the default # volumes and drives. It may have: -# maxslot=n where n is one based (default 10) -# maxdrive=m where m is zero based (default 1 -- i.e. 2 drives) +# maxslot=n where n is one based (default 10) +# maxdrive=m where m is zero based (default 1 -- i.e. 2 drives) # # This code can also simulate barcodes. You simply put # a list of the slots and barcodes in the "base" directory/barcodes. @@ -70,7 +69,7 @@ # any other part of the directory name. These restrictions could be # easily removed by any clever script jockey. # -# Full example: disk-changer /var/bacula/conf load 1 /var/bacula/drive0 0 +# Full example: disk-changer /var/bacula/conf load 1 /var/bacula/drive0 0 TestVol001 # # The Volumes will be created with names slot1, slot2, slot3, ... maxslot in the # base directory. In the above example the base directory is /var/bacula. @@ -79,6 +78,9 @@ # /var/bacula/slot3, ...) this script will create a /var/bacula/loadedn # file to keep track of what Slot is loaded. You should not change this file. # +# Modified 8 June 2010 to accept Volume names from the calling program as arg 6. +# In this case, rather than storing the data in slotn, it is stored in the +# Volume name. Note: for this to work, Volume names may not include spaces. # wd=@working_dir@ @@ -92,7 +94,7 @@ wd=@working_dir@ dbgfile="$wd/disk-changer.log" debug() { if test -f $dbgfile; then - echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile + echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile fi } @@ -105,8 +107,8 @@ make_temp_file() { if test x${TMPFILE} = x; then TMPFILE="$wd/disk-changer.$$" if test -f ${TMPFILE}; then - echo "Temp file security problem on: ${TMPFILE}" - exit 1 + echo "Temp file security problem on: ${TMPFILE}" + exit 1 fi fi } @@ -117,14 +119,14 @@ check_parm_count() { pCount=$1 pCountNeed=$2 if test $pCount -lt $pCountNeed; then - echo "usage: disk-changer ctl-device command [slot archive-device drive-index]" - echo " Insufficient number of arguments arguments given." - if test $pCount -lt 2; then - echo " Mimimum usage is first two arguments ..." - else - echo " Command expected $pCountNeed arguments" - fi - exit 1 + echo "usage: disk-changer ctl-device command [slot archive-device drive-index]" + echo " Insufficient number of arguments arguments given." + if test $pCount -lt 2; then + echo " Mimimum usage is first two arguments ..." + else + echo " Command expected $pCountNeed arguments" + fi + exit 1 fi } @@ -137,11 +139,29 @@ get_dir() { dir=`echo "$device" | sed -e s%/$bn%%g` if [ ! -d $dir ]; then echo "ERROR: Autochanger directory \"$dir\" does not exist." - echo " You must create it." + echo " You must create it." exit 1 fi } +# +# Get the Volume name from the call line, or directly from +# the volslotn information. +# +get_vol() { + havevol=0 + debug "vol=$volume" + if test "x$volume" != x && test "x$volume" != "x*NONE*" ; then + debug "touching $dir/$volume" + touch $dir/$volume + echo "$volume" >$dir/volslot${slot} + havevol=1 + elif [ -f $dir/volslot${slot} ]; then + volume=`cat $dir/volslot${slot}` + havevol=1 + fi +} + # Setup arguments ctl=$1 @@ -149,6 +169,7 @@ cmd="$2" slot=$3 device=$4 drive=$5 +volume=$6 # set defaults maxdrive=1 @@ -165,92 +186,100 @@ fi # case $2 in list|listall) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; slots) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; transfer) - check_parm_count $# 4 - if [ $slot -gt $maxslot ]; then - echo "Slot ($slot) out of range (1-$maxslot)" - exit 1 - fi - ;; + check_parm_count $# 4 + if [ $slot -gt $maxslot ]; then + echo "Slot ($slot) out of range (1-$maxslot)" + exit 1 + fi + ;; *) - check_parm_count $# 5 - if [ $drive -gt $maxdrive ]; then - echo "Drive ($drive) out of range (0-$maxdrive)" - exit 1 - fi - if [ $slot -gt $maxslot ]; then - echo "Slot ($slot) out of range (1-$maxslot)" - exit 1 - fi - ;; + check_parm_count $# 5 + if [ $drive -gt $maxdrive ]; then + echo "Drive ($drive) out of range (0-$maxdrive)" + exit 1 + fi + if [ $slot -gt $maxslot ]; then + echo "Slot ($slot) out of range (1-$maxslot)" + exit 1 + fi + ;; esac - -debug "Parms: $ctl $cmd $slot $device $drive" +debug "Parms: $ctl $cmd $slot $device $drive $volume $havevol" case $cmd in unload) - debug "Doing disk -f $ctl unload $slot $device $drive" + debug "Doing disk -f $ctl unload $slot $device $drive $volume" get_dir if [ -f $dir/loaded${drive} ]; then - ld=`cat $dir/loaded${drive}` + ld=`cat $dir/loaded${drive}` else - echo "Storage Element $slot is Already Full" - exit 1 + echo "Storage Element $slot is Already Full" + exit 1 fi if [ $slot -eq $ld ]; then - echo "0" >$dir/loaded${drive} - unlink $device 2>/dev/null >/dev/null - rm -f $device + echo "0" >$dir/loaded${drive} + unlink $device 2>/dev/null >/dev/null + rm -f $device else - echo "Storage Element $slot is Already Full" - exit 1 + echo "Storage Element $slot is Already Full" + exit 1 fi ;; load) - debug "Doing disk $ctl load $slot $device $drive" + debug "Doing disk $ctl load $slot $device $drive $volume" get_dir i=0 while [ $i -le $maxdrive ]; do - if [ -f $dir/loaded${i} ]; then - ld=`cat $dir/loaded${i}` - else - ld=0 - fi - if [ $ld -eq $slot ]; then - echo "Drive ${i} Full (Storage element ${ld} loaded)" - exit 1 - fi - i=`expr $i + 1` + if [ -f $dir/loaded${i} ]; then + ld=`cat $dir/loaded${i}` + else + ld=0 + fi + if [ $ld -eq $slot ]; then + echo "Drive ${i} Full (Storage element ${ld} loaded)" + exit 1 + fi + i=`expr $i + 1` done - # check if slot exists - if [ ! -f $dir/slot${slot} ] ; then - echo "source Element Address $slot is Empty" - exit 1 + # Check if we have a Volume name + get_vol + if [ $havevol -eq 0 ]; then + # check if slot exists + if [ ! -f $dir/slot${slot} ] ; then + echo "source Element Address $slot is Empty" + exit 1 + fi fi if [ -f $dir/loaded${drive} ]; then - ld=`cat $dir/loaded${drive}` + ld=`cat $dir/loaded${drive}` else - ld=0 + ld=0 fi if [ $ld -ne 0 ]; then - echo "Drive ${drive} Full (Storage element ${ld} loaded)" - exit 1 + echo "Drive ${drive} Full (Storage element ${ld} loaded)" + exit 1 fi echo "0" >$dir/loaded${drive} unlink $device 2>/dev/null >/dev/null rm -f $device - ln -s $dir/slot${slot} $device - rtn=$? + if [ $havevol -ne 0 ]; then + ln -s $dir/$volume $device + rtn=$? + else + ln -s $dir/slot${slot} $device + rtn=$? + fi if [ $rtn -eq 0 ]; then - echo $slot >$dir/loaded${drive} + echo $slot >$dir/loaded${drive} fi exit $rtn ;; @@ -259,36 +288,44 @@ case $cmd in debug "Doing disk -f $ctl -- to list volumes" get_dir if [ -f $dir/barcodes ]; then - cat $dir/barcodes + cat $dir/barcodes else - i=1 - while [ $i -le $maxslot ]; do - echo "$i:" - i=`expr $i + 1` - done + i=1 + while [ $i -le $maxslot ]; do + slot=$i + volume= + get_vol + if [ $havevol -eq 0 ]; then + echo "$i:" + else + echo "$i:$volume" + fi + i=`expr $i + 1` + done fi exit 0 ;; listall) + # ***FIXME*** must add new Volume stuff make_temp_file debug "Doing disk -f $ctl -- to list volumes" get_dir if [ ! -f $dir/barcodes ]; then - exit 0 + exit 0 fi # we print drive content seen by autochanger # and we also remove loaded media from the barcode list i=0 while [ $i -le $maxdrive ]; do - if [ -f $dir/loaded${i} ]; then - ld=`cat $dir/loaded${i}` - v=`awk -F: "/^$ld:/"' { print $2 }' $dir/barcodes` - echo "D:$i:F:$ld:$v" - echo "^$ld:" >> $TMPFILE - fi - i=`expr $i + 1` + if [ -f $dir/loaded${i} ]; then + ld=`cat $dir/loaded${i}` + v=`awk -F: "/^$ld:/"' { print $2 }' $dir/barcodes` + echo "D:$i:F:$ld:$v" + echo "^$ld:" >> $TMPFILE + fi + i=`expr $i + 1` done # Empty slots are not in barcodes file @@ -297,15 +334,15 @@ case $cmd in grep -v -f $TMPFILE $dir/barcodes | sort -n | \ perl -ne 'BEGIN { $cur=1 } if (/(\d+):(.+)?/) { - if ($cur == $1) { - print "S:$1:F:$2\n" - } else { - while ($cur < $1) { - print "S:$cur:E\n"; - $cur++; - } - } - $cur++; + if ($cur == $1) { + print "S:$1:F:$2\n" + } else { + while ($cur < $1) { + print "S:$cur:E\n"; + $cur++; + } + } + $cur++; } END { while ($cur < '"$maxslot"') { print "S:$cur:E\n"; $cur++; } } ' @@ -313,24 +350,25 @@ case $cmd in exit 0 ;; transfer) + # ***FIXME*** must add new Volume stuff get_dir make_temp_file slotdest=$device if [ -f $dir/slot{$slotdest} ]; then - echo "destination Element Address $slot is Full" - exit 1 + echo "destination Element Address $slot is Full" + exit 1 fi if [ ! -f $dir/slot${slot} ] ; then - echo "source Element Address $slot is Empty" - exit 1 + echo "source Element Address $slot is Empty" + exit 1 fi echo "Transfering $slot to $slotdest" mv $dir/slot${slot} $dir/slot{$slotdest} if [ -f $dir/barcodes ]; then - sed "s/^$slot:/$slotdest:/" > $TMPFILE - sort -n $TMPFILE > $dir/barcodes + sed "s/^$slot:/$slotdest:/" > $TMPFILE + sort -n $TMPFILE > $dir/barcodes fi exit 0 ;; @@ -338,9 +376,9 @@ case $cmd in debug "Doing disk -f $ctl $drive -- to find what is loaded" get_dir if [ -f $dir/loaded${drive} ]; then - cat $dir/loaded${drive} + cat $dir/loaded${drive} else - echo "0" + echo "0" fi exit ;; diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index 713d6ad28b..ee68df2791 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -653,7 +653,15 @@ char *edit_device_codes(DCR *dcr, char *omsg, const char *imsg, const char *cmd) str = dcr->jcr->Job; break; case 'v': - str = NPRT(dcr->VolumeName); + if (dcr->VolCatInfo.VolCatName[0]) { + str = dcr->VolCatInfo.VolCatName; + } else if (dcr->VolumeName[0]) { + str = dcr->VolumeName; + } else if (dcr->dev->vol && dcr->dev->vol->vol_name) { + str = dcr->dev->vol->vol_name; + } else { + str = dcr->dev->VolHdr.VolumeName; + } break; case 'f': str = NPRT(dcr->jcr->client_name); diff --git a/regress/tests/disk-changer-test b/regress/tests/disk-changer-test index b45c687fdd..0ae1e8fea3 100755 --- a/regress/tests/disk-changer-test +++ b/regress/tests/disk-changer-test @@ -1,7 +1,8 @@ #!/bin/sh -rm -rf tmp/disk-changer -mkdir -p tmp/disk-changer -touch tmp/disk-changer/conf +. scripts/functions +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-disk-changer echo "Unload drive 0" $scripts/disk-changer tmp/disk-changer/conf unload 1 tmp/disk-changer/drive0 0 echo "rtn=$?" -- 2.39.5