X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=backup%2Fincrem;h=31204309344435a96eb8d39e852516a29be45f53;hp=1d2aaa774afe6633558af65fdd5665ae0ad25f59;hb=refs%2Fheads%2Fbranch-2001-10-07-from-pmaydell;hpb=49b87b31128ab8bf32998d60eeacfe397a5a4b19 diff --git a/backup/increm b/backup/increm index 1d2aaa7..3120430 100755 --- a/backup/increm +++ b/backup/increm @@ -1,5 +1,10 @@ #!/usr/bin/perl +# Do an incremental backup. We are invoked by full if the tape +# description file says that it is for an incremental backup. +# We expect a single commandline argument which is the ID string +# of the tape to use. + BEGIN { $etc= '/etc/backup'; require "$etc/settings.pl"; @@ -8,30 +13,40 @@ BEGIN { $|=1; -@ARGV==2 or die; -($tapeid,$tapedesc)= @ARGV; +@ARGV==1 or die; +$tapeid= $ARGV[0]; -print "Running incremental onto $tapedesc ...\n" or die $!; +print "Running incremental (tape $tapeid) ...\n" or die $!; +# Just check that we weren't passed a bogus ID (the tape description +# file for incrementals is just 'incremental\nend\n') open T,"$etc/tape.$tapeid" or die "Tape $tapeid not found: $!\n"; close T; +# This is only used for the 'next FULL backup is X' message at the end. open NF,"next-full" or die $!; chomp($next= ); close NF or die $!; setstatus "FAILED during incremental"; +# Read the number of the incremental involved +# (ie, (how many files are already on the tape) - 1) open A,"increm-advance" or die $!; chomp($advance= ); close A or die $!; +# better be a decimal number $advance =~ m/^\d+$/ or die "$advance ?"; +# Rewind the tape and if we are the first incremental on the tape then +# write the TAPEID record, otherwise skip forward to the correct point. +# (full will already have checked that this is the right tape before +# it invoked us, so no need to read the existing TAPEID record first.) system "mt -f $ntape rewind"; $? and die $?; if ($advance == 1) { open TI,">TAPEID" or die $!; - print TI "$tapeid\n$tapedesc\n" or die $!; + print TI "$tapeid" or die $!; close TI or die $!; system "tar -b$blocksize -vvcf TAPEID.tar TAPEID"; $? and die $?; @@ -40,6 +55,7 @@ if ($advance == 1) { system "mt -f $ntape fsf $advance"; $? and die $?; } +# Get a list of all filesystems readfsys('all'); openlog(); @@ -51,6 +67,7 @@ sub closepipes () { setstatus "PROBLEMS during incremental dump"; for $tf (@fsys) { + pipe(DUMPOR,DUMPOW) or die $!; pipe(BUFOR,BUFOW) or die $!; parsefsys(); @@ -59,15 +76,21 @@ for $tf (@fsys) { print LOG "Not dumping $atf ($prefix) - not \`dump'.\n" or die $!; next; } + # Same trick as full uses to do a pipeline whilst keeping track + # of all exit statuses: + # dump /dev/null startprocess '&DUMPOW',$rstr."dump 1bfu $softblocksizekb - $atf"; startprocess '<&DUMPOR','>&BUFOW','writebuffer'; startprocess '<&BUFOR','>/dev/null' ,"dd ibs=$softblocksizebytes obs=$blocksizebytes of=$ntape"; closepipes(); endprocesses(); + # advance is a file counter, so it needs to be updated for each + # dump we do to tape. $advance++; } +# Rewind the tape, and increment the counter of incremental backups. system "mt -f $tape rewind"; $? and die $?; open IAN,">increm-advance.new" or die $!; print IAN "$advance\n" or die $!; @@ -77,5 +100,5 @@ rename 'increm-advance.new','increm-advance' or die $!; print LOG "Next FULL dump tape is $next\n" or die $!; print "Next FULL dump tape is $next\n" or die $!; -setstatus "INCREMENTAL successful: $tapedesc, next full is $next"; +setstatus "INCREMENTAL successful (next full is $next)"; exit 0;