From: Eric Bollengier Date: Thu, 8 Oct 2009 16:13:37 +0000 (+0200) Subject: Implement transfer and listall command in mtx-changer and disk-changer scripts X-Git-Tag: Release-7.0.0~2606^2~1 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e84a5fd4d3863cb555b2fe557356ec291d19572f;p=bacula%2Fbacula Implement transfer and listall command in mtx-changer and disk-changer scripts --- diff --git a/bacula/scripts/disk-changer.in b/bacula/scripts/disk-changer.in index 59ddd4a105..f9c800cc0e 100644 --- a/bacula/scripts/disk-changer.in +++ b/bacula/scripts/disk-changer.in @@ -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 diff --git a/bacula/scripts/mtx-changer.in b/bacula/scripts/mtx-changer.in index a40e13769c..1992e1843d 100644 --- a/bacula/scripts/mtx-changer.in +++ b/bacula/scripts/mtx-changer.in @@ -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