mirror of
https://github.com/moibenko/mtx.git
synced 2026-01-03 19:03:58 +00:00
119 lines
4.0 KiB
Perl
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;
|
|
}
|