turn off debugging that got left on by accident
[freeside.git] / FS / FS / Misc.pm
index 83bc3b2..1f6eece 100644 (file)
@@ -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;
@@ -67,7 +69,7 @@ I<type> - (optional) type parameter for multipart/related messages
 use vars qw( $conf );
 use Date::Format;
 use Mail::Header;
-use Mail::Internet 1.44;
+use Mail::Internet 2.00;
 use MIME::Entity;
 use FS::UID;
 
@@ -193,34 +195,51 @@ sub send_email {
 }
 
 #this kludges a "mysmtpsend" method into Mail::Internet for send_email above
+#now updated for MailTools v2!
 package Mail::Internet;
 
 use Mail::Address;
 use Net::SMTP;
-
-sub Mail::Internet::mysmtpsend {
-    my $src  = shift;
-    my %opt = @_;
-    my $host = $opt{Host};
-    my $envelope = $opt{MailFrom};
-    my $noquit = 0;
-    my $smtp;
-    my @hello = defined $opt{Hello} ? (Hello => $opt{Hello}) : ();
-
-    push(@hello, 'Port', $opt{'Port'})
-       if exists $opt{'Port'};
-
-    push(@hello, 'Debug', $opt{'Debug'})
-       if exists $opt{'Debug'};
-
-    if(ref($host) && UNIVERSAL::isa($host,'Net::SMTP')) {
-       $smtp = $host;
-       $noquit = 1;
+use Net::Domain;
+
+sub Mail::Internet::mysmtpsend($@) {
+    my ($self, %opt) = @_;
+
+    my $host     = $opt{Host};
+    my $envelope = $opt{MailFrom}; # || mailaddress();
+    my $quit     = 1;
+
+    my ($smtp, @hello);
+
+    push @hello, Hello => $opt{Hello}
+        if defined $opt{Hello};
+
+    push @hello, Port => $opt{Port}
+        if exists $opt{Port};
+
+    push @hello, Debug => $opt{Debug}
+        if exists $opt{Debug};
+
+#    if(!defined $host)
+#    {   local $SIG{__DIE__};
+#        my @hosts = qw(mailhost localhost);
+#        unshift @hosts, split /\:/, $ENV{SMTPHOSTS}
+#            if defined $ENV{SMTPHOSTS};
+#
+#        foreach $host (@hosts)
+#        {   $smtp = eval { Net::SMTP->new($host, @hello) };
+#            last if defined $smtp;
+#        }
+#    }
+#    elsif(ref($host) && UNIVERSAL::isa($host,'Net::SMTP'))
+    if(ref($host) && UNIVERSAL::isa($host,'Net::SMTP'))
+    {   $smtp = $host;
+        $quit = 0;
     }
-    else {
-       #local $SIG{__DIE__};
-       #$smtp = eval { Net::SMTP->new($host, @hello) };
-       $smtp = new Net::SMTP $host, @hello;
+    else
+    {   #local $SIG{__DIE__};
+        #$smtp = eval { Net::SMTP->new($host, @hello) };
+        $smtp = Net::SMTP->new($host, @hello);
     }
 
     unless ( defined($smtp) ) {
@@ -229,39 +248,35 @@ sub Mail::Internet::mysmtpsend {
       return "can't connect to $host: $err"
     }
 
-    my $hdr = $src->head->dup;
+    my $head = $self->cleaned_header_dup;
 
-    _prephdr($hdr);
+    $head->delete('Bcc');
 
     # Who is it to
 
-    my @rcpt = map { ref($_) ? @$_ : $_ } grep { defined } @opt{'To','Cc','Bcc'};
-    @rcpt = map { $hdr->get($_) } qw(To Cc Bcc)
-       unless @rcpt;
-    my @addr = map($_->address, Mail::Address->parse(@rcpt));
+    my @rcpt = map { ref $_ ? @$_ : $_ } grep { defined } @opt{'To','Cc','Bcc'};
+    @rcpt    = map { $head->get($_) } qw(To Cc Bcc)
+        unless @rcpt;
 
+    my @addr = map {$_->address} Mail::Address->parse(@rcpt);
+    #@addr or return ();
     return 'No valid destination addresses found!'
        unless(@addr);
 
-    $hdr->delete('Bcc'); # Remove blind Cc's
-
     # Send it
 
-    #warn "Headers: \n" . join('',@{$hdr->header});
-    #warn "Body: \n" . join('',@{$src->body});
-
-    my $ok = $smtp->mail( $envelope ) &&
-               $smtp->to(@addr) &&
-               $smtp->data(join("", @{$hdr->header},"\n",@{$src->body}));
+    my $ok = $smtp->mail($envelope)
+          && $smtp->to(@addr)
+          && $smtp->data(join("", @{$head->header}, "\n", @{$self->body}));
 
+    #$quit && $smtp->quit;
+    #$ok ? @addr : ();
     if ( $ok ) {
-      $smtp->quit
-          unless $noquit;
+      $quit && $smtp->quit;
       return '';
     } else {
       return $smtp->code. ' '. $smtp->message;
     }
-
 }
 package FS::Misc;
 #eokludge
@@ -487,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";
@@ -524,14 +534,87 @@ 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>) {
+    $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 = 30; #? should be more than enough
+
+  for ( 1, 2 ) {
+
+    local($SIG{CHLD}) = sub {};
+    #run( \@cmd, '>'=>'/dev/null', '2>'=>'/dev/null', timeout($timeout) )
+    run( \@cmd, 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;