]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/scripts/disk-changer.in
Change Byline
[bacula/bacula] / bacula / scripts / disk-changer.in
index 8a901558bc57c8b2a06dda35df87f66b8bc0ba44..1d5dc74154fc9c748c78eda5e0002d656bfb5806 100644 (file)
@@ -4,7 +4,7 @@
 #
 #  Written by Kern Sibbald
 #
-#  Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+#  Copyright (C) 2000-2009 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.
@@ -23,7 +23,7 @@
 #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 #  02110-1301, USA.
 #
-#  Bacula® is a registered trademark of John Walker.
+#  Bacula® is a registered trademark of Kern Sibbald.
 #  The licensor of Bacula is the Free Software Foundation Europe
 #  (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
 #  Switzerland, email:ftf@fsfeurope.org.
@@ -136,8 +136,8 @@ get_dir() {
    bn=`basename $device`
    dir=`echo "$device" | sed -e s%/$bn%%g`
    if [ ! -d $dir ]; then
-      echo "ERROR: Autochanger directory \"$dir\" does not exist.\n"
-      echo "      You must create it.\n"
+      echo "ERROR: Autochanger directory \"$dir\" does not exist."
+      echo "      You must create it."
       exit 1
    fi
 }
@@ -164,12 +164,19 @@ fi
 #  all others are a minimum of 5
 #
 case $2 in
-    list)
+    list|listall)
        check_parm_count $# 2
        ;;
     slots)
        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 $# 5
        if [ $drive -gt $maxdrive ]; then
@@ -191,7 +198,12 @@ case $cmd in
    unload)
       debug "Doing disk -f $ctl unload $slot $device $drive"
       get_dir
-      ld=`cat $dir/loaded${drive}`
+      if [ -f $dir/loaded${drive} ]; then
+        ld=`cat $dir/loaded${drive}`
+      else 
+        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
@@ -205,25 +217,42 @@ case $cmd in
    load)
       debug "Doing disk $ctl load $slot $device $drive"
       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`
+      done
+      # check if slot exists
+      if [ ! -f $dir/slot${slot} ] ; then
+        echo "source Element Address $slot is Empty"
+        exit 1
+      fi
       if [ -f $dir/loaded${drive} ]; then
         ld=`cat $dir/loaded${drive}`
       else
         ld=0
       fi
-      if [ $ld -eq 0 ]; then
-        echo "0" >$dir/loaded${drive}
-        unlink $device 2>/dev/null >/dev/null
-        rm -f $device
-        ln -s $dir/slot${slot} $device
-        rtn=$?
-        if [ $rtn -eq 0 ]; then
-           echo $slot >$dir/loaded${drive}
-        fi
-        exit $rtn
-      else
+      if [ $ld -ne 0 ]; then
         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 [ $rtn -eq 0 ]; then
+        echo $slot >$dir/loaded${drive}
+      fi
+      exit $rtn
       ;;
 
    list) 
@@ -241,6 +270,70 @@ case $cmd in
       exit 0
       ;;
 
+   listall) 
+      make_temp_file
+      debug "Doing disk -f $ctl -- to list volumes"
+      get_dir 
+      if [ ! -f $dir/barcodes ]; then
+         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`
+      done
+
+      # Empty slots are not in barcodes file
+      # When we detect a gap, we print missing rows as empty
+      # At the end, we fill the gap between the last entry and maxslot
+      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++;
+       } 
+       END { while ($cur < '"$maxslot"') { print "S:$cur:E\n"; $cur++; } } '
+
+      rm -f $TMPFILE
+      exit 0
+      ;;
+   transfer)
+      get_dir
+      make_temp_file
+      slotdest=$device
+      if [ -f $dir/slot{$slotdest} ]; then
+        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
+      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
+      fi
+      exit 0
+      ;;
    loaded)
       debug "Doing disk -f $ctl $drive -- to find what is loaded"
       get_dir