Viewing file: save_profile.cgi (9.61 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/perl # Save, update or delete a burn profile, and maybe start the burn process
require './burner-lib.pl'; &ReadParse(); &error_setup($text{'save_err'});
if ($in{'id'}) { $profile = &get_profile($in{'id'}); &can_use_profile($profile) || &error($text{'edit_ecannot'}); } else { $profile = { 'type' => $in{'type'} }; $access{'create'} || &error($text{'edit_ecannot'}); }
if (!$access{'edit'}) { # No need to save, because we cannot } elsif ($in{'delete'}) { # Just delete a profile &delete_profile($profile); } else { # Validate inputs $in{'name'} || &error($text{'save_ename'}); $profile->{'name'} = $in{'name'}; if ($profile->{'type'} == 1) { # Validate single ISO inputs -r $in{'iso'} || &error($text{'save_eiso'}); &can_directory($in{'iso'}) || &error($text{'save_ecannot1'}); $profile->{'iso'} = $in{'iso'}; $profile->{'isosize'} = $in{'isosize'}; } elsif ($profile->{'type'} == 2) { # Validate multi-directory inputs foreach $k (keys %$profile) { delete($profile->{$k}) if ($k =~ /^(source_|dest_)/); } local $j = 0; for($i=0; defined($s = $in{"source_$i"}); $i++) { next if (!$s); -d $s || -r $s || &error(&text('save_esource', $s)); &can_directory($s) || &error(&text('save_ecannot2', $s)); $in{"dest_$i"} =~ /^\/\S*$/ || &error(&text('save_edest', $s)); $profile->{"source_$j"} = $s; $profile->{"dest_$j"} = $in{"dest_$i"}; $j++; } $j || &error($text{'save_edirs'}); $profile->{'rock'} = $in{'rock'}; $profile->{'joliet'} = $in{'joliet'}; $profile->{'netatalk'} = $in{'netatalk'}; $profile->{'cap'} = $in{'cap'}; $profile->{'long'} = $in{'long'}; $profile->{'trans'} = $in{'trans'}; $profile->{'volid'} = $in{'volid'}; } elsif ($profile->{'type'} == 3) { # Validate audio track inputs .. each must be either an # mp3 file or a directory foreach $k (keys %$profile) { delete($profile->{$k}) if ($k =~ /^source_/); } local $j = 0; for($i=0; defined($s = $in{"source_$i"}); $i++) { next if (!$s); -d $s || -r $s || &error(&text('save_emp3', $s)); &can_directory($s) || &error(&text('save_ecannot3', $s)); $profile->{"source_$j"} = $s; $j++; } $j || &error($text{'save_emp3s'}); } elsif ($profile->{'type'} == 4) { # Validate device file inputs if ($in{'sdev'} eq '') { -r $in{'other'} || &error($text{'save_eother'}); $profile->{'sdev'} = $in{'other'}; $profile->{'sdesc'} = $in{'other'}; } else { $profile->{'sdev'} = $in{'sdev'}; foreach $d (&list_cdrecord_devices()) { $profile->{'sdesc'} = $d->{'name'} if ($d->{'dev'} eq $profile->{'sdev'}); } } &can_directory($profile->{'sdev'}) || &error($text{'save_ecannot4'}); $profile->{'fly'} = $in{'fly'}; $profile->{'srcdrv'} = $in{'srcdrv'}; $profile->{'dstdrv'} = $in{'dstdrv'}; }
# Save or create the profile &save_profile($profile); if ($in{'new'} && !&can_use_profile($profile)) { # Add to this user's ACL $access{'profiles'} = join(" ", split(/\s+/, $access{'profiles'}), $profile->{'id'}); &save_module_acl(\%access); } }
if ($in{'burn'} || $in{'test'}) { &ui_print_unbuffered_header(undef, $text{'burn_title'}, "");
if (!$config{'dev'}) { # Cannot burn until device is set print "<p>",&text('burn_edev', "edit_dev.cgi"),"<p>\n"; &ui_print_footer("", $text{"index_return"}); exit; }
local ($iso, $temp, $msg); if ($profile->{'type'} == 1) { # No preparation to do $iso = $profile->{'iso'}; $temp = 0; $msg = &text($in{'test'} ? 'burn_rutest1' : 'burn_rusure1', "<tt>$iso</tt>"); } elsif ($profile->{'type'} == 2) { # Need to build the ISO image $temp = 1; $iso = $config{'temp'} ? "$config{'temp'}/burner.iso" : &tempname("burner.iso"); local $cmd = "$config{'mkisofs'} -graft-points -o $iso"; $cmd .= " -J" if ($profile->{'joliet'}); $cmd .= " --netatalk" if ($profile->{'netatalk'}); $cmd .= " --cap" if ($profile->{'cap'}); $cmd .= " -l" if ($profile->{'long'}); $cmd .= " -T" if ($profile->{'trans'}); if ($profile->{'rock'} == 2) { $cmd .= " -r"; } elsif ($profile->{'rock'} == 1) { $cmd .= " -R"; } if ($profile->{'volid'}) { $cmd .= " -V '$profile->{'volid'}'"; } $cmd .= " -N" if ($config{'novers'}); $cmd .= " -U" if ($config{'notrans'}); $cmd .= " -f" if ($config{'fsyms'}); $cmd .= " -nobak" if ($config{'nobak'}); for($i=0; defined($profile->{"source_$i"}); $i++) { local $d = quotemeta($profile->{"dest_$i"}); $d .= "/" if ($d !~ /\/$/); $cmd .= " ".$d."=".quotemeta($profile->{"source_$i"}); }
print "<b>",&text('burn_mheader', "<tt>$cmd</tt>"),"</b><br>\n"; print "<pre>"; open(MAKE, "$cmd 2>&1 |"); while(<MAKE>) { print &html_escape($_); } close(MAKE); print "</pre>\n"; if ($?) { # Failed! No point going on .. unlink($iso); print "<b>$text{'burn_mfailed'}</b><br>\n"; &ui_print_footer("", $text{'index_return'}); exit; } $msg = $in{'test'} ? $text{'burn_rutest2'} : $text{'burn_rusure2'};
# Check the size of the resulting ISO local @st = stat($iso); local $mb = int($st[7]/(1024*1024)); if ($mb > 700) { print "<b>",&text('burn_700', $mb),"</b><br>\n"; } elsif ($mb > 650) { print "<b>",&text('burn_650', $mb),"</b><br>\n"; } else { print &text('burn_size', $mb, 650),"<br>\n"; } } elsif ($profile->{'type'} == 3) { # To convert MP3s into data suitable for CDs, run # mpg123 -s -r 44100 file.mp3 >file.raw # # To burn to a CD, run # cdrecord dev=0,0,0 -v -audio -swab -pad speed=8 *.raw $temp = 1; $audio = $config{'temp'} ? "$config{'temp'}/burner.audio" : &tempname("burner.audio"); system("rm -rf $audio >/dev/null 2>&1"); mkdir($audio, 0755); local (@srcs, $src); for($i=0; defined($src = $profile->{"source_$i"}); $i++) { if (-d $src) { opendir(DIR, $src); foreach $m (sort { $a cmp $b } readdir(DIR)) { push(@srcs, "$src/$m") if ($m !~ /^\./ && -r "$src/$m"); } closedir(DIR); } else { push(@srcs, $src); } } if (!@srcs) { # No files to burn print "<b>$text{'burn_nomp3s'}</b><br>\n"; &ui_print_footer("", $text{'index_return'}); exit; }
local $mp3_basecmd = "$config{'mpg123'} -s -r 44100"; local $wav_basecmd = "$config{'sox'} -V"; print "<b>",&text('burn_mp3header', "<tt>$basecmd</tt>"), "</b><br>\n"; print "<pre>"; local $size; local $errors; for($i=0; $i<@srcs; $i++) { print "<b>$srcs[$i]</b><br>\n"; local $dst = sprintf "%s/track-%3.3d.raw", $audio, $i; local $q = quotemeta($srcs[$i]); if ($srcs[$i] =~ /\.(mp3|mp2|mpg|mpeg)$/i) { # Convert from MP3 open(MPG, "$mp3_basecmd $q 2>&1 >$dst |"); while(<MPG>) { next if (/^High Performance/i || /^Version\s+(\S+)/i || /^Uses code from various people/i || /^THIS SOFTWARE COMES WITH/i || /^Directory: /i || !/\S/); print &html_escape($_); } close(MPG); } elsif ($srcs[$i] =~ /\.(wav|ogg)$/i) { # Convert from WAV or OGG open(SOX, "$wav_basecmd $q -r 44100 $dst 2>&1 |"); while(<SOX>) { print &html_escape($_); } close(SOX); } if ($?) { $errors++; } else { local @st = stat($dst); $size += $st[7]; } print "<p>\n"; } print "</pre>"; if (!$size) { # Totally failed! No point going on .. system("rm -rf ".quotemeta($audio)." >/dev/null 2>&1"); print "<b>$text{'burn_mp3failed'}</b><br>\n"; &ui_print_footer("", $text{'index_return'}); exit; } elsif ($errors) { # Some errors occurred print "<b>$text{'burn_mp3failed2'}</b><p>\n"; } $msg = $in{'test'} ? $text{'burn_rutest3'} : $text{'burn_rusure3'};
# Check the total size local $mb = int($size/(1024*1024)); if ($mb > 746) { print "<b>",&text('burn_746', $mb),"</b><br>\n"; } elsif ($mb > 807) { print "<b>",&text('burn_807', $mb),"</b><br>\n"; } else { print &text('burn_mp3size', $mb, 746),"<br>\n"; } } elsif ($profile->{'type'} == 4) { # No preparation to do for a copy $iso = $profile->{'sdev'}; $temp = 0; $msg = &text('burn_rusure4', $profile->{'sdesc'}); }
if ($in{'ask'}) { # Show confirm page print "<center><form action=burn.cgi>\n"; print "<input type=hidden name=iso value='$iso'>\n"; print "<input type=hidden name=audio value='$audio'>\n"; print "<input type=hidden name=temp value='$temp'>\n"; print "<input type=hidden name=id value='$profile->{'id'}'>\n"; printf "<input type=hidden name=test value='%d'>\n", $in{'test'} ? 1 : 0; print "<b>$msg</b><p>\n"; print "<input type=submit name=ok value='$text{'burn_ok'}'>\n"; if ($temp) { print "<input type=submit name=cancel value='$text{'burn_cancel'}'>\n"; } if (!$in{'test'}) { print "<br>$text{'burn_eject'}\n"; print "<input type=radio name=eject value=1> $text{'yes'}\n"; print "<input type=radio name=eject value=0 checked> $text{'no'}\n"; } if ($profile->{'type'} != 4 || $profile->{'sdev'} ne $config{'dev'}) { printf "<br>$text{'burn_bg'}\n"; print "<input type=radio name=bg value=1> $text{'yes'}\n"; print "<input type=radio name=bg value=0 checked> $text{'no'}\n"; }
if ($profile->{'type'} != 4) { print "<br>$text{'burn_blank'} <select name=blank>\n"; print "<option value='' selected> $text{'no'}\n"; print "<option value=fast> $text{'burn_bfast'}\n"; print "<option value=all> $text{'burn_ball'}\n"; print "</select>\n"; } print "</form></center>\n"; } else { # Redirect to the burn page print "<script>document.location = \"burn.cgi?iso=$iso&audio=$audio&temp=$temp&id=$profile->{'id'}&test=",$in{'test'} ? 1 : 0,"\";</script>\n"; }
&ui_print_footer("", $text{'index_return'}); } else { &redirect(""); }
|