chiark / gitweb /
Found on anarres in /etc.
[chiark-utils.git] / backup / checkallused
1 #!/usr/bin/perl
2
3 BEGIN {
4     $etc= '/etc/backup';
5     require "$etc/settings.pl";
6     require 'backuplib.pl';
7 }
8
9 $|=1;
10
11 open X,'last-tape' or die $!;
12 chomp($tape= <X>);
13 close X or die $!;
14
15 while (!defined $tapedone{$tape}) {
16     open X,"$etc/tape.$tape" or die "$tape $!";
17     $fsg=''; $next='';
18     for (;;) {
19         $_= <X> or die $1; chomp; s/\s*$//;
20         last if m/^end$/;
21         next unless m/\S/;
22         next if m/^\#/;
23         if (m/^filesystems (\w+)$/) { $fsg= $1; }
24         elsif (m/^next (\w+)$/) { $next=$1; }
25         else { die "$tape $_ ?"; }
26     }
27     length $fsg or die "$tape $!";
28     length $next or die "$tape $!";
29     push @{$fsgdone{$fsg}}, $tape;
30     $tapedone{$tape}=1;
31     $tape= $next;
32 }
33
34 for $fsg (sort keys %fsgdone) {
35     print "filesystem group $fsg: ".join(' ',@{$fsgdone{$fsg}}).":\n ";
36     @fsys= ();
37     readfsys($fsg);
38     for $tf (@fsys) {
39         parsefsys();
40         $pstr= $prefix ne '<local>' ? "$prefix:$atf" : $atf;
41         &e("dumped twice ($backed{$pstr}, $fsg): $pstr")
42             if defined $backed{$pstr};
43         $backed{$pstr}= $fsg;
44         print " $pstr";
45     }
46     print "\n";
47 }
48
49 print "incremental group:\n ";
50 @fsys= ();
51 readfsys('all');
52 for $tf (@fsys) {
53     parsefsys();
54     $pstr= $prefix ne '<local>' ? "$prefix:$atf" : $atf;
55     $incrd{$pstr}= $fsg;
56     print " $pstr";
57 }
58 print "\n";
59
60 for $pfx ('', sort keys %prefix) {
61     $rstr= length($pfx) ? $prefix{$pfx}.' ' : '';
62     $dfstr= exists($prefixdf{$pfx}) ? $prefixdf{$pfx} :
63         'df --no-sync -xiso9660 -xnfs -xproc';
64     $cmd= "$rstr $dfstr";
65     open X, "$cmd |" or die $!;
66     $_= <X>; m/^Filesystem/ or die "$cmd => $_ ?";
67     $ppstr= length($pfx) ? $pfx : '<local>';
68     $pstr= length($pfx) ? "$pfx:" : '';
69     print "mount points: $ppstr:";
70     while (<X>) {
71         chomp;
72         next if m,^procfs\s,;
73         m,^/dev/(\S+)\s.*\s(/\S*)\s*$, or die "$_ ?";
74         ($dev,$mp) = ($1,$2);
75         $mounted{"$pstr$mp"}="$pstr$dev"; print " $1-$2";
76         if (defined($backto= $backed{"$pstr$mp"})) {
77             if (m,^/dev/\S+\s+\d+\s+(\d+)\s,) {
78                 $usedkb{$backto} += $1;
79             } else {
80                 $usedkb{$backto} += 0;
81                 $unkkb{$backto} .= " + $pstr$mp";
82             }
83         }
84     }
85     print "\n";
86     $!=0; close(X); $? and die "$cmd $? $!";
87 }
88
89 foreach $fsg (keys %usedkb) {
90     print "filesystem group $fsg: $usedkb{$fsg} 1K-blocks$unkkb{$fsg}\n";
91 }
92
93 open Z,"$etc/expected-diffs" or die $!;
94 for (;;) {
95     $_= <Z> or die; chomp; s/\s*$//;
96     last if m/^end$/;
97     next unless m/^\S/;
98     next if m/^\#/;
99     if (s/^\!//) {
100         &e("expected not to be dumped, but not a mount point: $_")
101             unless defined($mounted{$_});
102         print "filesystem expected not to be dumped: $_\n";
103         delete $mounted{$_};
104     } else {
105         &e("non-filesystem expected to be dumped is mounted: $_ on $mounted{$_}")
106             if defined($mounted{$_});
107         $mounted{$_}= 'expected-diffs';
108         print "non-filesystem expected to be dumped: $_\n";
109     }
110 }
111     
112 for $fs (sort keys %backed) { length($mounted{$fs}) || &e("dumped ($backed{$fs}), not a mount point: $fs"); }
113 for $fs (sort keys %incrd) { length($mounted{$fs}) || &e("increm'd ($incrd{$fs}), not a mount point: $fs"); }
114 for $fs (sort keys %mounted) { length($backed{$fs}) || &e("mount point ($mounted{$fs}), not dumped: $fs"); }
115 for $fs (sort keys %mounted) { length($incrd{$fs}) || &e("mount point ($mounted{$fs}), not increm'd: $fs"); }
116
117 $emsg.= "configuration ok\n" unless $e;
118 print STDERR $emsg;
119 exit($e);
120
121 sub e { $emsg.="** @_\n"; $e=1; }