From 823a4f1c9ec99daf48228dff056d54db62c3a849 Mon Sep 17 00:00:00 2001 From: ianmdlvl Date: Sun, 11 May 2003 19:01:11 +0000 Subject: [PATCH] @@ -3,6 +3,7 @@ + * ntfsimage support. --- TODO | 1 - backup/backuplib.pl | 28 ++++++++++++++++++---------- backup/checkallused | 37 ++++++++++++++++++++++++++++--------- backup/full | 3 +-- backup/increm | 1 + backup/iwjbackup.txt | 7 +++++-- debian/changelog | 1 + 7 files changed, 54 insertions(+), 24 deletions(-) diff --git a/TODO b/TODO index bcf52f9..6a5197f 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ BACKUP ====== -devices as well as mountpoints read/writebuffer buggy ? would be nice someday diff --git a/backup/backuplib.pl b/backup/backuplib.pl index 1163b5a..50cc70a 100644 --- a/backup/backuplib.pl +++ b/backup/backuplib.pl @@ -144,26 +144,31 @@ sub readfsys ($) { sub parsefsys () { my ($dopts,$dopt); if ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)$#) { - # Line of form '/file/system dumptype[,options]' + # Line of form '[/device:]/file/system dumptype[,options]' $atf= $1; $tm= $2; $dopts= $3; $prefix= ''; + $pcstr= ''; stat $atf or die "stat $atf: $!"; -d _ or die "not a dir: $atf"; $rstr= ''; } elsif ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)\s+(\w+)$#) { - # Line of form '/file/system dumptype[,options] prefix' + # Line of form '[/device:]/file/system dumptype[,options] prefix' # (used for remote backups) $atf= $1; $tm= $2; $dopts= $3; $prefix= $4; + $pcstr= "$prefix:"; defined($prefix{$prefix}) or die "prefix $prefix in $tf ?\n"; $rstr= $prefix{$prefix}.' '; } else { die "fsys $tf ?"; } + + $dev = $atf =~ s,^(.*)\:,, ? $1 : ''; + undef %dopt; foreach $dopt (split /\,/,$dopts) { if (grep { $dopt eq $_ } qw(gz)) { @@ -175,14 +180,17 @@ sub parsefsys () { } } - if ($dopt{'gz'} eq 'y') { - $gz= '1'; - } elsif ($dopt{'gz'} =~ m/^\d$/) { - $gz= $dopt{'gz'}; - } elsif (defined $dopt{'gz'}) { - die "$tf bad gz"; - } else { - $gz= 0; + my ($gzo); + foreach $gzo (qw(gz gzi)) { + if ($dopt{$gzo} eq 'y') { + $$gzo= '1'; + } elsif ($dopt{$gzo} =~ m/^\d$/) { + $$gzo= $dopt{$gzo}; + } elsif (defined $dopt{$gzo}) { + die "$tf bad $gzo"; + } else { + $$gzo= ''; + } } } diff --git a/backup/checkallused b/backup/checkallused index fac60a9..953f136 100755 --- a/backup/checkallused +++ b/backup/checkallused @@ -56,16 +56,23 @@ while (!defined $tapedone{$tape}) { $tape= $next; } +proc checkdevspec ($$$) { + my ($atf,$devspec,$why); + push @{ $devspec{$atf}{$devspec} }, $why; +} + for $fsg (sort keys %fsgdone) { print "filesystem group $fsg: ".join(' ',@{$fsgdone{$fsg}}).":\n "; @fsys= (); readfsys($fsg); for $tf (@fsys) { parsefsys(); - $pstr= $prefix ne '' ? "$prefix:$atf" : $atf; + $pstr= "$pcstr$atf"; &e("dumped twice ($backed{$pstr}, $fsg): $pstr") if defined $backed{$pstr}; $backed{$pstr}= $fsg; + checkdevspec($pstr,"$pcstr$dev","filesystem group $fsg") + if length $dev; print " $pstr"; } print "\n"; @@ -76,8 +83,9 @@ print "incremental group:\n "; readfsys('all'); for $tf (@fsys) { parsefsys(); - $pstr= $prefix ne '' ? "$prefix:$atf" : $atf; + $pstr= "$pcstr$atf"; $incrd{$pstr}= $fsg; + checkdevspec($pstr,"$pcstr$dev","incremental group") if length $dev; print " $pstr"; } print "\n"; @@ -89,21 +97,22 @@ for $pfx ('', sort keys %prefix) { $cmd= "$rstr $dfstr"; open X, "$cmd |" or die $!; $_= ; m/^Filesystem/ or die "$cmd => $_ ?"; - $ppstr= length($pfx) ? $pfx : ''; - $pstr= length($pfx) ? "$pfx:" : ''; - print "mount points: $ppstr:"; + $prefix= length($pfx) ? $pfx : ''; + $pcstr= length($pfx) ? "$pfx:" : ''; + print "mount points: $prefix:"; while () { chomp; next if m,^procfs\s,; m,^/dev/(\S+)\s.*\s(/\S*)\s*$, or die "$_ ?"; ($dev,$mp) = ($1,$2); - $mounted{"$pstr$mp"}="$pstr$dev"; print " $1-$2"; - if (defined($backto= $backed{"$pstr$mp"})) { + checkdevspec("$pcstr$imp","$pcstr/dev/$dev","df"); + $mounted{"$pcstr$mp"}="$pcstr$dev"; print " $1-$2"; + if (defined($backto= $backed{"$pcstr$mp"})) { if (m,^/dev/\S+\s+\d+\s+(\d+)\s,) { $usedkb{$backto} += $1; } else { $usedkb{$backto} += 0; - $unkkb{$backto} .= " + $pstr$mp"; + $unkkb{$backto} .= " + $prefix:$mp"; } } } @@ -115,6 +124,14 @@ foreach $fsg (keys %usedkb) { print "filesystem group $fsg: $usedkb{$fsg} 1K-blocks$unkkb{$fsg}\n"; } +foreach $dsk (keys $devspec) { + if (@{ $devspec{$dsk} } != 1) { + foreach $devspec @{ $devspec{$dsk} } { + &e("inconsistent devices for $dsk: $devspec"); + } + } +} + # We check that all mounted filesystems are dumped and all # filesystems to be dumped are mounted. The expected-diffs # config file allows us to make exceptions. @@ -150,7 +167,9 @@ for (;;) { for $fs (sort keys %backed) { length($mounted{$fs}) || &e("dumped ($backed{$fs}), not a mount point: $fs"); } for $fs (sort keys %incrd) { length($mounted{$fs}) || &e("increm'd ($incrd{$fs}), not a mount point: $fs"); } -for $fs (sort keys %mounted) { length($backed{$fs}) || &e("mount point ($mounted{$fs}), not dumped: $fs"); } +for $fs (sort keys %mounted) { + next if $backed{$fs} + length($backed{$fs}) || &e("mount point ($mounted{$fs}), not dumped: $fs"); } for $fs (sort keys %mounted) { length($incrd{$fs}) || &e("mount point ($mounted{$fs}), not increm'd: $fs"); } $emsg.= "configuration ok\n" unless $e; diff --git a/backup/full b/backup/full index ddd15ce..c25f2d0 100755 --- a/backup/full +++ b/backup/full @@ -214,8 +214,7 @@ for $tf (@fsys) { $dumpcmd = "afio -b $softblocksizebytes -Zo -"; $dumpin = '<&FINDOR'; } elsif ($tm eq 'ntfsimage') { -# fixme have to find device rather than mountpoint (atf is mountpoint) - $dumpcmd= "ntfsimage -vvf --dirty $atf"; + $dumpcmd= "ntfsimage -vvf --dirty $dev"; } else { die "unknown method $tm for $prefix:$atf\n"; } diff --git a/backup/increm b/backup/increm index e3037e8..9bad0f1 100755 --- a/backup/increm +++ b/backup/increm @@ -98,6 +98,7 @@ for $tf (@fsys) { pipe(DUMPOR,DUMPOW) or die $!; pipe(BUFOR,BUFOW) or die $!; + $gz= $gzi if length $gzi; if ($gz) { $bufir='GZOR'; pipe(GZOR,GZOW) or die $!; diff --git a/backup/iwjbackup.txt b/backup/iwjbackup.txt index 9c39ab7..5de4276 100644 --- a/backup/iwjbackup.txt +++ b/backup/iwjbackup.txt @@ -69,9 +69,12 @@ volumes, requires device name). Only `dump' type backups perform incremental backups. is a comma-separated list of