Diff for /loncom/interface/printout.pl between versions 1.87 and 1.103

version 1.87, 2005/07/25 10:43:29 version 1.103, 2006/06/19 22:30:15
Line 28 Line 28
 use lib '/home/httpd/lib/perl';  use lib '/home/httpd/lib/perl';
 use LONCAPA::loncgi;  use LONCAPA::loncgi;
 use File::Path;  use File::Path;
   use File::Basename;
 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();
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
   
 use strict;  use strict;
   
   
 #  
 #   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.
 #  
 #  
 #Parameters:  #Parameters:
 #   course  - The course id.  #    none
 #   cdom    - The course domain.  
 #  
 #Implicit:  #Implicit:
 #    $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 {
     return (! $env{'request.role.adv'});      return ($env{'request.role'}=~/^st\./);
 }  }
   
 #  #
Line 111  sub send_error_mail { Line 107  sub send_error_mail {
  #  The user is a student in the course:   #  The user is a student in the course:
  #   #
   
  if (&is_student( $courseid, $coursedom)) {   if (&is_student()) {
     # 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 />";
   
Line 120  sub send_error_mail { Line 116  sub send_error_mail {
     my $subject  = "Error [$badurl] Print failed for $user".'@'.$domain;      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";      foreach my $resource (split(/:/,$resources)) {
    $message    .= "       $resource\n";
       }
     $message    .= "--------------------LaTeX logfile:------------ \n";      $message    .= "--------------------LaTeX logfile:------------ \n";
     $message    .= $logfile;      $message    .= $logfile;
     $message    .= "-----------------LaTeX source file: ------------\n";      $message    .= "-----------------LaTeX source file: ------------\n";
Line 163  END Line 161  END
 }  }
  &Apache::lonlocal::get_language_handle();   &Apache::lonlocal::get_language_handle();
  &Apache::loncommon::content_type(undef,'text/html');   &Apache::loncommon::content_type(undef,'text/html');
  my $bodytag=&Apache::loncommon::bodytag('Creating PDF','','');  
  print $bodytag;    print(&Apache::loncommon::start_page('Creating PDF'));
   
   my $identifier = $ENV{'QUERY_STRING'};    my $identifier = $ENV{'QUERY_STRING'};
   my $texfile = $env{'cgi.'.$identifier.'.file'};    my $texfile = $env{'cgi.'.$identifier.'.file'};
Line 179  END Line 177  END
   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 @names_pack=();    my @names_pack=();
   if ($student_names=~/_END_/) {      if ($student_names=~/_END_/) {  
       @names_pack=split(/_ENDPERSON_/,$student_names);        @names_pack=split(/_ENDPERSON_/,$student_names);
   }    }
   
   print "<a href=\"$backref\"><b>Return</b></a> to last resource.<br /><br />";
   
   my $figfile = $texfile;    my $figfile = $texfile;
   $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/;    $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/;
   my $duefile = $texfile;    my $duefile = $texfile;
Line 201  END Line 199  END
       close $temporary_file;          close $temporary_file;  
       my $noteps;        my $noteps;
       my %prog_state;        my %prog_state;
       if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Coverting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80');  }        if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Coverting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80');  }
         print('<br />');
       foreach my $not_eps (@content_of_file) {        foreach my $not_eps (@content_of_file) {
   chomp($not_eps);    chomp($not_eps);
   if ($not_eps ne '') {    if ($not_eps ne '') {
Line 231  END Line 230  END
       $not_eps =~ s/\s+$//;        $not_eps =~ s/\s+$//;
       $not_eps =~ s/ /\\ /g;        $not_eps =~ s/ /\\ /g;
       if ( exists($done_conversion{$not_eps})) { next; }        if ( exists($done_conversion{$not_eps})) { next; }
       if ($adv) {        if ($advanced_role) {
   my $prettyname=$not_eps;    my $prettyname=$not_eps;
   $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;    $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
   $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;    $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;
Line 240  END Line 239  END
       $done_conversion{$not_eps}=1;        $done_conversion{$not_eps}=1;
       # print "Converting $not_eps -> $eps_f"; # Debugging        # print "Converting $not_eps -> $eps_f"; # Debugging
       system("convert $not_eps $eps_f");        system("convert $not_eps $eps_f");
               #check is eps exist in prtspool                # check is eps exist in prtspool
               if(not -e $eps_f) {                if (not -e $eps_f) {
     # converting an animated gif creates either:
                     # anim.gif.eps.0
                     # or
                     # anim.gif-0.eps
   for (my $i=0;$i<10000;$i++) {    for (my $i=0;$i<10000;$i++) {
       if (-e $eps_f.'.'.$i) {        if (-e $eps_f.'.'.$i) {
   rename $eps_f.'.'.$i, $eps_f;    rename($eps_f.'.'.$i, $eps_f);
     last;
         }
         my $anim_eps = $eps_f;
         $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i;
         if (-e $anim_eps) {
     rename($anim_eps, $eps_f);
   last;    last;
       }        }
   }    }
       }          }
         # imagemagick 6.2.0-6.2.7 fails to properly handle
                 # convert anim.gif anim.gif.eps
                 # it creates anim.eps instead. 
                 if (not -e $eps_f) {
     my $eps_f2 = $eps_f;
     $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i;
     if(-e $eps_f2) {
         rename($eps_f2,$eps_f);
     }
         }
   
   }    }
       }        }
       if ($adv) {         if ($advanced_role) { 
   &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);     &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); 
       }        }
       unlink($figfile);        unlink($figfile);
Line 270  END Line 290  END
   
 my $ind=-1;  my $ind=-1;
 my %prog_state;  my %prog_state;
 print "<a href=\"$backref\"><b>Return</b></a> to last resource.<br /><br />";  if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); }
 if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); }  
 print "<br />";  print "<br />";
   my $num_files = @texfile;
 foreach $texfile (@texfile) {  foreach $texfile (@texfile) {
   my $status_statement='';    my $status_statement='';
   my $link_text='download PDF';    my $link_text='download PDF';
Line 280  foreach $texfile (@texfile) { Line 300  foreach $texfile (@texfile) {
   my @stud_info=split(/_END_/,$names_pack[$ind]);    my @stud_info=split(/_END_/,$names_pack[$ind]);
   my @tempo_array=split(/:/,$stud_info[0]);    my @tempo_array=split(/:/,$stud_info[0]);
   my $name;    my $name;
     my $name_range='';
   if ($tempo_array[3]) {    if ($tempo_array[3]) {
       $name=$tempo_array[3];        $name=$tempo_array[3];
         ($name_range) = split(/,/,$name, 2);
   } else {    } else {
       $name=$tempo_array[0].'@'.$tempo_array[1];        $name=$tempo_array[0].'@'.$tempo_array[1];
         $name_range = $tempo_array[0];
     }
     if (($name ne "") && ($name ne '@') ) { # Could be printing codes...
         $link_text='<b>'.$name.'</b>';
         $status_statement.=$name;
   }    }
   $link_text='<b>'.$name.'</b>';  
   $status_statement.=$name;  
   if ($#stud_info>0) {    if ($#stud_info>0) {
       @tempo_array=split(/:/,$stud_info[-1]);        @tempo_array=split(/:/,$stud_info[-1]);
       if ($tempo_array[3]) {        if ($tempo_array[3]) {
   $name=$tempo_array[3];    $name=$tempo_array[3];
     my ($lastname) = split(/,/, $name,2);
     $name_range .= "-".$lastname;
       } else {        } else {
   $name=$tempo_array[0].'@'.$tempo_array[1];    $name=$tempo_array[0].'@'.$tempo_array[1];
     $name_range .= '-'.$tempo_array[0];
         }
         if (($name ne "") && ($name ne '@')) {
     $link_text.=' - <b>'.$name.'</b>';
     $status_statement.=' -  '.$name;
     
       }        }
       $link_text.=' - <b>'.$name.'</b>';    }
       $status_statement.=' -  '.$name;    if(($num_files > 1) && ($link_text eq 'download PDF')) { # Printing codes
   }         $link_text = '<b>'.basename($texfile,'.tex').'.pdf</b>';
   if ($adv) { &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Creating PDF for '.$status_statement); }        $status_statement .= basename($texfile);
     }
     $name_range =~ s/'//g; # O'Neil -> ONeil e.g.
     print "<br/>";
     if ($advanced_role) { &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Creating PDF for '.$status_statement); }
     #  This little piece of dirt puts username ranges into the original tex
     #  Tex filename from which they'll propagate into the other filenames as well.
     #
   if (-e $texfile) {    if (-e $texfile) {
         if (($name_range ne '') && ($num_files > 1)) {
     my $newtexfile = $texfile;
     $newtexfile    =~ s/\.tex/$name_range\.tex/;
     rename($texfile, $newtexfile);
     $texfile       = $newtexfile;
         }
       $texfile =~ m/^(.*)\/([^\/]+)$/;         $texfile =~ m/^(.*)\/([^\/]+)$/; 
       my $name_file = $2;        my $name_file = $2;
       my $path_file = $1.'/';        my $path_file = $1.'/';
       chdir $path_file;        chdir $path_file;
       my $dvi_file= $name_file; $dvi_file =~ s/\.tex/\.dvi/;        my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/;
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement now LaTeXing file",   "for $status_statement now LaTeXing file",
  \%prog_state,$dvi_file);   \%prog_state,$dvi_file);
       if ($tableofcontents eq 'yes') {        if ($tableofcontents eq 'yes') {
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement now LaTeXing file for table of contents",   "for $status_statement First LaTeX of file for table of contents",
    \%prog_state,$dvi_file);
         &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
    "for $status_statement Second LaTeX of file for table of contents",
  \%prog_state,$dvi_file);   \%prog_state,$dvi_file);
       } #to create table of contents        } #to create table of contents
       my $idxname=$name_file;        my $idxname=$name_file;
Line 353  foreach $texfile (@texfile) { Line 402  foreach $texfile (@texfile) {
       print "It probably has errors in it.<br />";        print "It probably has errors in it.<br />";
       print "With very high probability this error occured in ".$badtext."<br /><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 /><pre>";        print "Here are the error messages in the LaTeX log file<br /><pre>";
   
       my $sygnal = 0;        my $sygnal = 0;
       for (my $i=0;$i<=$#content_of_file;$i++) {        for (my $i=0;$i<=$#content_of_file;$i++) {
   if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {    if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {
Line 384  foreach $texfile (@texfile) { Line 434  foreach $texfile (@texfile) {
       $texfile=~s/\/home\/httpd//;        $texfile=~s/\/home\/httpd//;
       print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";        print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
       print "\n";        print "\n";
         my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
         print ("$help_text");
   
   } else { # Student role...    } else { # Student role...
       #  at this point:        #  at this point:
       #    $body_log_file - contains the log file.        #    $body_log_file - contains the log file.
Line 395  foreach $texfile (@texfile) { Line 448  foreach $texfile (@texfile) {
       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, $badresource, $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 />"        print "<br />A message has been sent to the instructor describing this failure<br />";
         my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
         print  ("$help_text");
   
   }    }
   
       } elsif ($body_log_file=~m/<inserted text>/) {        } elsif ($body_log_file=~m/<inserted text>/) {
Line 420  foreach $texfile (@texfile) { Line 476  foreach $texfile (@texfile) {
      "for $status_statement now Converting to PS",       "for $status_statement now Converting to PS",
      \%prog_state,$new_name_file);       \%prog_state,$new_name_file);
   if (-e $new_name_file) {    if (-e $new_name_file) {
       print "<h1>PDF output file (see link below)</h1>\n";        my $latex_file = $name_file;
         $latex_file    =~ s/\.dvi/\.tex/;
         &repaginate($new_name_file, $latex_file, $numberofcolumns);
         #
         #  Now have to re-latex, re dvips again to 
         #  get the repaginated postscript.
         #
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement first latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement second latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement third latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
    "for $status_statement dvips to repaginate",
    \%prog_state, $new_name_file);
   
         print "\n<h1>PDF output file (see link below)</h1>\n";
       $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';
Line 494  foreach $texfile (@texfile) { Line 570  foreach $texfile (@texfile) {
      "for $status_statement now Converting to PS",       "for $status_statement now Converting to PS",
      \%prog_state,$new_name_file);       \%prog_state,$new_name_file);
   if (-e $new_name_file) {    if (-e $new_name_file) {
         my $latex_file = $name_file;
         $latex_file =~ s/\.dvi/\.tex/;
         &repaginate($new_name_file, $latex_file,  $numberofcolumns);
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement first latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement second latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
    "for $status_statement third latex to repaginate",
    \%prog_state, $name_file);
         &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
    "for $status_statement dvips to repaginate",
    \%prog_state, $new_name_file);
       print "<br />";        print "<br />";
       $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';
Line 571  if ($number_of_files>1) { Line 662  if ($number_of_files>1) {
     $zipfile=~s/\/home\/httpd//;      $zipfile=~s/\/home\/httpd//;
     print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";      print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";
 }  }
 if ($adv) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }  if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
   print(&Apache::loncommon::end_page());
 my $done;  my $done;
   
 sub REAPER {  sub REAPER {
     $done=1;      $done=1;
 }  }
Line 583  sub busy_wait_command { Line 675  sub busy_wait_command {
           
     $SIG{CHLD} = \&REAPER;      $SIG{CHLD} = \&REAPER;
     $done=0;      $done=0;
       print("<p> Doing : <tt>$command</tt>");
     my $pid=open(CMD,"$command |");      my $pid=open(CMD,"$command |");
     if ($adv) {      if ($advanced_role) {
  &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);   &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
     }      }
     while(!$done) {      while(!$done) {
Line 594  sub busy_wait_command { Line 687  sub busy_wait_command {
     my $size=(stat($output_file))[7];      my $size=(stat($output_file))[7];
     $extra_msg=", $size bytes generated";      $extra_msg=", $size bytes generated";
  }   }
  if ($adv) {   if ($advanced_role) {
     &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,      &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,
   $message.$extra_msg);    $message.$extra_msg);
  }   }
Line 602  sub busy_wait_command { Line 695  sub busy_wait_command {
     $SIG{CHLD}='IGNORE';      $SIG{CHLD}='IGNORE';
     close(CMD);      close(CMD);
 }  }
       print("<p> End</p>");
   
   #  Repagninate
   #  What we need to do:
   #   - Count the number of pages in each student.
   #   - Rewrite the latex file replacing the \specials that
   #     mark the end of student with an appropriate number of newlines.
   #   parameters:
   #     psfile     - Postscript filename
   #     latexfile  - LaTeX filename
   #     columns    - number of columns.
   sub repaginate {
   
       # We will try to do this in 2 passes through the postscript since
       # the postscript is potentially large, to do 2 passes, the first pass
       # must be able to calculate the total number of document pages so that
       # at the beginning of the second pass we already know how to replace
       #  %%Pages:
   
       #  Figure out
       #    1. Number of pages in the document
       #    2. Maximum number of pages in a student
       #    3. Number of pages in each student.
   
       my ($postscript_filename, $latex_filename, $num_columns) = @_;
       open(PSFILE, "<$postscript_filename");
       my $line;
       my $total_pages; # Total pages in document.
       my $seen_pages        = 0; # There are several %%Pages only the first is useful
       my $student_number    = 0; # Index of student we're working on.
       my @pages_in_student; # For each student his/her initial page count.
       my $max_pages = 0; # Pages in 'longest' student.
       my $page_number = 0;
       while ($line = <PSFILE>) {
   
    # Check for total pages (%%Pages:)
   
    if (($line =~ /^%%Pages:/) && (!$seen_pages)) {
       my @pageinfo = split(/ /,$line);
       $total_pages = $pageinfo[1];
       $seen_pages  = 1;
    }
    #  Check for %%Page: n m  $page_number will be the
    #  biggest of these until we see an endofstudent.
    #  Note that minipages generate spurious %Page: 1 1's so
    #  we only are looking for the largest n (n is page number at the
    #  bottom of the page, m the page number within the document.
    #
   
    if ($line =~ /^%%Page:/) {
       my @pageinfo = split(/ /, $line);
       if ($page_number < $pageinfo[1]) {
    $page_number = $pageinfo[1];
       }
    }
    #  ENDOFSTUDENTSTAMP - save the page_number, reset and, if necessary
    #                      udpate max_pages.
    #
    if ($line =~ /ENDOFSTUDENTSTAMP/) {
       $pages_in_student[$student_number] = $page_number;
       $student_number++;
   
       if ($page_number > $max_pages) {
    $max_pages = $page_number;
       }
       $page_number = 0;
     
    }
   
   
       }
       close(PSFILE);
   
       #  If 2 columns, max_pages must go to an even number of columns:
   
       &Apache::lonnet::logthis("Before 2 col adjust max-pages = $max_pages");
      
       if ($num_columns == 2) {
    if ($max_pages % 2) {
       $max_pages++;
    }
       }
       &Apache::lonnet::logthis("after adjust: $max_pages");
       
       #  Now rewrite the LaTex file, substituting our \special
       #  with an appropriate number of \newpage directives.
   
       my $outfilename = $latex_filename."temp";
   
       open(LATEXIN, "<$latex_filename");
       open(LATEXOUT, ">$outfilename");
   
   
       $student_number = 0; # first student...
   
       while (my $line = <LATEXIN>) {
    if ($line eq "\\special{ps:ENDOFSTUDENTSTAMP}\n") {
       # only end of student stamp if next line is ENDOFSTUDENTSTAMP:
   
   
       # End of student replace with 0 or more newpages.
       
       my $addlines = $max_pages - $pages_in_student[$student_number];
       &Apache::lonnet::logthis("student: $pages_in_student[$student_number] add: $addlines");
       while($addlines)  {
    print LATEXOUT '\pagebreak';
    $addlines--;
       }
       
       $student_number++;
       
    } else {
       print LATEXOUT $line;
    }
       }
   
       close(LATEXIN);
       close(LATEXOUT);
      rename($outfilename, $latex_filename);
   
   }
   

Removed from v.1.87  
changed lines
  Added in v.1.103


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.