3 # check that the configuration is sane and backs up everything it should
5 # This file is part of chiark backup, a system for backing up GNU/Linux and
6 # other UN*X-compatible machines, as used on chiark.greenend.org.uk.
9 # Copyright (C) 1997-1998,2000-2001 Ian Jackson <ian@chiark.greenend.org.uk>
10 # Copyright (C) 1999 Peter Maydell <pmaydell@chiark.greenend.org.uk>
12 # This is free software; you can redistribute it and/or modify it under the
13 # terms of the GNU General Public License as published by the Free Software
14 # Foundation; either version 2, or (at your option) any later version.
16 # This is distributed in the hope that it will be useful, but WITHOUT ANY
17 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
21 # You should have received a copy of the GNU General Public License along
22 # with this program; if not, write to the Free Software Foundation, Inc.,
23 # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 # All filesystems must either be backed up in both full and
26 # incremental dumps or listed as exceptions.
29 $etc= '/etc/chiark-backup';
30 require "$etc/settings.pl";
31 require 'backuplib.pl';
36 open X,'last-tape' or die $!;
40 while (!defined $tapedone{$tape}) {
41 open X,"$etc/tape.$tape" or die "$tape $!";
44 $_= <X> or die $1; chomp; s/\s*$//;
48 if (m/^filesystems (\w+)$/) { $fsg= $1; }
49 elsif (m/^next (\w+)$/) { $next=$1; }
50 else { die "$tape $_ ?"; }
52 length $fsg or die "$tape $!";
53 length $next or die "$tape $!";
54 push @{$fsgdone{$fsg}}, $tape;
59 sub checkdevspec ($$$) {
60 my ($atf,$devspec,$why) = @_;
61 push @{ $devspec{$atf}{$devspec} }, $why;
64 for $fsg (sort keys %fsgdone) {
65 print "filesystem group $fsg: ".join(' ',@{$fsgdone{$fsg}}).":\n ";
71 &e("dumped twice ($backed{$pstr}, $fsg): $pstr")
72 if defined $backed{$pstr};
74 checkdevspec($pstr,"$pcstr$dev","filesystem group $fsg")
81 print "incremental group:\n ";
88 checkdevspec($pstr,"$pcstr$dev","incremental group") if length $dev;
93 for $pfx ('', sort keys %prefix) {
94 $rstr= length($pfx) ? $prefix{$pfx}.' ' : '';
95 $dfstr= exists($prefixdf{$pfx}) ? $prefixdf{$pfx} :
96 'df --no-sync -xiso9660 -xnfs -xproc';
98 open X, "$cmd |" or die $!;
99 $_= <X>; m/^Filesystem/ or die "$cmd => $_ ?";
100 $prefix= length($pfx) ? $pfx : '<local>';
101 $pcstr= length($pfx) ? "$pfx:" : '';
102 print "mount points: $prefix:";
105 next if m,^procfs\s,;
106 m,^/dev/(\S+)\s.*\s(/\S*)\s*$, or die "$_ ?";
107 ($dev,$mp) = ($1,$2);
108 checkdevspec("$pcstr$mp","$pcstr/dev/$dev","df");
109 $mounted{"$pcstr$mp"}="$pcstr$dev"; print " $1-$2";
110 if (defined($backto= $backed{"$pcstr$mp"})) {
111 if (m,^/dev/\S+\s+\d+\s+(\d+)\s,) {
112 $usedkb{$backto} += $1;
113 $countedkb{"$pcstr$mp"}++;
118 $!=0; close(X); $? and die "$? $!";
121 foreach $fsg (keys %usedkb) {
122 print "filesystem group $fsg: $usedkb{$fsg} 1K-blocks raw accounted\n";
125 foreach $fsg (keys %backed) {
126 next if $countedkb{$fsg};
127 print "unaccounted filesystem: $fsg\n";
130 foreach $dsk (keys %devspec) {
131 if (keys %{ $devspec{$dsk} } != 1) {
132 foreach $devspec (keys %{ $devspec{$dsk} }) {
133 &e("inconsistent devices for $dsk: $devspec (".
134 join(', ', @{ $devspec{$dsk}{$devspec} }).")");
139 # We check that all mounted filesystems are dumped and all
140 # filesystems to be dumped are mounted. The expected-diffs
141 # config file allows us to make exceptions.
143 # #expect disk2 to be mounted but not dumped
145 # # CD may or may not be mounted but should not be dumped in either case
148 open Z,"$etc/expected-diffs" or die $!;
150 $_= <Z> or die; chomp; s/\s*$//;
155 print "non-permanent filesystem expected not to be dumped: $_\n";
156 if (defined($mounted{$_})) {
160 &e("expected not to be dumped, but not a mount point: $_")
161 unless defined($mounted{$_});
162 print "filesystem expected not to be dumped: $_\n";
165 &e("non-filesystem expected to be dumped is mounted: $_ on $mounted{$_}")
166 if defined($mounted{$_});
167 $mounted{$_}= 'expected-diffs';
168 print "non-filesystem expected to be dumped: $_\n";
172 for $fs (sort keys %backed) { length($mounted{$fs}) || &e("dumped ($backed{$fs}), not a mount point: $fs"); }
173 for $fs (sort keys %incrd) { length($mounted{$fs}) || &e("increm'd ($incrd{$fs}), not a mount point: $fs"); }
174 for $fs (sort keys %mounted) { length($backed{$fs}) || &e("mount point ($mounted{$fs}), not dumped: $fs"); }
175 for $fs (sort keys %mounted) { length($incrd{$fs}) || &e("mount point ($mounted{$fs}), not increm'd: $fs"); }
177 $emsg.= "configuration ok\n" unless $e;
181 sub e { $emsg.="** @_\n"; $e=1; }