in reply to Talking to Magnetic Tapes
#!/usr/bin/perl -w package Device::MagneticTape; use Data::Dumper; use strict; my %self; my %cmd; my %dc = ( fsf=>'fsf', bsf=>'bsf', eod=>'eod', unload=>'unload', fsr=>'fsr', bsr=>'bsr', status=>'status', exist=>'exist', rewind=>'rewind' ); my %statval = ( eof=>'EOF' , bot=>'BOT' , eot=>'EOT' , eod=>'EOD' , online=>'ONLINE' , dr_open=>'DR_OPEN' , busy=>'BUSY' , ); my %linux = ( unload=>'eject' ); my %irix = ( eod=>'feom' ); my $ostype = `uname`; chomp $ostype; %cmd = ( %dc , %linux ) if ($ostype =~ /linux/i); %cmd = ( %dc , %irix ) if ($ostype =~ /irix/i); sub new { my $self = shift; my $device = shift; my $mt = shift; my %tape = ( mt => $mt, device => $device, command => "$mt -f $device " ); # Sanity check the device and mt binary # if all is good then bless %tape and return, return bless {%tape} , $self; } # END contsructor #Methods; sub rewind { my $self = shift; my $command = $self->{command} . $cmd{rewind}; warn "rewind\n"; my $err; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub gotoend { my $self = shift; my $command = $self->{command} . $cmd{eod}; my $err; warn "gotoend\n"; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub goto { my $self = shift; my $val = shift; $self->rewind; return $self->forwardspace($val); } sub forwardspace { my $self = shift; my $distance = shift; my $err; $distance = 1 unless defined $distance; warn "forwardspace $distance\n"; my $command = join " " , $self->{command} , $cmd{fsf} , $distance; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub backwardspace { my $self = shift; my $distance = shift; my $err; $distance = 1 unless defined $distance; warn "backwardspace $distance\n"; my $command = join " " , $self->{command} , $cmd{bsf} , $distance; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub forwardblock { my $self = shift; my $blocks = shift; my $err; $blocks = 1 unless defined $blocks; warn "forwardblock $blocks\n"; my $command = join " " , $self->{command} , $cmd{fsr} , $blocks; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub backwardblock { my $self = shift; my $blocks = shift; my $err; $blocks = 1 unless defined $blocks; warn "backwardblock $blocks\n"; my $command = join " " , $self->{command} , $cmd{bsr} , $blocks; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub endofdata { my $self = shift; my $err; warn "endofdata\n"; my $command = join " " , $self->{command} , $cmd{eod}; $self->stat; $err = system ( $command ) unless ($self->{busy}); return $err; } sub stat { my $self = shift; my $command = join " " , $self->{command} , $cmd{status}; warn "stat\n"; my @stats = `$command`; # Blank the hash map {$self{$_}=0} keys %statval; foreach (@stats) { $self->{busy} = 1 if ($_ =~ /resource busy/i); $self->{bot}=1 if ( $_ =~ / bot /i ); $self->{bot}=0 if ( $_ =~ /not at bot/i ); $self->{eod}=1 if ( $_ =~ / eod /i ); $self->{eof}=1 if ( $_ =~ / eof /i ); $self->{eof}=1 if ( $_ =~ /at fmk /i ); $self->{wr_prot}=1 if ( $_ =~ / wr_prot /i ); $self->{online}=1 if ( $_ =~ / online /i ); } print "\nStatComplete\n"; } # MetaMethods sub new_media { my $self = shift; my $name = shift; chomp $name; $self->rewind; open ( INDEX , '>>' , $self->{device} ) || die "Cant make newmedia $! +"; print INDEX "$name\n"; close INDEX; } sub writeindex { my $self = shift; my @index = @_; chomp(@index); $self->gotoend; unshift (@index , $self->{mastername}); print "Writing Index\n"; open ( INDEX , '>>' , $self->{device} ) || die "Cant write index $!"; print INDEX join "\n" , @index; close INDEX; } sub getindex { my $self = shift; my @index; $self->positionforwrite; open( INDEX , $self->{device} ) || die "Can't open index from device" + ; @index = <INDEX>; close INDEX; my $name = shift @index; chomp($name); $self->{mastername} = $name ; print "Media Label : ".$self->{mastername} . "\n"; my $i=0; #foreach (@index) { # print "$i : $_"; # ++$i; #} return @index; } sub positionforwrite { my $self = shift; $self->gotoend; $self->backwardspace(1); $self->backwardblock(1); } #writemyindex #getmyindex # Data Accessors sub status { my $self = shift; my $var = shift; return "" unless defined $var; return $self->{$var}; } 1; =head1 NAME Device::MagneticTape =head1 SYNOPSIS my $tape = Device::MagneticTape->new( $device , $mtbin ); my @index = $tape->getindex; $tape->positionforwrite; my $target = '/something/to/archive' # write to tape using your favorite archiver push (@index , $target); $tape->writeindex(@index); The standard methods return the same exit status as mt, generally thi +s is - 0 for success. 1 for unrecognised commands. 2 if an operation +fails. A method will return an undef if it was unable to execute due +to the device being 'busy'. =head1 METHODS =over 1 =head2 new ( $device , $mtbin ) takes two arguments, the device to use (make sure you use NO-rewind), +and the path to your system's mt binary. Returns a new Device::Magnet +icTape object with the following methods. =head2 rewind Rewind the tape. erm.. =head2 gotoend Space forward on the tape until reaching the end of data (B<EOD>). =head2 goto ( $tapefile ) Goto the numeric tapefile from BOT. Remember the first tapefile is num +ber 0. =head2 forwardspace ( $distance ) Space forware $distance tapefiles. =head2 backwardspace ( $distance ) Space backward $distance tapefiles. B<Note: To position correctly for +a read you should also move forwardblock(1) after any backwardspace>. =head2 forwardblock ( $blocks ) Move forward on the tape any given number of $blocks. =head2 backwardblock ( $blocks ) Move backward on the tape any given number of $blocks. =head2 endofdata See B<gotoend> above. =head2 stat Query the object's status as given by 'mt -f /dev/tape stat'. =back 1 =head1 META-METHODS In addition to supporting basic tape transport, the following methods +are provided. =over 1 =head2 new_media ( $name ) Create the first instance of an index on the current object, $name def +ines the media name. =head2 writeindex ( @index ) Accepts a list as it's argument , writeindex will update the tape inde +x to reflect @index. =head2 getindex Returns a list as it was stored by ->writeindex =head2 positionforwrite Positions the tape on the FMK B<before> the index is stored. When usin +g indexed tapes, ->positionforwrite B<before> appending to a tape. =back 1 =head1 BUGS Bound to be really, you should let me know if you find them <abramble@ +bigpond.net.au>. I would think this POD still needs work. =head1 AUTHOR Andrew Bramble <abramble@bigpond.net.au> =head1 SEE ALSO mt(1) , st(4) =head1 COPYRIGHT Copyright 2002 Andrew Bramble <abramble@bigpond.net.au> Now hear this. Distribute, repair, reuse, recycle, modify as much as y +ou like or can - it's free. =cut
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: Talking to Magnetic Tapes
by Aristotle (Chancellor) on Oct 22, 2002 at 18:00 UTC |