X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=bin%2FBackupPC_incPartsUpdate;h=72a5ba0cfc723b29d949cb19cf5bcfb4c3dd8283;hb=59947f8fa8af3769b99faa2cbd5c4ea6e7acf666;hp=3971f7e09f48edaa76252cfcc6125327b734971b;hpb=b831beaa8b6d40bf9c261cac8b5a2b49a214001b;p=BackupPC.git diff --git a/bin/BackupPC_incPartsUpdate b/bin/BackupPC_incPartsUpdate index 3971f7e..72a5ba0 100755 --- a/bin/BackupPC_incPartsUpdate +++ b/bin/BackupPC_incPartsUpdate @@ -16,6 +16,58 @@ use Archive::Tar::Streamed; use Algorithm::Diff; use Getopt::Std; use File::Slurp; +use File::Pid; + +=head1 NAME + +BackupPC_incPartsUpdate + +=head1 DESCRIPTION + +Create C<.tar.gz> increments on disk calling C. + +Following options are supported (but all are optional): + +=over 4 + +=item -h hostname + +Update parts for just single C + +=item -c + +Force check for tar archives which exist on disk + +=item -d + +Turn debugging output + +=back + +=cut + +my %opt; +getopts("cdh:", \%opt ); + +my $debug = $opt{d}; +my $check = $opt{c} && print STDERR "NOTICE: tar archive check forced\n"; + +my $pid_path = abs_path($0); +$pid_path =~ s/\W+/_/g; + +my $pidfile = new File::Pid({ + file => "/tmp/$pid_path", +}); + +if (my $pid = $pidfile->running ) { + die "$0 already running: $pid\n"; +} elsif ($pidfile->pid ne $$) { + $pidfile->remove; + $pidfile = new File::Pid; +} + +print STDERR "$0 using pid ",$pidfile->pid," file ",$pidfile->file,"\n"; +$pidfile->write; my $bpc = BackupPC::Lib->new || die "can't create BackupPC::Lib"; my %Conf = $bpc->Conf(); @@ -34,12 +86,6 @@ foreach my $c (qw/gzip md5sum/) { $bin->{$c} = which($c) || die "$0 needs $c, install it\n"; } -my %opt; -getopts("cd", \%opt ); - -my $debug = $opt{d}; -my $check = $opt{c} && print STDERR "NOTICE: tar archive check forced\n"; - $|=1; my $start_t = time(); @@ -84,7 +130,7 @@ sub get_backup_id($$$) { FROM backups INNER JOIN shares ON backups.shareID=shares.ID INNER JOIN hosts ON backups.hostID = hosts.ID - where hosts.name = ? and shares.name = ? and backups.num = ? + WHERE hosts.name = ? and shares.name = ? and backups.num = ? }); $sth->execute($host, $share, $num); my ($id) = $sth->fetchrow_array; @@ -96,6 +142,15 @@ sub get_backup_id($$$) { return $id; } +sub backup_inc_deleted($) { + my $backup_id = shift; + my $sth_inc_deleted = $dbh->prepare(qq{ + update backups set + inc_deleted = true + where id = ? + }); + $sth_inc_deleted->execute($backup_id); +} sub tar_check($$$$) { my ($host,$share,$num,$filename) = @_; @@ -228,13 +283,7 @@ sub tar_check($$$$) { print ", EMPTY tar\n"; my $backup_id = get_backup_id($host, $share, $num); - - my $sth_inc_deleted = $dbh->prepare(qq{ - update backups set - inc_deleted = true - where id = ? - }); - $sth_inc_deleted->execute($backup_id); + backup_inc_deleted( $backup_id ); $dbh->commit; @@ -245,7 +294,7 @@ sub tar_check($$$$) { # real tar size is bigger because of padding if ($tar_size_inarc > $tar_size) { - print ", size of files in tar bigger than whole tar!\n"; + print ", size of files in tar ($tar_size_inarc) bigger than whole tar ($tar_size)!\n"; return 0; } @@ -332,13 +381,17 @@ select hosts.name as host, shares.name as share, backups.num as num, + backups.date, inc_size, - parts + parts, + count(backup_parts.backup_id) as backup_parts from backups join shares on backups.hostid = shares.hostid and shares.id = backups.shareid join hosts on shares.hostid = hosts.id -where not inc_deleted + full outer join backup_parts on backups.id = backup_parts.backup_id +where not inc_deleted and backups.size > 0 +group by backups.id, hosts.name, shares.name, backups.num, backups.date, inc_size, parts, backup_parts.backup_id order by backups.date } ); @@ -347,8 +400,17 @@ $sth->execute(); my $num_backups = $sth->rows; my $curr_backup = 1; +if ($opt{h}) { + warn "making increments just for host $opt{h}\n"; +} + while (my $row = $sth->fetchrow_hashref) { + if ($opt{h} && $row->{host} ne $opt{h}) { + warn "skipped $row->{host}\n" if ($debug); + next; + } + $curr_backup++; my $tar_file = BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'}); @@ -358,7 +420,7 @@ while (my $row = $sth->fetchrow_hashref) { print "# size: $size backup.size: ", $row->{inc_size},"\n" if ($opt{d}); - if ( $row->{'inc_size'} != -1 && $size != -1 && $row->{'inc_size'} >= $size) { + if ( $row->{'inc_size'} != -1 && $size != -1 && $row->{'inc_size'} >= $size && $row->{parts} == $row->{backup_parts}) { if ($check) { tar_check($row->{'host'}, $row->{'share'}, $row->{'num'}, $tar_file) && next; } else { @@ -366,16 +428,18 @@ while (my $row = $sth->fetchrow_hashref) { } } - print curr_time, " creating $curr_backup/$num_backups ", $row->{'host'}, ":", $row->{'share'}, " #", $row->{'num'}, " -> $tar_file"; + print curr_time, " creating $curr_backup/$num_backups ", $row->{host}, ":", $row->{share}, " #", $row->{num}, + " ", strftime('%Y-%m-%d', localtime($row->{date})), " -> $tar_file"; my $t = time(); # re-create archive? - my $cmd = qq{ $tarIncCreate -h "$row->{'host'}" -s "$row->{'share'}" -n $row->{'num'} -f }; + my $cmd = qq[ $tarIncCreate -h "$row->{host}" -s "$row->{share}" -n $row->{num} -f ]; print STDERR "## $cmd\n" if ($debug); if (system($cmd) != 0) { - print STDERR " FAILED"; + print STDERR " FAILED, marking this backup deleted"; + backup_inc_deleted( $row->{backup_id} ); } print ", dur: ",fmt_time(time() - $t), "\n";