X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=bin%2FBackupPC_burnArchiveCLI;h=f8845d4f0e1ecfe0e792165a79702dab248c776e;hb=182d6a8e410d598dc9bcd719607f6b51a9f097b8;hp=8e8f0cb0e216439919f7f6a00b58f741bf631ca2;hpb=29a36e6be34960626ddbcdd72c31ce510a8542a0;p=BackupPC.git diff --git a/bin/BackupPC_burnArchiveCLI b/bin/BackupPC_burnArchiveCLI index 8e8f0cb..f8845d4 100755 --- a/bin/BackupPC_burnArchiveCLI +++ b/bin/BackupPC_burnArchiveCLI @@ -11,6 +11,7 @@ use POSIX qw/strftime/; use Term::Menus; use File::Which; use File::Path; +use Filesys::Df; use Data::Dumper; @@ -193,23 +194,29 @@ order by date asc $sth->execute(); +sub fmt_mb($) { + my $s = shift; + die "missing size" unless defined($s); + $s /= (1024*1024); + return sprintf("%.2f Mb", $s); +} + sub fmt_archive($) { my $row = shift || die; $row->{'date'} =~ s/\.\d+$//; $row->{'copies'} =~ s/^\s*0+\s*$/no/; - $row->{'total_size'} /= (1024*1024); my $copies = 'copies'; $copies = 'copy' if ($row->{'copies'} == 1); return - sprintf("%d by %s on %s, %s %s [%.2f Mb]", + sprintf("%d by %s on %s, %s %s [%s]", $row->{'dvd_nr'}, $row->{'username'}, $row->{'date'}, $row->{'copies'}, $copies, - $row->{'total_size'}, + fmt_mb($row->{'total_size'}), ); } @@ -332,71 +339,82 @@ my $sth_archive_burned = $dbh->prepare( qq{ values ( (select id from archive where dvd_nr =?), ?, ?, ?) }); -foreach my $arc (@archives_to_burn) { - exit if ($arc eq ']quit['); +my $copies = $Conf{BurnMultipleCopies} || 1; - my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/); - die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr); +foreach my $copy_nr ( 1 .. $copies ) { - my $tmp_dir = "/$iso_dir/$dvd_nr"; + foreach my $arc (@archives_to_burn) { + exit if ($arc eq ']quit['); - my $t = time(); + my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/); + die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr); - print "Working on DVD #$dvd_nr in $tmp_dir\n"; + my $tmp_dir = "/$iso_dir/$dvd_nr"; - $sth_archive_backup_parts->execute($dvd_nr); + my $t = time(); - $sth_archive_backup_check->execute($dvd_nr); + print "Working on DVD #$dvd_nr in $tmp_dir\n"; - my ($parts_nr, $check_nr) = ($sth_archive_backup_parts->rows, $sth_archive_backup_check->fetchrow_array); + $sth_archive_backup_parts->execute($dvd_nr); - 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; - } + $sth_archive_backup_check->execute($dvd_nr); - if ($sth_archive_backup_parts->rows == 0) { - warn "ERROR: no backup parts found for $dvd_nr. You should re-create that DVD.\n"; - next if delete_dvd( $dvd_nr ); - } + my ($parts_nr, $check_nr) = ($sth_archive_backup_parts->rows, $sth_archive_backup_check->fetchrow_array); - if ($prompt_for_delete) { - next if delete_dvd( $dvd_nr ); - } + 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; + } - my @volumes; - my $v; # emtpy volume - my $v_size = 0; + if ($sth_archive_backup_parts->rows == 0) { + warn "ERROR: no backup parts found for $dvd_nr. You should re-create that DVD.\n"; + next if delete_dvd( $dvd_nr ); + } - my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize"; - while (my $row = $sth_archive_backup_parts->fetchrow_hashref) { - if (($v->{size} || 0) + $row->{part_size} > $max_archive_size) { - push @volumes, $v; - $v = {}; + if ($prompt_for_delete) { + next if delete_dvd( $dvd_nr ); } - $v->{size} += $row->{part_size}; - # this part - my $p = { - filename => BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'}), - }; - foreach my $fld (qw/part_nr md5/) { - $p->{$fld} = $row->{$fld} || die "missing $fld in row!"; + + my @volumes; + my $v; # emtpy volume + my $v_size = 0; + + my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize"; + while (my $row = $sth_archive_backup_parts->fetchrow_hashref) { + if (($v->{size} || 0) + $row->{part_size} > $max_archive_size) { + push @volumes, $v; + $v = {}; + } + $v->{size} += $row->{part_size}; + $v_size += $row->{part_size}; + + # this part + my $p = { + filename => BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'}), + }; + foreach my $fld (qw/part_nr md5/) { + $p->{$fld} = $row->{$fld} || die "missing $fld in row!"; + } + push @{ $v->{parts} }, $p; } - push @{ $v->{parts} }, $p; - } - push @volumes, $v if ($v); + push @volumes, $v if ($v); - #warn "# volumes: ",Dumper(\@volumes),"\n"; + #warn "# volumes: ",Dumper(\@volumes)," total size: ", fmt_mb($v_size), "\n"; - my $volumes = $#volumes + 1; - my $volume_nr = 1; + # check available disk space - my $copies = $Conf{BurnMultipleCopies} || 1; + my $df = df($iso_dir)->{bavail} || die "can't get free space on $iso_dir"; + $df *= 1024; # calulate space in bytes + if ($df < $v_size) { + warn "ABORTED: not enough disk space to create ISO ! [need ", fmt_mb($v_size), " have ", fmt_mb( $df ), " on $iso_dir]\n"; + next; + } - foreach my $copy_nr ( 1 .. $copies ) { + my $volumes = $#volumes + 1; + my $volume_nr = 1; foreach my $v (@volumes) { @@ -412,7 +430,7 @@ foreach my $arc (@archives_to_burn) { $disk_name .= ' ' . $volume_nr . '/' . $volumes; } - print "Processing DVD #$dvd_nr, volume $volume_nr/$volumes\n"; + print "Processing DVD #$dvd_nr, volume $volume_nr/$volumes [", fmt_mb($v->{size}), "]\n"; my $iso_file = my $xml_file = my $stage = "${iso_dir}/${dvd_nr}"; @@ -490,7 +508,8 @@ foreach my $arc (@archives_to_burn) { rmtree($stage) || warn "can't remove stage directory $stage: $!"; } else { - print "ISO $iso_file allready exists\n"; + $iso_size = (stat($iso_file))[7]; + print "ISO $iso_file allready exists [$iso_size bytes]\n"; } print "\nREADY TO BURN MEDIA $disk_name copy $copy_nr\n\nPlease insert blank media and press ENTER\n\n"; @@ -510,9 +529,19 @@ foreach my $arc (@archives_to_burn) { $sth_archive_burned->execute($dvd_nr, $iso_size, $volume_nr, $copy_nr); print "Media burn for $disk_name copy $copy_nr recorded\n"; + + if ($copy_nr >= $copies) { + print STDERR "erasing temporary files, have $copy_nr copies (> $copies)\n"; + foreach my $f (( $xml_file, $iso_file )) { + print STDERR "\t$f "; + unlink $f || die "can't remove $f: $!"; + print STDERR "removed\n"; + } + } + + $volume_nr++; } - $volume_nr++; } SKIP: