#!/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 <ian@chiark.greenend.org.uk>
+# Copyright (C) 1999 Peter Maydell <pmaydell@chiark.greenend.org.uk>
+#
+# 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= <NF>);
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= <A>);
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 $?;
system "mt -f $ntape fsf $advance"; $? and die $?;
}
+# Get a list of all filesystems
readfsys('all');
openlog();
setstatus "PROBLEMS during incremental dump";
for $tf (@fsys) {
+
pipe(DUMPOR,DUMPOW) or die $!;
pipe(BUFOR,BUFOW) or die $!;
parsefsys();
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 | writebuffer | dd >/dev/null
startprocess '</dev/null','>&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 $!;
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;