X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=bin%2FBackupPC_burnArchiveCLI;h=d149834fe03ae065202df7f5c27760ba0a5ce0a2;hb=bb7a9cdb3a49dc29ffc2161da05956b53681a509;hp=4c029c1308a07cc3f1bae79ed6282fc182e3717a;hpb=cc69bd9efd1cfb510eeb3739ff47436a3a6d1f09;p=BackupPC.git diff --git a/bin/BackupPC_burnArchiveCLI b/bin/BackupPC_burnArchiveCLI index 4c029c1..d149834 100755 --- a/bin/BackupPC_burnArchiveCLI +++ b/bin/BackupPC_burnArchiveCLI @@ -16,7 +16,7 @@ use Data::Dumper; my $debug = 0; # set this to 1 to prompt for DVD removal for each selected item. -my $prompt_for_delete = 0; +my $prompt_for_delete = shift @ARGV; $|=1; # don't check for user @@ -111,6 +111,8 @@ sub dumpArchive2XML($$$) AND hosts.id=backups.hostid AND shares.id=backups.shareid AND archive_backup.archive_id = ? + ORDER BY + hosts.name, shares.name, backups.num }; my $sth = $dbh->prepare("SELECT dvd_nr, total_size, note, username, date,id FROM archive WHERE dvd_nr=?"); @@ -164,7 +166,7 @@ sub dumpArchive2XML($$$) $writer->endTag("file"); } $writer->endTag("backup"); - } + } $writer->endTag("archive"); $writer->end(); @@ -276,8 +278,13 @@ sub delete_dvd($) { # remove files for this DVD map { - print "\tremoving $_\n"; - unlink($_) || die "can't rm $_: $!"; + if (-d $_) { + print "\tremoving dir $_\n"; + rmtree($_) || die "can't rmtree $_: $!"; + } else { + print "\tremoving $_\n"; + unlink($_) || die "can't rm $_: $!"; + } } glob ( "/$iso_dir/$dvd_nr.*" ); $dbh->commit; @@ -310,6 +317,15 @@ my $sth_archive_backup_parts = $dbh->prepare( qq{ order by archive_backup.backup_id, backup_parts.part_nr }); +my $sth_archive_backup_check = $dbh->prepare( qq{ + SELECT + count(backups.id) + FROM backups + JOIN archive_backup on archive_backup.backup_id = backups.id + JOIN archive on archive_id = archive.id + WHERE dvd_nr = ? +}); + my $sth_archive_burned = $dbh->prepare( qq{ insert into archive_burned (archive_id, iso_size, part, copy) @@ -330,9 +346,21 @@ foreach my $arc (@archives_to_burn) { $sth_archive_backup_parts->execute($dvd_nr); + $sth_archive_backup_check->execute($dvd_nr); + + my ($parts_nr, $check_nr) = ($sth_archive_backup_parts->rows, $sth_archive_backup_check->fetchrow_array); + + if ($parts_nr != $check_nr) { + warn "ERROR: DVD #$dvd_nr is still not inconsistent state. Some backup parts are ", + ($parts_nr < $check_nr) ? "missing ($parts_nr < $check_nr)" : "extra ($parts_nr > $check_nr)", + " you should re-create this DVD after BackupPC_incPartsUpdate finish\n"; + delete_dvd( $dvd_nr ); + next; + } + if ($sth_archive_backup_parts->rows == 0) { warn "ERROR: no backup parts found for $dvd_nr. You should re-create that DVD.\n"; - delete_dvd( $dvd_nr ); + next if delete_dvd( $dvd_nr ); } if ($prompt_for_delete) { @@ -499,6 +527,8 @@ print "Recoding finished, exiting...\n"; $sth->finish; $sth_archive_backup_parts->finish; $sth_archive_burned->finish; +$sth_archive_backup_check->finish; +$sth_archive_burned->finish; $dbh->disconnect;