Diff for /loncom/interface/printout.pl between versions 1.77 and 1.83

version 1.77, 2005/05/02 21:57:44 version 1.83, 2005/07/05 10:23:35
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
 # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.  # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
 #  #
 # $Id$  
 #  #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
Line 32  use File::Path; Line 31  use File::Path;
 use IO::File;  use IO::File;
 use Image::Magick;  use Image::Magick;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg;  use Apache::lonmsg;
Line 40  use LONCAPA::Enrollment; Line 39  use LONCAPA::Enrollment;
   
 use strict;  use strict;
   
 #  Get the list of course coordinators authorized on this course:  
 #Parameters:  
 #    id   - Course id.  
 #    dom  - Domain of course.  
 #Returns:  
 #   A (possibly empty) list of course coordinators.  Each course coordinator  
 #   is given as user:domain  
 #  
 sub get_cc_list {  
     my ($id, $dom) = @_;  
     my @personel = &Apache::lonnet::getkeys('nohist_userroles', $dom, $id);  
     my @coordinators;  
     foreach my $person (@personel) {  
  my @info = split(/:/, $person);  
  my $role = $info[0];  
  my $user = $info[1];  
  my $udom = $info[2];  
  if ($role eq 'cc') {  
     my $isactive = &LONCAPA::Enrollment::check_user_status($udom, $user, $dom, $id, 'cc');  
     if ($isactive eq 'ok') {  
  push @coordinators, $user.':'.$udom;  
     }  
  }  
     }  
     return (@coordinators);  
 }  
 #  #
 #   Determine if a user is operating as a student for this course/domain.  #   Determine if a user is operating as a student for this course/domain.
 #  #
Line 78  sub get_cc_list { Line 52  sub get_cc_list {
 #    $env{request.role} contains the role under which this user operated this  #    $env{request.role} contains the role under which this user operated this
 #                       this request.  #                       this request.
 sub is_student {  sub is_student {
     my ($course, $cdom) = @_;      return (! $env{'request.role.adv'});
     my $active_role = $env{'request.role'};  
     my @role_fields = split(/\//, $active_role);   
   
   
     if ( ($role_fields[0] eq 'st.') && ($role_fields[1] eq $cdom) &&  
  ($role_fields[2] eq $course)) {  
  return 1;  
     } else {  
  return 0;  
     }  
   
   
 }  }
   
 #  #
Line 110  sub dumpenv  { Line 72  sub dumpenv  {
 #   a student printing inside a course results in messages to the course coordinator.  #   a student printing inside a course results in messages to the course coordinator.
 #Parmaeters:  #Parmaeters:
 #    identifier -  The unique identifier of this cgi request.  #    identifier -  The unique identifier of this cgi request.
   #    badresource-  Filepath to most likely failing 
 #    logfile    -  The contents of the log file (included in the message).  #    logfile    -  The contents of the log file (included in the message).
 #    texfile    -  reference to an array containing the LaTeX input file  #    texfile    -  reference to an array containing the LaTeX input file
 #                  (included in the message).  #                  (included in the message).
Line 123  sub dumpenv  { Line 86  sub dumpenv  {
 #                                  was attempted.  #                                  was attempted.
 #   # 
 sub send_error_mail {  sub send_error_mail {
     my ($identifier,$logfile, $texfile) = @_;      my ($identifier, $badresource, $logfile, $texfile) = @_;
     my $user     = $env{"cgi.$identifier.user"};      my $user     = $env{"cgi.$identifier.user"};
     my $domain   = $env{"cgi.$identifier.domain"};      my $domain   = $env{"cgi.$identifier.domain"};
     my $courseid = $env{"cgi.$identifier.courseid"};      my $courseid = $env{"cgi.$identifier.courseid"};
     my $coursedom= $env{"cgi.$identifier.coursedom"};      my $coursedom= $env{"cgi.$identifier.coursedom"};
     my $resources= $env{"cgi.$identifier.resources"};      my $resources= $env{"cgi.$identifier.resources"};
   
    # &dumpenv();      #  resource file->URL
       #
       my $badurl = &Apache::lonnet::declutter($badresource);
   
       # &dumpenv();
   
   
   
Line 140  sub send_error_mail { Line 107  sub send_error_mail {
     if(defined($user)       && defined($domain) && defined($courseid) &&      if(defined($user)       && defined($domain) && defined($courseid) &&
        defined($coursedom)  && defined($resources) ){         defined($coursedom)  && defined($resources) ){
         
  my @cclist = &get_cc_list($courseid, $coursedom);  
   
  #  Only mail if the conditions are ripe for it:   #  Only mail if the conditions are ripe for it:
  #  The user is a student in the course:   #  The user is a student in the course:
  #   #
   
  if (&is_student( $courseid, $coursedom)) {   if (&is_student( $courseid, $coursedom)) {
     # build the subject and message body:      # build the subject and message body:
     print "sending message to course coordinators.<br>";      # print "sending message to course coordinators.<br>";
       
     my $subject  = "Print failed for $user".'@'.$domain;      # Todo: Convert badurl into a url from file path:
   
       my $subject  = "Error [$badurl] Print failed for $user".'@'.$domain;
     my $message .= "Print failed to render LaTeX for $user".'@'."$domain\n";      my $message .= "Print failed to render LaTeX for $user".'@'."$domain\n";
     $message    .= "  User was attempting to print: \n";      $message    .= "  User was attempting to print: \n";
     $message    .= "       $resources\n";      $message    .= "       $resources\n";
Line 161  sub send_error_mail { Line 128  sub send_error_mail {
     foreach my $line (@$texfile) {      foreach my $line (@$texfile) {
  $message .= "$line\n";   $message .= "$line\n";
     }      }
     foreach my $dest (@cclist) {      my (undef, %receivers) = &Apache::lonfeedback::decide_receiver(undef, 0,
     1,1,1);
       # print "<BR> sending...section:  $env{'request.course.sec'}";
       foreach my $dest (keys %receivers) {
    # print "<BR> dest is $dest";
  my @destinfo = split(/:/,$dest);   my @destinfo = split(/:/,$dest);
  my $user = $destinfo[0];   my $user = $destinfo[0];
  my $dom  = $destinfo[1];   my $dom  = $destinfo[1];
Line 201  END Line 172  END
   my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'};    my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'};
   my $paper = $env{'cgi.'.$identifier.'.paper'};    my $paper = $env{'cgi.'.$identifier.'.paper'};
   my $selectionmade = $env{'cgi.'.$identifier.'.selection'};    my $selectionmade = $env{'cgi.'.$identifier.'.selection'};
   my $tableofcontents = $env{'cgi.'.$identifier.'tableofcontents'};    my $tableofcontents = $env{'cgi.'.$identifier.'.tableofcontents'};
   my $tableofindex = $env{'cgi.'.$identifier.'tableofindex'};    my $tableofindex = $env{'cgi.'.$identifier.'.tableofindex'};
   my $advanced_role = $env{'cgi.'.$identifier.'role'};    my $advanced_role = $env{'cgi.'.$identifier.'.role'};
   my $number_of_files = $env{'cgi.'.$identifier.'numberoffiles'}+1;    my $number_of_files = $env{'cgi.'.$identifier.'.numberoffiles'}+1;
   my $student_names = $env{'cgi.'.$identifier.'studentnames'};    my $student_names = $env{'cgi.'.$identifier.'.studentnames'};
   my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'backref'});    my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'.backref'});
   
   
   my $adv = $env{'request.role.adv'};    my $adv = $env{'request.role.adv'};
Line 359  foreach $texfile (@texfile) { Line 330  foreach $texfile (@texfile) {
       $temporary_file = IO::File->new('>'.$logfilename);         $temporary_file = IO::File->new('>'.$logfilename); 
       print $temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_log_file.'</pre></body></html>'."\n";        print $temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_log_file.'</pre></body></html>'."\n";
       if ($body_log_file=~m/!\s+Emergency stop/) {        if ($body_log_file=~m/!\s+Emergency stop/) {
   #LaTeX failed to parse tex file   
   print "<h2>LaTeX could not successfully parse your tex file.</h2>";  
   print "It probably has errors in it.<br />";  
   my $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART';    my $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART';
   my $whereitends = rindex $body_log_file,'STAMPOFPASSEDRESOURCEEND';    my $whereitends = rindex $body_log_file,'STAMPOFPASSEDRESOURCEEND';
     my $badresource;
     my $badtext;
   if ($whereitbegins!=-1 and $whereitends!=-1) {    if ($whereitbegins!=-1 and $whereitends!=-1) {
        print "With very high probability this error occured in ".substr($body_log_file,$whereitbegins+26,$whereitends-$whereitbegins-26)."<br /><br />";        $badtext = substr($body_log_file,$whereitbegins+26, $whereitends-$whereitbegins-26);
   }        $whereitbegins  = rindex $badtext,'located in';
   print "Here are the error messages in the LaTeX log file</br><br /><pre>";        if ($whereitbegins != -1) {
   my $sygnal = 0;    
   for (my $i=0;$i<=$#content_of_file;$i++) {    $badresource = substr($badtext, $whereitbegins+27, 
       if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {   length($badtext) - $whereitbegins - 48);
   $sygnal = 1;    # print "<BR>failing resourcename: $badresource<BR>";
       }         }
       if ($content_of_file[$i]=~m/Here is how much of/) {  
   $sygnal = 0;  
       }   
       if ($sygnal) {  
   print "$content_of_file[$i]";  
       }    
   }    }
   print "</pre>\n";    
           if ($advanced_role) {              if ($advanced_role) {  
       print "<br> Advanced role <br>";        #LaTeX failed to parse tex file 
         print "<h2>LaTeX could not successfully parse your tex file.</h2>";
         print "It probably has errors in it.<br />";
         print "With very high probability this error occured in ".$badtext."<br /><br />";
         print "Here are the error messages in the LaTeX log file</br><br /><pre>";
         my $sygnal = 0;
         for (my $i=0;$i<=$#content_of_file;$i++) {
     if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {
         $sygnal = 1;
     } 
     if ($content_of_file[$i]=~m/Here is how much of/) {
         $sygnal = 0;
     } 
     if ($sygnal) {
         print "$content_of_file[$i]";
     }  
         }
         print "</pre>\n";
         # print "<br> Advanced role <br>";
               print "<b><big>The link to ";                print "<b><big>The link to ";
               $logfilename=~s/\/home\/httpd//;                $logfilename=~s/\/home\/httpd//;
       print "<a href=\"$logfilename\">Your log file </a></big></b>";        print "<a href=\"$logfilename\">Your log file </a></big></b>";
Line 406  foreach $texfile (@texfile) { Line 388  foreach $texfile (@texfile) {
               #    $name_file     - is the name of the LaTeX file.                #    $name_file     - is the name of the LaTeX file.
               #    $identifier    - is the unique LaTeX identifier.l                #    $identifier    - is the unique LaTeX identifier.l
   
         print "<br>There are errors in $badtext";
         print "<br>These errors prevent this resource from printing correctly";
       my $tex_handle = IO::File->new($name_file);        my $tex_handle = IO::File->new($name_file);
       my @tex_contents = <$tex_handle>;        my @tex_contents = <$tex_handle>;
       &send_error_mail($identifier, $body_log_file, \@tex_contents);        &send_error_mail($identifier, $badresource, $body_log_file, \@tex_contents);
         print "<br>A message has been sent to the instructor describing this failure<br>"
   }    }
   
       } elsif ($body_log_file=~m/<inserted text>/) {        } elsif ($body_log_file=~m/<inserted text>/) {
Line 438  foreach $texfile (@texfile) { Line 423  foreach $texfile (@texfile) {
       my $ps_file = my $tempo_file = $1.'temporar.ps';        my $ps_file = my $tempo_file = $1.'temporar.ps';
       my $pdf_file = $1.'.pdf';        my $pdf_file = $1.'.pdf';
       if ($laystyle eq 'album' and $numberofcolumns eq '2') {        if ($laystyle eq 'album' and $numberofcolumns eq '2') {
   $comma = "psnup -2 -s1.0 $new_name_file";    my $papera=$paper;
                     if ($papera eq 'letter') {$papera='';}
     if ($papera ne '') {$papera='-p'.$papera;}
     $comma = "psnup $papera -2 -s1.0 $new_name_file";
   &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null",    &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Modifying PS layout",       "for $status_statement now Modifying PS layout",
      \%prog_state,$tempo_file);        \%prog_state,$tempo_file); 
Line 508  foreach $texfile (@texfile) { Line 496  foreach $texfile (@texfile) {
       $new_name_file =~ m/^(.*)\./;        $new_name_file =~ m/^(.*)\./;
       my $ps_file = my $tempo_file = $1.'temporar.ps';        my $ps_file = my $tempo_file = $1.'temporar.ps';
       my $pdf_file = $1.'.pdf';        my $pdf_file = $1.'.pdf';
         $papera=~s/t/p/;
       if ($laystyle eq 'album' and $numberofcolumns eq '2') {        if ($laystyle eq 'album' and $numberofcolumns eq '2') {
   $comma = "psnup -2 -s1.0 $new_name_file";    $comma = "psnup $papera -2 -s1.0 $new_name_file";
   &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null",    &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Modifying PS layout",       "for $status_statement now Modifying PS layout",
      \%prog_state,$tempo_file);       \%prog_state,$tempo_file);
       } elsif ($laystyle eq 'book' and $numberofcolumns eq '2') {        } elsif ($laystyle eq 'book' and $numberofcolumns eq '2') {
   $papera=~s/t/p/;  
   $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"';    $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"';
   &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null",    &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Modifying PS layout",       "for $status_statement now Modifying PS layout",

Removed from v.1.77  
changed lines
  Added in v.1.83


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.