]> git.sur5r.net Git - bacula/bacula/commitdiff
Implement transfer and listall command in mtx-changer and disk-changer scripts
authorEric Bollengier <eric@eb.homelinux.org>
Thu, 8 Oct 2009 16:13:37 +0000 (18:13 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Thu, 8 Oct 2009 16:48:12 +0000 (18:48 +0200)
bacula/scripts/disk-changer.in
bacula/scripts/mtx-changer.in

index 59ddd4a1052c04a882de97cfc2a1e4e0d481fb5d..f9c800cc0ebb7709b4e41462b571f1abc2407500 100644 (file)
@@ -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
@@ -263,6 +270,68 @@ 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
+      for i in $dir/loaded*
+      do
+          d=${i##$dir/loaded}
+          s=$(cat $i)
+          v=$(awk -F: "/^$s:/"' { print $2 }' $dir/barcodes)
+          echo "D:$d:F:$s:$v"
+          echo "^$s:" >> $TMPFILE
+      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 | \
+      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
index a40e13769cf845cd3dd5be6a2601df9a9e74562f..1992e1843d85c0f9d3a9c7908649cf6ea85e3313 100644 (file)
@@ -30,6 +30,8 @@
 #      loaded            which slot is loaded?
 #      list              list Volume names (requires barcode reader)
 #      slots             how many slots total?
+#      listall            list all info
+#      transfer
 #
 #  Slots are numbered from 1 ...
 #  Drives are numbered from 0 ...
@@ -120,12 +122,15 @@ check_parm_count() {
 #  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
+        ;;
     *)
        check_parm_count $# 5
        ;;
@@ -183,6 +188,34 @@ case $cmd in
       exit $rtn
       ;;
 
+   listall) 
+      debug "Doing mtx -f $ctl -- to list all"
+      make_temp_file
+      if test ${inventory} -ne 0 ; then
+       ${MTX} -f $ctl inventory
+      fi
+      ${MTX} -f $ctl status >${TMPFILE}
+      rtn=$?
+      # can be converted to awk+sed+cut, contributions are welcome
+      perl -ne '
+/Data Transfer Element (\d+):Empty/ && print "D:$1:E\n";
+/Data Transfer Element (\d+):Full \(Storage Element (\d+) Loaded\)(:VolumeTag =\s*(.+))?/ && print "D:$1:F:$2:$4\n";
+/Storage Element (\d+):Empty/ && print "S:$1:E\n";
+/Storage Element (\d+):Full( :VolumeTag=(.+))?/ && print "S:$1:F:$3\n";
+/Storage Element (\d+) IMPORT.EXPORT:Empty/ && print "I:$1:E\n";
+/Storage Element (\d+) IMPORT.EXPORT:Full( :VolumeTag=(.+))?/ && print "I:$1:F:$3\n";' ${TMPFILE}
+      rm -f ${TMPFILE} >/dev/null 2>&1
+      exit $rtn
+      ;;
+
+   transfer)
+      slotdest=$device
+      debug "Doing transfer from $slot to $slotdest"
+      ${MTX} -f $ctl transfer $slot $slotdest
+      rtn=$?
+      exit $rtn
+      ;;
+
    loaded)
       debug "Doing mtx -f $ctl $drive -- to find what is loaded"
       make_temp_file