11 |
use Term::Menus; |
use Term::Menus; |
12 |
use File::Which; |
use File::Which; |
13 |
use File::Path; |
use File::Path; |
14 |
|
use Filesys::Df; |
15 |
|
|
16 |
use Data::Dumper; |
use Data::Dumper; |
17 |
|
|
194 |
|
|
195 |
$sth->execute(); |
$sth->execute(); |
196 |
|
|
197 |
|
sub fmt_mb($) { |
198 |
|
my $s = shift; |
199 |
|
die "missing size" unless defined($s); |
200 |
|
$s /= (1024*1024); |
201 |
|
return sprintf("%.2f Mb", $s); |
202 |
|
} |
203 |
|
|
204 |
sub fmt_archive($) { |
sub fmt_archive($) { |
205 |
my $row = shift || die; |
my $row = shift || die; |
206 |
|
|
207 |
$row->{'date'} =~ s/\.\d+$//; |
$row->{'date'} =~ s/\.\d+$//; |
208 |
$row->{'copies'} =~ s/^\s*0+\s*$/no/; |
$row->{'copies'} =~ s/^\s*0+\s*$/no/; |
|
$row->{'total_size'} /= (1024*1024); |
|
209 |
|
|
210 |
my $copies = 'copies'; |
my $copies = 'copies'; |
211 |
$copies = 'copy' if ($row->{'copies'} == 1); |
$copies = 'copy' if ($row->{'copies'} == 1); |
212 |
|
|
213 |
return |
return |
214 |
sprintf("%d by %s on %s, %s %s [%.2f Mb]", |
sprintf("%d by %s on %s, %s %s [%s]", |
215 |
$row->{'dvd_nr'}, |
$row->{'dvd_nr'}, |
216 |
$row->{'username'}, |
$row->{'username'}, |
217 |
$row->{'date'}, |
$row->{'date'}, |
218 |
$row->{'copies'}, $copies, |
$row->{'copies'}, $copies, |
219 |
$row->{'total_size'}, |
fmt_mb($row->{'total_size'}), |
220 |
); |
); |
221 |
} |
} |
222 |
|
|
339 |
values ( (select id from archive where dvd_nr =?), ?, ?, ?) |
values ( (select id from archive where dvd_nr =?), ?, ?, ?) |
340 |
}); |
}); |
341 |
|
|
342 |
foreach my $arc (@archives_to_burn) { |
my $copies = $Conf{BurnMultipleCopies} || 1; |
|
exit if ($arc eq ']quit['); |
|
343 |
|
|
344 |
my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/); |
foreach my $copy_nr ( 1 .. $copies ) { |
|
die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr); |
|
345 |
|
|
346 |
my $tmp_dir = "/$iso_dir/$dvd_nr"; |
foreach my $arc (@archives_to_burn) { |
347 |
|
exit if ($arc eq ']quit['); |
348 |
|
|
349 |
my $t = time(); |
my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/); |
350 |
|
die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr); |
351 |
|
|
352 |
print "Working on DVD #$dvd_nr in $tmp_dir\n"; |
my $tmp_dir = "/$iso_dir/$dvd_nr"; |
353 |
|
|
354 |
$sth_archive_backup_parts->execute($dvd_nr); |
my $t = time(); |
355 |
|
|
356 |
$sth_archive_backup_check->execute($dvd_nr); |
print "Working on DVD #$dvd_nr in $tmp_dir\n"; |
357 |
|
|
358 |
my ($parts_nr, $check_nr) = ($sth_archive_backup_parts->rows, $sth_archive_backup_check->fetchrow_array); |
$sth_archive_backup_parts->execute($dvd_nr); |
359 |
|
|
360 |
if ($parts_nr != $check_nr) { |
$sth_archive_backup_check->execute($dvd_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; |
|
|
} |
|
361 |
|
|
362 |
if ($sth_archive_backup_parts->rows == 0) { |
my ($parts_nr, $check_nr) = ($sth_archive_backup_parts->rows, $sth_archive_backup_check->fetchrow_array); |
|
warn "ERROR: no backup parts found for $dvd_nr. You should re-create that DVD.\n"; |
|
|
next if delete_dvd( $dvd_nr ); |
|
|
} |
|
363 |
|
|
364 |
if ($prompt_for_delete) { |
if ($parts_nr != $check_nr) { |
365 |
next if delete_dvd( $dvd_nr ); |
warn "ERROR: DVD #$dvd_nr is still not inconsistent state. Some backup parts are ", |
366 |
} |
($parts_nr < $check_nr) ? "missing ($parts_nr < $check_nr)" : "extra ($parts_nr > $check_nr)", |
367 |
|
" you should re-create this DVD after BackupPC_incPartsUpdate finish\n"; |
368 |
|
delete_dvd( $dvd_nr ); |
369 |
|
next; |
370 |
|
} |
371 |
|
|
372 |
my @volumes; |
if ($sth_archive_backup_parts->rows == 0) { |
373 |
my $v; # emtpy volume |
warn "ERROR: no backup parts found for $dvd_nr. You should re-create that DVD.\n"; |
374 |
my $v_size = 0; |
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 = {}; |
|
375 |
} |
} |
376 |
$v->{size} += $row->{part_size}; |
|
377 |
# this part |
if ($prompt_for_delete) { |
378 |
my $p = { |
next if delete_dvd( $dvd_nr ); |
|
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!"; |
|
379 |
} |
} |
|
push @{ $v->{parts} }, $p; |
|
|
} |
|
|
push @volumes, $v if ($v); |
|
380 |
|
|
381 |
#warn "# volumes: ",Dumper(\@volumes),"\n"; |
my @volumes; |
382 |
|
my $v; # emtpy volume |
383 |
|
my $v_size = 0; |
384 |
|
|
385 |
|
my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize"; |
386 |
|
while (my $row = $sth_archive_backup_parts->fetchrow_hashref) { |
387 |
|
if (($v->{size} || 0) + $row->{part_size} > $max_archive_size) { |
388 |
|
push @volumes, $v; |
389 |
|
$v = {}; |
390 |
|
} |
391 |
|
$v->{size} += $row->{part_size}; |
392 |
|
$v_size += $row->{part_size}; |
393 |
|
|
394 |
my $volumes = $#volumes + 1; |
# this part |
395 |
my $volume_nr = 1; |
my $p = { |
396 |
|
filename => BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'}), |
397 |
|
}; |
398 |
|
foreach my $fld (qw/part_nr md5/) { |
399 |
|
$p->{$fld} = $row->{$fld} || die "missing $fld in row!"; |
400 |
|
} |
401 |
|
push @{ $v->{parts} }, $p; |
402 |
|
} |
403 |
|
push @volumes, $v if ($v); |
404 |
|
|
405 |
my $copies = $Conf{BurnMultipleCopies} || 1; |
#warn "# volumes: ",Dumper(\@volumes)," total size: ", fmt_mb($v_size), "\n"; |
406 |
|
|
407 |
foreach my $copy_nr ( 1 .. $copies ) { |
# check available disk space |
408 |
|
|
409 |
|
my $df = df($iso_dir); |
410 |
|
if ($df < $v_size) { |
411 |
|
warn "ABORTED: not enough disk space to create ISO ! [need ", fmt_mb($v_size), " have ", fmt_mb( df($iso_dir) ), "]\n"; |
412 |
|
next; |
413 |
|
} |
414 |
|
|
415 |
|
my $volumes = $#volumes + 1; |
416 |
|
my $volume_nr = 1; |
417 |
|
|
418 |
foreach my $v (@volumes) { |
foreach my $v (@volumes) { |
419 |
|
|
429 |
$disk_name .= ' ' . $volume_nr . '/' . $volumes; |
$disk_name .= ' ' . $volume_nr . '/' . $volumes; |
430 |
} |
} |
431 |
|
|
432 |
print "Processing DVD #$dvd_nr, volume $volume_nr/$volumes\n"; |
print "Processing DVD #$dvd_nr, volume $volume_nr/$volumes [", fmt_mb($v->{size}), "]\n"; |
433 |
|
|
434 |
my $iso_file = my $xml_file = my $stage = |
my $iso_file = my $xml_file = my $stage = |
435 |
"${iso_dir}/${dvd_nr}"; |
"${iso_dir}/${dvd_nr}"; |
507 |
rmtree($stage) || warn "can't remove stage directory $stage: $!"; |
rmtree($stage) || warn "can't remove stage directory $stage: $!"; |
508 |
|
|
509 |
} else { |
} else { |
510 |
print "ISO $iso_file allready exists\n"; |
$iso_size = (stat($iso_file))[7]; |
511 |
|
print "ISO $iso_file allready exists [$iso_size bytes]\n"; |
512 |
} |
} |
513 |
|
|
514 |
print "\nREADY TO BURN MEDIA $disk_name copy $copy_nr\n\nPlease insert blank media and press ENTER\n\n"; |
print "\nREADY TO BURN MEDIA $disk_name copy $copy_nr\n\nPlease insert blank media and press ENTER\n\n"; |
528 |
$sth_archive_burned->execute($dvd_nr, $iso_size, $volume_nr, $copy_nr); |
$sth_archive_burned->execute($dvd_nr, $iso_size, $volume_nr, $copy_nr); |
529 |
|
|
530 |
print "Media burn for $disk_name copy $copy_nr recorded\n"; |
print "Media burn for $disk_name copy $copy_nr recorded\n"; |
531 |
|
|
532 |
|
$volume_nr++; |
533 |
} |
} |
534 |
|
|
|
$volume_nr++; |
|
535 |
} |
} |
536 |
|
|
537 |
SKIP: |
SKIP: |