X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=backup%2Fwhatsthis;fp=backup%2Fwhatsthis;h=00d5dfff0ec4bc910ae88f7ec137cb33613d4bd2;hb=ef74fefeba9761cd21b542976e3853ab0f4ce1a5;hp=0000000000000000000000000000000000000000;hpb=49b87b31128ab8bf32998d60eeacfe397a5a4b19;p=chiark-utils.git diff --git a/backup/whatsthis b/backup/whatsthis new file mode 100755 index 0000000..00d5dff --- /dev/null +++ b/backup/whatsthis @@ -0,0 +1,122 @@ +#!/usr/bin/perl + +# whatsthis : just read an ID off the tape and display it to the user. +# Peter Maydell +# First rough hack; mostly just code nabbed from full. +# --list assumes the dump type was 'zafio', which is a bit bogus. + +# whatsthis : no args => just print tapeid +# whatsthis --list [n] : print tapeid then list archive n (if n omitted, +# 0 is assumed.) Note that archives are numbered from zero! + +sub rewind(); +sub stopandsay(@); + +$etc='/etc/backup'; +require "$etc/settings.pl"; +require 'backuplib.pl'; + +$| = 1; + +# This isn't intended to be run automatically, so don't bother +# with setting status. + +# If we are run with the argument --list then list the backup to +# stdout. Otherwise just print the tape ID. +$listing = 0; # default : don't list +$listing = 1 if ($ARGV[0] eq '--list'); +$listarchive = 0; +$listarchive = $ARGV[1] if defined $ARGV[1]; + +print "Trying to read tape ID from currently inserted tape...\n"; + +unlink 'TAPEID'; +system "mt -f $ntape setblk $blocksizebytes"; $? and die $?; +system "dd if=$ntape bs=${blocksize}b count=10 | tar -b$blocksize -vvxf - TAPEID"; +$? and stopandsay "Failed to read TAPEID.\n"; + +if (!open(T, "TAPEID")) +{ + stopandsay "Tape has no ID label.\n"; +} + +# OK, there's a TAPEID file, read the ID and check for sanity. +chomp($tapeid= ); +if ($tapeid =~ m/[^0-9a-zA-Z]/) +{ + stopandsay "Tape has a bad (non-alphanumeric) TAPEID ($&).\n"; +} +elsif (! $tapeid =~ m/[0-9a-zA-Z]/) +{ + stopandsay "Empty TAPEID.\n"; +} + +print "TAPEID is $tapeid.\n"; +close T; + +# If we aren't listing the tape contents, we can just rewind the tape +# and exit. +if (!$listing) +{ + rewind(); + exit; +} + +# List the contents of archive $listarchive on the tape. +# We are already at the right place for the first archive +# (after the TAPEID). +# For any other archive, we skip forwards to the start of that archive. +if ($listarchive) +{ + system "mt -f $ntape fsf $listarchive"; + $? and stopandsay "Couldn't skip forward to archive $listarchive."; +} + +# Use file to figure out what the archive type is +# This doesn't seem to work too well, so I'm disabling it -- PMM +#$ftype = `dd if=$ntape ibs=$blocksizebytes | file -`; +#$? and stopandsay "couldn't determine file type: $?"; +$ftype = 'POSIX tar'; + +# What we want to do here is roughly: +# dd if=$ntape ibs=$blocksizebytes | readbuffer | afio ??? +# +# where the afio options are such as to list an archive created with +# afio -b $softblocksizebytes -Zvo + +if ($ftype =~ /POSIX tar/) { + # POSIX tar archive; we read it with cpio + $reader = "cpio -it -C$softblocksizebytes -Hustar"; +} elsif ($ftype =~ /ASCII cpio/) { + $reader = "afio -b $softblocksizebytes -Zt -"; +} elsif ($ftype =~ /dump file/) { + stopandsay "sorry: can't list dump files yet"; +} else { + stopandsay "listing failed: unknown archive type"; +} + +# Now back up so we can read the file again properly +#system "mt -f $ntape bsf 1"; $? and stopandsay "couldn't backspace tape: $?"; + +system "dd if=$ntape ibs=$blocksizebytes | /usr/local/lib/backup/readbuffer | $reader"; +$? and stopandsay "listing failed: $?"; + +# All's well, stop here. +print "Listing complete.\n"; +rewind(); +exit; + + +# Rewind the tape. +sub rewind () +{ + system "mt -f $tape rewind"; $? and die $?; +} + +# Print the given message, rewind the tape and exit failure. +sub stopandsay(@) +{ + print @_; + rewind(); + exit(1); +}