chiark / gitweb /
As found on chiark in /usr/local/lib/backup: better tapeid/tapedesc handling; added...
[chiark-utils.git] / backup / full
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 print "Configuration check ...\n" or die $!;
12 system 'checkallused'; $? and die $?;
13
14 printdate();
15
16 unlink 'TAPEID';
17 system "mt -f $tape rewind"; $? and die $?;
18 system "mt -f $tape setblk $blocksizebytes"; $? and die $?;
19 system "dd if=$tape bs=${blocksize}b count=10 | tar -b$blocksize -vvxf - TAPEID";
20
21 setstatus "FAILED during startup";
22
23 if (open T, "TAPEID") {
24     unlink 'really-TAPEID';
25 } elsif (open T, "really-TAPEID") {
26 } else {
27     die "No TAPEID.\n";
28 }
29
30 chomp($tapeid= <T>);
31 $tapeid =~ m/[^0-9a-zA-Z]/ and die "Bad TAPEID ($&).\n";
32 $tapeid =~ m/[0-9a-zA-Z]/ or die "Empty TAPEID.\n";
33 close T;
34
35 setstatus "FAILED at tape identity check";
36
37 if (open L, "last-tape") {
38     chomp($lasttape= <L>);
39     close L;
40 } else {
41     undef $lasttape;
42 }
43
44 die "Tape $tapeid same as last time.\n" if $tapeid eq $lasttape;
45
46 if (defined($tapedesc= readlink "$etc/tape.$tapeid")) {
47     $tapedesc =~ s/^.*\.//;
48     $tapedesc .= "($tapeid)";
49 } else {
50     $tapedesc = $tapeid;
51 }
52
53 undef $fsys;
54 open D, "$etc/tape.$tapeid" or die "Unknown tape $tapeid ($!).\n";
55 for (;;) {
56     $_= <D> or die; chomp; s/\s+$//;
57     last if m/^end$/;
58     next unless m/\S/;
59     next if m/^\#/;
60     if (m/^filesystems (\w+)$/) {
61         $fsys= $1;
62     } elsif (m/^next (\w+)$/) {
63         $next= $1;
64     } elsif (m/^incremental$/) {
65         $incremental= 1;
66     } else {
67         die "unknown entry in tape $tapeid at line $.: $_\n";
68     }
69 }
70 close D or die $!;
71
72 if ($incremental) {
73     die "incremental tape $tapeid has next or filesystems\n"
74         if defined($next) || defined($fsys);
75     print STDERR "Incremental tape $tapeid.\n\n";
76     setstatus "FAILED during incremental startup";
77     exec "increm",$tapeid,$tapedesc;
78     die $!;
79 }
80
81 readfsys("$fsys");
82 openlog();
83
84 $doing= "dump of $fsys to tape $tapedesc in drive $tape";
85 print LOG "$doing:\n" or die $!;
86
87 open T, ">TAPEID" or die $!;
88 print T "$tapeid\n$tapedesc\n" or die $!;
89 close T or die $!;
90
91 system "tar -b$blocksize -vvcf TAPEID.tar TAPEID"; $? and die $?;
92 system "dd if=TAPEID.tar of=$ntape bs=${blocksize}b count=10"; $? and die $?;
93
94 unlink 'this-md5sums';
95
96 print "Doing $doing ...\n" or die $!;
97
98 unlink 'p';
99 system 'mknod p p'; $? and die $?;
100
101 setstatus "FAILED during dump";
102
103 sub closepipes () {
104     close(DUMPOR); close(TEEOR); close(BUFOR); close(FINDOR);
105     close(DUMPOW); close(TEEOW); close(BUFOW); close(FINDOW);
106 }
107
108 for $tf (@fsys) {
109     printdate();
110     pipe(FINDOR,FINDOW) or die $!;
111     pipe(DUMPOR,DUMPOW) or die $!;
112     pipe(TEEOR,TEEOW) or die $!;
113     pipe(BUFOR,BUFOW) or die $!;
114     parsefsys();
115     if ($tm eq 'dump') {
116         $dumpcmd= "dump 0bfu $softblocksizekb - $atf";
117         $dumpin= '</dev/null';
118     } else {
119         startprocess '</dev/null','>&FINDOW',$rstr."find $atf -xdev -noleaf -print0";
120         $dumpcmd= "cpio -Hustar -o0C$softblocksizebytes";
121         $dumpin= '<&FINDOR';
122     }
123     startprocess '<p','>>this-md5sums','md5sum';
124     startprocess $dumpin,'>&DUMPOW',$rstr.$dumpcmd;
125     startprocess '<&DUMPOR','>&TEEOW','tee p';
126     startprocess '<&TEEOR','>&BUFOW','writebuffer';
127     startprocess '<&BUFOR','>/dev/null'
128         ,"dd ibs=$softblocksizebytes obs=$blocksizebytes of=$ntape";
129     closepipes();
130     endprocesses();
131 }
132
133 setstatus "FAILED during check";
134
135 system "mt -f $tape rewind"; $? and die $?;
136 system "mt -f $ntape fsf 1"; $? and die $?;
137
138 open S,"this-md5sums" or die $!;
139 for $tf (@fsys) {
140     printdate();
141     chomp($orgsum= <S>);
142     $orgsum =~ m/^[0-9a-fA-F]{32}$/i or die "orgsum \`$orgsum' ?";
143     chomp($csum= `readbuffer <$ntape | md5sum`);
144     $orgsum eq $csum or die "MISMATCH $tf $csum $orgsum\n";
145     print "checksum ok $csum\t$tf\n" or die $!;
146     print LOG "checksum ok $csum\t$tf\n" or die $!;
147 }
148 printdate();
149 system "mt -f $tape rewind"; $? and die $?;
150
151 setstatus "FAILED during cleanup";
152
153 open IAN,">increm-advance.new" or die $!;
154 print IAN "1\n" or die $!;
155 close IAN or die $!;
156
157 open TN,">next-full.new" or die $!;
158 print TN "$next\n" or die $!;
159 close TN or die $!;
160
161 unlink 'last-tape','next-full';
162 rename 'TAPEID','last-tape' or die $!;
163 rename 'this-md5sums',"md5sums.$fsys" or die $!;
164 rename 'log',"log.$fsys" or die $!;
165 rename 'next-full.new',"next-full" or die $!;
166 rename 'increm-advance.new',"increm-advance" or die $!;
167
168 print "$doing completed.\nNext dump tape is $next.\n" or die $!;
169
170 setstatus "Successful: $tapedesc $fsys, next $next";
171 exit 0;