#
# 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.
# modify it under the terms of version two of the GNU General Public
# License as published by the Free Software Foundation, which is
# listed in the file LICENSE.
-3
+#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
-3
+#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# 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.
# 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
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
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)
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