projects
/
BackupPC.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
make check_archive transactionally safe
[BackupPC.git]
/
bin
/
BackupPC_ASA_PostArchive_Update
diff --git
a/bin/BackupPC_ASA_PostArchive_Update
b/bin/BackupPC_ASA_PostArchive_Update
index
3ffb763
..
e3d022d
100755
(executable)
--- a/
bin/BackupPC_ASA_PostArchive_Update
+++ b/
bin/BackupPC_ASA_PostArchive_Update
@@
-120,6
+120,13
@@
my $sth_inc_size = $dbh->prepare(qq{
where id = ?
});
where id = ?
});
+sub read_only {
+ my $full = shift;
+ my $perm = (stat $full)[2] & 0444;
+ warn sprintf("chmod %03o %s\n",$perm,$full);
+ chmod $perm, $full || die $!;
+}
+
sub check_archive {
my ($host,$num) = @_;
warn "# check_archive $host $num";
sub check_archive {
my ($host,$num) = @_;
warn "# check_archive $host $num";
@@
-140,8
+147,12
@@
sub check_archive {
my $md5_path = "$Conf{ArchiveDest}/$host.$num.md5";
unlink $md5_path if -s $md5_path == 0; # fix empty
my $md5_path = "$Conf{ArchiveDest}/$host.$num.md5";
unlink $md5_path if -s $md5_path == 0; # fix empty
+ my $read_protect = 0;
+
if ( ! -e $md5_path ) {
system_ok "cd $Conf{ArchiveDest} && /usr/bin/md5sum $host.$num.* > $md5_path";
if ( ! -e $md5_path ) {
system_ok "cd $Conf{ArchiveDest} && /usr/bin/md5sum $host.$num.* > $md5_path";
+ read_only $md5_path;
+ $read_protect = 1;
} else {
system_ok "cd $Conf{ArchiveDest} && /usr/bin/md5sum -c $md5_path" if $opt->check;
}
} else {
system_ok "cd $Conf{ArchiveDest} && /usr/bin/md5sum -c $md5_path" if $opt->check;
}
@@
-150,6
+161,7
@@
sub check_archive {
foreach ( split(/\n/, read_file "$Conf{ArchiveDest}/$host.$num.md5" ) ) {
my ( $md5, $path ) = split(/\s+/,$_);
$md5sum->{$path} = $md5;
foreach ( split(/\n/, read_file "$Conf{ArchiveDest}/$host.$num.md5" ) ) {
my ( $md5, $path ) = split(/\s+/,$_);
$md5sum->{$path} = $md5;
+ read_only "$Conf{ArchiveDest}/$path" if $read_protect;
}
# depending on expected returned value this is used like:
}
# depending on expected returned value this is used like:
@@
-183,16
+195,16
@@
sub check_archive {
}
sub check_part {
}
sub check_part {
- my ($host, $num, $part_nr, $tar_size, $size, $md5, $items) = @_;
+ my ($host, $num, $part_nr, $tar_size, $size, $md5, $items
, $filename
) = @_;
my $backup_id = get_backup_id($host, $num);
my $sth_md5 = $dbh->prepare(qq{
select
my $backup_id = get_backup_id($host, $num);
my $sth_md5 = $dbh->prepare(qq{
select
- id, tar_size, size, md5, items
+ id, tar_size, size, md5, items
, filename
from backup_parts
from backup_parts
- where backup_id = ? and part_nr = ?
+ where backup_id = ? and part_nr = ?
and filename = ?
});
});
- $sth_md5->execute($backup_id, $part_nr);
+ $sth_md5->execute($backup_id, $part_nr
, $filename
);
if (my $row = $sth_md5->fetchrow_hashref) {
return if (
if (my $row = $sth_md5->fetchrow_hashref) {
return if (
@@
-212,12
+224,12
@@
sub check_archive {
tar_size,
size,
md5,
tar_size,
size,
md5,
- items
- ) values (?,?,?,?,?,?)
+ items,
+ filename
+ ) values (?,?,?,?,?,?,?)
});
});
- $sth_insert->execute($backup_id, $part_nr, $tar_size, $size, $md5, $items);
- $dbh->commit;
+ $sth_insert->execute($backup_id, $part_nr, $tar_size, $size, $md5, $items, $filename);
}
print " [parts: ",join(", ", @tar_parts),"]" if $opt->debug;
}
print " [parts: ",join(", ", @tar_parts),"]" if $opt->debug;
@@
-263,8
+275,8
@@
sub check_archive {
$items++;
$tar_size_inarc += $entry->size;
$items++;
$tar_size_inarc += $entry->size;
- if ($tar_size_inarc > $Conf{
MaxArchiveFile
Size}) {
- print ", part $filename is too big $tar_size_inarc > $Conf{
MaxArchiveFile
Size}\n";
+ if ($tar_size_inarc > $Conf{
ArchiveMedia
Size}) {
+ print ", part $filename is too big $tar_size_inarc > $Conf{
ArchiveMedia
Size}\n";
return 0;
}
return 0;
}
@@
-298,10
+310,10
@@
sub check_archive {
my $items = 1;
$part_nr++;
my $items = 1;
$part_nr++;
- check_part($host, $num, $part_nr, $tar_size, $size, $md5, $items);
+ check_part($host, $num, $part_nr, $tar_size, $size, $md5, $items
, $filename
);
# round increment size to 2k block size
# round increment size to 2k block size
- $inc_size += int((
$size + 2048) /
2048);
+ $inc_size += int((
($size + 2048) / 2048 ) *
2048);
}
$sth_inc_size->execute(
}
$sth_inc_size->execute(
@@
-309,7
+321,6
@@
sub check_archive {
$part_nr,
get_backup_id($host, $num),
);
$part_nr,
get_backup_id($host, $num),
);
- $dbh->commit;
@tar_files = sort @tar_files;
print "\n\t",($#tar_files + 1), " tar files";
@tar_files = sort @tar_files;
print "\n\t",($#tar_files + 1), " tar files";
@@
-353,6
+364,8
@@
sub check_archive {
print " ",($same ? 'ok' : 'DIFFERENT'),
", dur: ",fmt_time(time() - $t), "\n";
print " ",($same ? 'ok' : 'DIFFERENT'),
", dur: ",fmt_time(time() - $t), "\n";
+ $dbh->commit;
+
return $same;
}
return $same;
}
@@
-433,8
+446,6
@@
while (my $row = $sth->fetchrow_hashref) {
print ", dur: ",fmt_time(time() - $t), "\n";
print ", dur: ",fmt_time(time() - $t), "\n";
- $dbh->commit;
-
}
undef $sth;
}
undef $sth;