]> git.sur5r.net Git - bacula/bacula/commitdiff
Add first cut Volume names to disk-changer
authorKern Sibbald <kern@sibbald.com>
Wed, 9 Jun 2010 06:56:17 +0000 (08:56 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:53:52 +0000 (16:53 +0200)
bacula/scripts/disk-changer.in
bacula/src/stored/autochanger.c
regress/tests/disk-changer-test

index 1d5dc74154fc9c748c78eda5e0002d656bfb5806..2990bfc74e3ae3d8870f05f78877950fec1ca2a6 100644 (file)
@@ -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.
 #  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
       ;;
index 713d6ad28bdcb6c48fa70fcbc3068937f9767a11..ee68df27914e34f2d6070e65babe85aa716fb7b6 100644 (file)
@@ -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);
index b45c687fdd5329ac49809c30719f6e438b28316a..0ae1e8fea33e53248f4e9a49fca89d09afdbf6d0 100755 (executable)
@@ -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=$?"