X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=backup%2Fincrem;h=b3c1f7019d57e2dd42feeb1fea506ecab926c2c0;hp=e4ebbf75a5bf881886863164d6b61c14bc1945aa;hb=78a74565c7a41d62d008fc6d93eba9e869792624;hpb=3f7f507605d77ece782e847a5a1606197268f220 diff --git a/backup/increm b/backup/increm index e4ebbf7..b3c1f70 100755 --- a/backup/increm +++ b/backup/increm @@ -1,39 +1,74 @@ #!/usr/bin/perl +# increm +# Do an incremental backup; ONLY for invocation by full ! +# +# This file is part of chiark backup, a system for backing up GNU/Linux and +# other UN*X-compatible machines, as used on chiark.greenend.org.uk. +# +# chiark backup is: +# Copyright (C) 1997-1998,2000-2001 Ian Jackson +# Copyright (C) 1999 Peter Maydell +# +# This is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2, or (at your option) any later version. +# +# This is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# We are invoked by full if the tape description file says that it is +# for an incremental backup. We expect two commandline argument which +# is the ID string of the tape to use, and the description (which +# includes ID and function). BEGIN { - $etc= '/etc/backup'; + $etc= '/etc/chiark-backup'; require "$etc/settings.pl"; require 'backuplib.pl'; } $|=1; -@ARGV==1 or die; -$tapeid= $ARGV[0]; +@ARGV==2 or die; +($tapeid,$tapedesc)= @ARGV; -print "Running incremental (tape $tapeid) ...\n" or die $!; +print "Running incremental onto $tapedesc ...\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 ?"; -system "mt -f $tape rewind"; $? and die $?; -system "mt -f $tape retension"; $? and die $?; - +# 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" or die $!; + print TI "$tapeid\n$tapedesc\n" or die $!; close TI or die $!; system "tar -b$blocksize -vvcf TAPEID.tar TAPEID"; $? and die $?; @@ -42,6 +77,7 @@ if ($advance == 1) { system "mt -f $ntape fsf $advance"; $? and die $?; } +# Get a list of all filesystems readfsys('all'); openlog(); @@ -53,6 +89,7 @@ sub closepipes () { setstatus "PROBLEMS during incremental dump"; for $tf (@fsys) { + pipe(DUMPOR,DUMPOW) or die $!; pipe(BUFOR,BUFOW) or die $!; parsefsys(); @@ -61,17 +98,22 @@ 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 $!; close IAN or die $!; @@ -80,5 +122,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 (next full is $next)"; +setstatus "INCREMENTAL successful: $tapedesc, next full is $next"; exit 0;