--- loncom/interface/printout.pl 2005/03/23 22:37:46 1.75 +++ loncom/interface/printout.pl 2005/05/02 21:57:44 1.77 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.75 2005/03/23 22:37:46 albertel Exp $ +# $Id: printout.pl,v 1.77 2005/05/02 21:57:44 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,7 +27,7 @@ # use lib '/home/httpd/lib/perl'; -use LONCAPA::loncgi(); +use LONCAPA::loncgi; use File::Path; use IO::File; use Image::Magick; @@ -35,10 +35,148 @@ use Apache::lonhtmlcommon; use Apache::lonnet(); use Apache::loncommon; use Apache::lonlocal; +use Apache::lonmsg; +use LONCAPA::Enrollment; 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. +# +# +#Parameters: +# course - The course id. +# cdom - The course domain. +# +#Implicit: +# $env{request.role} contains the role under which this user operated this +# this request. +sub is_student { + my ($course, $cdom) = @_; + 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; + } + + +} + +# +# Debugging: Dump the environment for debugging. +# +sub dumpenv { + print "
-------------------
"; + foreach my $key (sort (keys %env)) { + print "
$key -> $env{$key}"; + } + print "
-------------------
"; +} + +# +# This sub sends a message to the appropriate person if there was an error +# rendering the latex At present, there's only one case to consider: +# a student printing inside a course results in messages to the course coordinator. +#Parmaeters: +# identifier - The unique identifier of this cgi request. +# logfile - The contents of the log file (included in the message). +# texfile - reference to an array containing the LaTeX input file +# (included in the message). +#Implicit inputs: +# From the environment: +# cgi.$identifier.user - User doing the printing. +# cgi.$identifier.domain - Domain the user is logged in on with printing. +# cgi.$identifier.courseid - Id of the course (if this is a course). +# cgi.$identifier.coursedom- Domain in which course was constituted. +# cgi.$identifier.resources - List of resource URL's for which the print +# was attempted. +# +sub send_error_mail { + my ($identifier,$logfile, $texfile) = @_; + my $user = $env{"cgi.$identifier.user"}; + my $domain = $env{"cgi.$identifier.domain"}; + my $courseid = $env{"cgi.$identifier.courseid"}; + my $coursedom= $env{"cgi.$identifier.coursedom"}; + my $resources= $env{"cgi.$identifier.resources"}; + + # &dumpenv(); + + + + # Only continue if there is a user, domain, courseid, course domain + # and resources: + + if(defined($user) && defined($domain) && defined($courseid) && + defined($coursedom) && defined($resources) ){ + + my @cclist = &get_cc_list($courseid, $coursedom); + + # Only mail if the conditions are ripe for it: + # The user is a student in the course: + # + + if (&is_student( $courseid, $coursedom)) { + # build the subject and message body: + print "sending message to course coordinators.
"; + + my $subject = "Print failed for $user".'@'.$domain; + my $message .= "Print failed to render LaTeX for $user".'@'."$domain\n"; + $message .= " User was attempting to print: \n"; + $message .= " $resources\n"; + $message .= "--------------------LaTeX logfile:------------ \n"; + $message .= $logfile; + $message .= "-----------------LaTeX source file: ------------\n"; + + foreach my $line (@$texfile) { + $message .= "$line\n"; + } + foreach my $dest (@cclist) { + my @destinfo = split(/:/,$dest); + my $user = $destinfo[0]; + my $dom = $destinfo[1]; + + &Apache::lonmsg::user_normal_msg($user, $dom, + $subject, $message); + + # No point in looking at the return status as there's no good + # error action I can think of right now (log maybe?). + } + } + } +} + $|=1; -my %origENV=%ENV; if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { print <\n"; if ($advanced_role) { + print "
Advanced role
"; print "The link to "; $logfilename=~s/\/home\/httpd//; print "Your log file "; @@ -263,6 +400,15 @@ foreach $texfile (@texfile) { $texfile=~s/\/home\/httpd//; print "Your original LaTeX file "; print "\n"; + } else { # Student role... + # at this point: + # $body_log_file - contains the log file. + # $name_file - is the name of the LaTeX file. + # $identifier - is the unique LaTeX identifier.l + + my $tex_handle = IO::File->new($name_file); + my @tex_contents = <$tex_handle>; + &send_error_mail($identifier, $body_log_file, \@tex_contents); } } elsif ($body_log_file=~m//) {