This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository cups-x2go. commit 00eb58a247aee90a6f3105dded0d448850205fe6 Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Mar 20 02:44:33 2015 +0100 cups-x2go{,.conf}: port to File::Temp. Use Text::ParseWords to split up the ps2pdf command line correctly. Don't use system() but IPC::Open2::open2(). Capture the ps2pdf program's stdout and write it to the temporary file handle "manually". Should fix file problems reported by Jan Bi on IRC. --- cups-x2go | 78 ++++++++++++++++++++++++++++++++++++++++++------------ cups-x2go.conf | 3 ++- debian/changelog | 6 +++++ 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/cups-x2go b/cups-x2go index 473d179..e6a0c32 100755 --- a/cups-x2go +++ b/cups-x2go @@ -22,6 +22,9 @@ use Sys::Syslog qw( :standard :macros ); use Sys::Hostname; use File::Basename; use File::Copy; +use File::Temp; +use IPC::Open2; +use Text::ParseWords; use strict; openlog($0,'cons,pid','user'); @@ -38,7 +41,7 @@ my $x2goserver = "local"; my $printdsa = "/root/.ssh/id_dsa-x2goprint"; # PS2PDF command -my $ps2pdf = "/usr/bin/gs -q -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=\"%s.pdf\" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -dDoNumCopies -c .setpdfwrite -f \"%s\""; +my $ps2pdf = "/usr/bin/gs -q -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=- -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -dDoNumCopies -c .setpdfwrite -f \"%s\""; #my $ps2pdf = "/usr/bin/gs -q -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=\"%s.pdf\" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -dDoNumCopies -c .setpdfwrite -f /usr/bin/margin-offset.ps \"%s\""; ## loglevel for cups-x2go, possible values: emerg, alert, crit, err, warning, notice, info, debug @@ -189,41 +192,82 @@ my $psFile; ($jobID, $userName, $jobTitle, $copies, $printOptions, $psFile) = @ARGV; syslog('notice', "Print job received from cups -> $jobID $userName $jobTitle $copies $printOptions $psFile"); -my $tempFile; +my $jid = $jobID; +my $uid = $userName; +$jid =~ s/\W//g; #sanity check +$uid =~ s/\W//g; #sanity check + +my $template = "$jid-$uid-cupsjob$$"; +my $ps_template = $template . "X" x 16; +my $pdf_template = $template . ".pdfX" x 16; +my $title_template = $template . ".pdf.titleX" x 16; if (!$psFile) { - my $jid = $jobID; - my $uid = $userName; - $jid =~ s/\W//g; #sanity check - $uid =~ s/\W//g; #sanity check - $tempFile = "/tmp/$jid-$uid-cupsjob$$"; - open (OUT, ">$tempFile") or die "ERROR: Cannot write $tempFile: $!\n"; + my ($tfh, $tempFile) = tempfile ($ps_template, TMPDIR => 1); syslog('info', "Print job comes from STDIN, writing incoming job to temp file $tempFile\n"); while(<STDIN>) { - print OUT "$_"; + print $tfh $_; } - close OUT; + close $tfh; $psFile = $tempFile; } # converting PS file that we retrieved from CUPS into PDF format -$ps2pdf=~s/%s/$psFile/g; +my @ps2pdf_args = parse_line (" ", 0, $ps2pdf); +my $ps2pdf_cmd = shift (@ps2pdf_args); + +for (my $i = 0; $i < @ps2pdf_args; ++$i) { + $ps2pdf_args[$i] =~ s/%s/$psFile/g; +} + syslog('info', "Converting printjob with command: $ps2pdf\n"); +my ($pdf_fh, $pdfFile) = tempfile ($pdf_template, TMPDIR => 1); + # the TMPDIR env var is needed for ghostscript... $ENV{TMPDIR}="/tmp"; -system("$ps2pdf"); +my ($gs_out, $gs_in, $wait_ret, $real_ret); +my $gs_pid = open2 ($gs_out, $gs_in, $ps2pdf_cmd, @ps2pdf_args); +waitpid ($gs_pid, 0); + +$wait_ret = $?; +$real_ret = $wait_ret >> 8; + +my $conv_fail = 0; +if (-1 == $wait_ret) { + syslog('err', "ERROR: cups-x2go failed to spawn ps2pdf conversion process: $!"); + $conv_fail = 1; +} +elsif ($wait_ret & 127) { + my $signal = $wait_ret & 127; + syslog('err', "ERROR: cups-x2go failed to execute ps2pdf conversion program: interrupted by signal $signal"); + $conv_fail = 1; +} +else { + if (0 != $real_ret) { + syslog('err', "ERROR: ps2pdf conversion program failed to convert $psFile: failed with exit code$real_ret"); + $conv_fail = 1; + } +} + +if ($conv_fail) { + syslog('err', "ERROR: cups-x2go failed to process postscript file $psFile"); + die "$0: Failed to convert postscript file $psFile"; +} + +syslog('debug', "cups-x2go processed postscript file $psFile to $pdfFile"); + +print $pdf_fh $gs_out; +close ($pdf_fh); # after we have created the PDF from CUPS's PS file, we can drop the PS file unlink ($psFile); -my $pdfFile="$psFile.pdf"; -my $titleFile="$pdfFile.title"; -open (TITLE,">$titleFile"); -print TITLE $jobTitle; -close (TITLE); +my ($title_fh, $titleFile) = tempfile ($title_template, TMPDIR => 1); +print $title_fh $jobTitle; +close ($title_fh); getsessions(); syslog('debug', "Retrieved session list: @sessions\n"); diff --git a/cups-x2go.conf b/cups-x2go.conf index 89ed3ce..7a06843 100644 --- a/cups-x2go.conf +++ b/cups-x2go.conf @@ -14,7 +14,8 @@ #printdsa = /root/.ssh/id_dsa-x2goprint ## command to generate PDF file -#ps2pdf = /usr/bin/gs -q -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=\"%s.pdf\" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -dDoNumCopies -c .setpdfwrite -f \"%s\" +## CAUTION: this command MUST output the resulting PDF File to standard output. +#ps2pdf = /usr/bin/gs -q -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=- -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -dDoNumCopies -c .setpdfwrite -f \"%s\" ## loglevel for cups-x2go, possible values: emerg, alert, crit, err, warning, notice, info, debug #loglevel = notice diff --git a/debian/changelog b/debian/changelog index bdfbe40..4da7667 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,6 +22,12 @@ cups-x2go (3.0.1.2-0x2go1) UNRELEASED; urgency=low + Also own %{_prefix}/lib for SLES < 12, as previous versions ship the arch-dependent %{_libdir}/cups only. + Make package noarch again. + * New upstream version (3.0.1.2): + - cups-x2go{,.conf}: port to File::Temp. Use Text::ParseWords to split up the + ps2pdf command line correctly. Don't use system() but + IPC::Open2::open2(). Capture the ps2pdf program's stdout and write it to + the temporary file handle "manually". + Should fix problems reported by Jan Bi on IRC. -- X2Go Release Manager <git-admin@x2go.org> Tue, 10 Feb 2015 21:08:34 +0100 -- Alioth's /srv/git/code.x2go.org/cups-x2go.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/cups-x2go.git