Files
mtx/mtx-1.3.12/contrib/tapeload.pl
2018-07-31 15:07:09 -05:00

119 lines
4.0 KiB
Perl

!/usr/bin/perl
########################## tapeload ###########################
# This script uses mtx 1.2.9pre2 to load a tape based
# on its volume tag. You can
# specify a tape drive by number, but if you don`t, it puts the
# tape in the first available drive and returns the number of that drive,
# both from the standard output and as the exit value.
# A negative exit value indicates an error.
# If volume tags are missing from any full slot, bar codes are rescanned
# automatically.
#
# usage:
# tapeload TAPE_LABEL_1 # Loads tape with label TAPE_LABEL_1 into a drive
# or
# tapeload TAPE_LABEL_1 1 # Loads tape with label TAPE_LABEL_1 into drive #1
#
# Set this variable to your mtx binary and proper scsi library device.
$MTXBIN="/usr/local/bin/mtx -f /dev/sga" ;
# Additions and corrections are welcome.
# This software comes with absolutely no warranty and every other imaginable
# disclaimer.
# -- Frank Samuelson sam@milagro.lanl.gov
##################################################################
@wt= &mdo("status"); #slurp in the list of slots
# Check to be certain that every full slot has a volume tag
for ($i=0; $i< $#wt; $i++) { # look through every line
if ( $wt[$i] =~ /Full/ && $wt[$i] !~ /VolumeTag/ ) {
# if the element is full, but there is no volume tag, do inventory
@wt= &mdo("inventory status");
break;
}
}
#try to find our tape
$slot=-1;
for ($i=0; $i< $#wt; $i++) { # look through every line
if ($wt[$i] =~ / *Storage Element (d*):Full :VolumeTag=(.*)/ ) {
if ($ARGV[0] eq $2) { # We found the tape
$slot=$1; # set the slot number
break; # stop reading the rest of the file.
}
}
}
if ( $slot>0) { # we found the tape you wanted.
$drivefound=-1; # set flag to bad value
for ($i=0; $i< $#wt; $i++) { # look through every line
# if this is a tape drive
if ($wt[$i] =~ / *Data Transfer Element (d*):(.*)/ ) { #parse the line
$drive=$1;
$state=$2;
# print STDERR "$wt[$i] $drive $state";
if ($state =~ /Full/) { # This drive is full.
# if we are looking for a particular drive and this is it
if ( $#ARGV==1 && $drive == $ARGV[1]) {
print STDERR " ERROR: Specified drive $ARGV[1] is full.";
print STDERR @wt;
exit(-6);
}
} elsif ($state =~ /Empty/) { #This is a tape drive and it`s empty.
if ( $#ARGV==1 ) { # If we want a particular drive
if ($drive == $ARGV[1]) { # and this is it,
$drivefound=$drive; # mark it so.
break;
}
} else { # If any old drive will do
$drivefound=$drive; # Mark it.
break;
}
} else { # This is a tape drive, but what the heck is it?
print STDERR " Cannot assess drive status in line";
print STDERR $wt[$i];
exit(-7);
}
}
}
if ( $drivefound < 0 ) { # specified drive was not found
print STDERR "Error: Specified drive $ARGV[1] was not found";
print STDERR @wt;
exit(-8);
}
# Now we actually load the tape.
@dump=&mdo(" load $slot $drivefound ");
print "$drivefound";
exit($drivefound);
# The end.
} else {
print STDERR " Ug. Tape $ARGV[0] is not in the library.";
print STDERR @wt;
exit(-4);
}
sub mdo # a subroutine to call mtx ;
{
# print STDERR "$_[0]";
if (!open(FD,"$MTXBIN $_[0] |")) { #call mtx function
print STDERR " ERRKK. Could not start mtx ";
exit (-9);
}
@twt= <FD>; # slurp in the output
if (! close(FD)) { # if mtx exited with a nonzero value...
print STDERR " Mtx gave an error. Tapeload is exiting... ";
exit (-10);
}
@twt;
}