chiark / gitweb /
From Peter Maydell (/u2/pmaydell/iwjbackup/) as per <E156bwm-0005xq-00@watchdragon...
[chiark-utils.git] / backup / increm
index 1d2aaa774afe6633558af65fdd5665ae0ad25f59..31204309344435a96eb8d39e852516a29be45f53 100755 (executable)
@@ -1,5 +1,10 @@
 #!/usr/bin/perl
 
 #!/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";
 BEGIN {
     $etc= '/etc/backup';
     require "$etc/settings.pl";
@@ -8,30 +13,40 @@ BEGIN {
 
 $|=1;
 
 
 $|=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;
 
 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";
 
 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 $!;
 
 open A,"increm-advance" or die $!;
 chomp($advance= <A>);
 close A or die $!;
 
+# better be a decimal number
 $advance =~ m/^\d+$/ or die "$advance ?";
 
 $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 $!;
 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 $?;
     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 $?;
 }
 
     system "mt -f $ntape fsf $advance"; $? and die $?;
 }
 
+# Get a list of all filesystems
 readfsys('all');
 openlog();
 
 readfsys('all');
 openlog();
 
@@ -51,6 +67,7 @@ sub closepipes () {
 setstatus "PROBLEMS during incremental dump";
 
 for $tf (@fsys) {
 setstatus "PROBLEMS during incremental dump";
 
 for $tf (@fsys) {
+
     pipe(DUMPOR,DUMPOW) or die $!;
     pipe(BUFOR,BUFOW) or die $!;
     parsefsys();
     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;
     }
        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();
     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++;
 }
 
     $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 $!;
 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 $!;
 
 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;
 exit 0;