From f163fa1c9f616fbbb5413e6fad09bd08957b0c3a Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 2 Jun 2008 02:16:14 +0000 Subject: [PATCH] use IPC::Run to run pslatex & add a timeout, this should prevent hanging on template errors --- FS/FS/Misc.pm | 83 ++++++++++++++++++++++++++++++++++++++++++++++++------ FS/FS/cust_bill.pm | 44 ++++------------------------- 2 files changed, 79 insertions(+), 48 deletions(-) diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 54467a1fb..7a6a3b5b1 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -5,6 +5,8 @@ use vars qw ( @ISA @EXPORT_OK $DEBUG ); use Exporter; use Carp; use Data::Dumper; +use IPC::Run qw( run timeout ); # for _pslatex +use IPC::Run3; # for do_print... should just use IPC::Run i guess #do NOT depend on any FS:: modules here, causes weird (sometimes unreproducable #until on client machine) dependancy loops. put them in FS::Misc::Something #instead @@ -13,7 +15,7 @@ use Data::Dumper; @EXPORT_OK = qw( send_email send_fax states_hash counties state_label card_types - generate_ps do_print + generate_ps generate_pdf do_print ); $DEBUG = 0; @@ -500,12 +502,7 @@ sub generate_ps { my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; chdir($dir); - my $sfile = shell_quote $file; - - system("pslatex $sfile.tex >/dev/null 2>&1") == 0 - or die "pslatex $file.tex failed; see $file.log for details?\n"; - system("pslatex $sfile.tex >/dev/null 2>&1") == 0 - or die "pslatex $file.tex failed; see $file.log for details?\n"; + _pslatex($file); system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0 or die "dvips failed"; @@ -537,14 +534,82 @@ sub generate_ps { } +=item generate_pdf FILENAME + +Returns an PDF rendition of the LaTex file, as a scalar. FILENAME does not +contain the .tex suffix and is unlinked by this function. + +=cut + +use String::ShellQuote; + +sub generate_pdf { + my $file = shift; + + my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; + chdir($dir); + + #system('pdflatex', "$file.tex"); + #system('pdflatex', "$file.tex"); + #! LaTeX Error: Unknown graphics extension: .eps. + + _pslatex($file); + + my $sfile = shell_quote $file; + + #system('dvipdf', "$file.dvi", "$file.pdf" ); + system( + "dvips -q -t letter -f $sfile.dvi ". + "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ". + " -c save pop -" + ) == 0 + or die "dvips | gs failed: $!"; + + open(PDF, "<$file.pdf") + or die "can't open $file.pdf: $! (error in LaTeX template?)\n"; + + unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex"); + + my $pdf = ''; + while () { + $pdf .= $_; + } + + close PDF; + + return $pdf; + +} + +sub _pslatex { + my $file = shift; + + #my $sfile = shell_quote $file; + + my @cmd = ( + 'latex', '-interaction=batchmode', + '\AtBeginDocument{\RequirePackage{pslatex}}', + '\def\PSLATEXTMP{\futurelet\PSLATEXTMP\PSLATEXTMPB}', + '\def\PSLATEXTMPB{\ifx\PSLATEXTMP\nonstopmode\else\input\fi}', + '\PSLATEXTMP', + "$file.tex" + ); + + my $timeout = 60; #? + + for ( 1, 2 ) { + run( \@cmd, '>'=>'/dev/null', '2>'=>'/dev/null', timeout($timeout) ) + or die "pslatex $file.tex failed; see $file.log for details?\n"; + } + +} + =item print ARRAYREF Sends the lines in ARRAYREF to the printer. =cut -use IPC::Run3; - sub do_print { my $data = shift; diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 2abd8403a..1f837de84 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -12,7 +12,7 @@ use String::ShellQuote; use HTML::Entities; use Locale::Country; use FS::UID qw( datasrc ); -use FS::Misc qw( send_email send_fax generate_ps do_print ); +use FS::Misc qw( send_email send_fax generate_ps generate_pdf do_print ); use FS::Record qw( qsearch qsearchs dbh ); use FS::cust_main_Mixin; use FS::cust_main; @@ -2303,8 +2303,8 @@ sub print_ps { my ($file, $lfile) = $self->print_latex(@_); my $ps = generate_ps($file); unlink($lfile); - $ps; + $ps; } =item print_pdf [ TIME [ , TEMPLATE ] ] @@ -2322,44 +2322,10 @@ sub print_pdf { my $self = shift; my ($file, $lfile) = $self->print_latex(@_); + my $pdf = generate_pdf($file); + unlink($lfile); - my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; - chdir($dir); - - #system('pdflatex', "$file.tex"); - #system('pdflatex', "$file.tex"); - #! LaTeX Error: Unknown graphics extension: .eps. - - my $sfile = shell_quote $file; - - system("pslatex $sfile.tex >/dev/null 2>&1") == 0 - or die "pslatex $file.tex failed; see $file.log for details?\n"; - system("pslatex $sfile.tex >/dev/null 2>&1") == 0 - or die "pslatex $file.tex failed; see $file.log for details?\n"; - - #system('dvipdf', "$file.dvi", "$file.pdf" ); - system( - "dvips -q -t letter -f $sfile.dvi ". - "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ". - " -c save pop -" - ) == 0 - or die "dvips | gs failed: $!"; - - open(PDF, "<$file.pdf") - or die "can't open $file.pdf: $! (error in LaTeX template?)\n"; - - unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex"); - unlink("$lfile"); - - my $pdf = ''; - while () { - $pdf .= $_; - } - - close PDF; - - return $pdf; - + $pdf; } =item print_html [ TIME [ , TEMPLATE [ , CID ] ] ] -- 2.11.0