X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=backup%2Fbackuplib.pl;h=43df710c740b796adc1b16930798351c99250041;hp=783b14d50bf6d298ef0b62400f7ebc53a6793d8b;hb=43243a5c7e4fd609b1a10b700b6bab322930eb71;hpb=314a202a6f4e0a120fd982ad0398cdf507d6219d diff --git a/backup/backuplib.pl b/backup/backuplib.pl index 783b14d..43df710 100644 --- a/backup/backuplib.pl +++ b/backup/backuplib.pl @@ -43,8 +43,7 @@ sub setstatus ($) { # used to implement the funky pipeline stuff. sub startprocess ($$$) { my ($i,$o,$c) = @_; - print LOG " $c\n" or die $!; - print " $c\n" or die $!; + pboth(" $c\n"); defined($p= fork) or die $!; if ($p) { $processes{$p}= $c; return; } open STDIN,"$i" or die "$c stdin $i: $!"; @@ -54,7 +53,7 @@ sub startprocess ($$$) { } sub rewind_raw () { - system "mt -f $tape rewind"; $? and die $?; + runsystem("mt -f $tape rewind"); } sub readtapeid_raw () { @@ -66,6 +65,12 @@ sub readtapeid_raw () { "| tar -b$blocksize -vvxf - TAPEID"; } +sub runsystem ($) { + pboth(" $_[0]\n"); + system $_[0]; + $? and die $?; +} + sub pboth ($) { my ($str) = @_; print LOG $str or die $!; @@ -76,7 +81,7 @@ sub nexttapefile ($) { my ($what) = @_; $currenttapefilenumber++; $currenttapefilename= $what; - pboth(sprintf "writing tape file #%d (mt fsf %d): %s", + pboth(sprintf "writing tape file #%d (mt fsf %d): %s\n", $currenttapefilenumber, $currenttapefilenumber-1, $what); } @@ -131,6 +136,8 @@ sub readfsysfile ($) { $prefix{$1}= $2; } elsif (m/^prefix\-df\s+(\w+)\s+(\S.*\S)$/) { $prefixdf{$1}= $2; + } elsif (m/^snap(?:\=(\w+))?\s+(\w+)\s+(\w+)$/) { + push @excldir,$1; } elsif (m/^excludedir\s+(\S.*\S)$/) { push @excldir,$1; } elsif (m/^exclude\s+(\S.*\S)$/) { @@ -166,8 +173,6 @@ sub parsefsys () { $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 '[/device:]/file/system dumptype[,options] prefix' @@ -183,13 +188,25 @@ sub parsefsys () { die "fsys $tf ?"; } + $fsidstr= $pcstr.$atf; + $fsidstr =~ s/[,+]/+$&/g; + $fsidstr =~ s#/#,#g; + $fsidfile= "/var/lib/chiark-backup/incstamp,$fsidstr"; + $dev = $atf =~ s,^(.*)\:,, ? $1 : ''; + if (!length $pcstr) { + stat $atf or die "stat $atf: $!"; + -d _ or die "not a dir: $atf"; + } + undef %dopt; foreach $dopt (split /\,/,$dopts) { - if (grep { $dopt eq $_ } qw(gz)) { + if (grep { $dopt eq $_ } qw(gz noinc)) { $dopt{$dopt}= 'y'; - } elsif ($dopt =~ m/\=/ && grep { $` eq $_ } qw(gz)) { + } elsif (grep { $dopt eq $_ } qw(snap)) { + $dopt{$dopt}= $dopt; + } elsif ($dopt =~ m/\=/ && grep { $` eq $_ } qw(gz snap)) { $dopt{$`}= $'; } elsif (length $dopt) { die "unknown option $dopt (in $dopts $tf)"; @@ -208,6 +225,50 @@ sub parsefsys () { $$gzo= ''; } } + + if (length $dopt{'snap'}) { + length $dev or die "$pcstr:$atf no device but needed for snap"; + } +} + +sub execute ($) { + pboth(" $_[0]\n"); + system $_[0]; $? and die "$_[0] $?"; +} + +sub prepfsys () { + $dev_print= $dev; + $atf_print= $atf; + + if (length $dopt{'snap'}) { + + system('snap-drop'); $? and die $?; + + $snapscripts= '/etc/chiark-backup/snap'; + $snapbase= "$rstr $snapscripts/$dopt{'snap'}"; + $snapargs= "/var/lib/chiark-backup"; + + $snapsnap= "$snapbase snap $snapargs $dev $atf"; + $snapdrop= "$snapbase drop $snapargs"; + + open SD, ">snap-drop.new" or die $!; + print SD $snapdrop,"\n" or die $!; + close SD or die $!; + rename "snap-drop.new","snap-drop" or die $!; + + execute($snapsnap); + + $dev_nosnap= $dev; + $atf_nosnap= $atf; + $dev= "/var/lib/chiark-backup/snap-device"; + $atf= "/var/lib/chiark-backup/snap-mount"; + } +} + +sub finfsys () { + if (length $dopt{'snap'}) { + system('snap-drop'); $? and die $?; + } } sub openlog () {