--- loncom/xml/run.pm 2005/02/28 22:17:09 1.51 +++ loncom/xml/run.pm 2015/06/23 02:52:20 1.64 @@ -1,6 +1,6 @@ package Apache::run; # -# $Id: run.pm,v 1.51 2005/02/28 22:17:09 albertel Exp $ +# $Id: run.pm,v 1.64 2015/06/23 02:52:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,7 @@ package Apache::run; # use HTML::Entities; +use Apache::lonlocal; $Apache::run::EVALUATE_STRING=<<'ENDEVALUATE'; my %_LONCAPA_INTERNAL_oldexpressions=(); @@ -50,6 +51,7 @@ while (!$_LONCAPA_INTERNAL_oldexpression my $__LC__prefix; my $__LC__result; while (1) { + if ($__LC__a =~ m-^&(theta|pi|rho)$-) { last; } { use strict; no strict "vars"; @@ -77,7 +79,7 @@ sub evaluate { my $result = ''; $@=''; $Apache::run::timeout=0; - $main::SIG{'ALRM'} = sub { + local $main::SIG{'ALRM'} = sub { $Apache::run::timeout=1; die("timeout"); }; @@ -94,20 +96,20 @@ sub evaluate { $result = $safeeval->reval('return $_;'); chomp $result; } else { - if ($Apache::run::timeout) { - $error = 'Code ran too long. It ran for more than '. - $Apache::lonnet::perlvar{'lonScriptTimeout'}.' seconds'; - } - &Apache::lonxml::error('substitution on <pre>'. - &HTML::Entities::encode($expression,'<>&"'). - '</pre> with <pre>'. - &HTML::Entities::encode($decls,'<>&"'). - '</pre> caused <pre>'. - &HTML::Entities::encode($error,'<>&"').' '. - &HTML::Entities::encode($innererror,'<>&"'). - '</pre>'); + if ($Apache::run::timeout) { + $error = + &mt('Code ran too long. It ran for more than [_1] seconds.', + $Apache::lonnet::perlvar{'lonScriptTimeout'}); + } + &Apache::lonxml::error( + &mt('Substitution on [_1] with [_2] caused:', + '<pre>'. &HTML::Entities::encode($expression,'<>&"').'</pre>', + '<pre>'.&HTML::Entities::encode($decls,'<>&"').'</pre>') + .'<br />' + .'<pre>'.&HTML::Entities::encode($error,'<>&"').' ' + .&HTML::Entities::encode($innererror,'<>&"').'</pre>'); } - return $result + return $result; } sub run { @@ -115,7 +117,7 @@ sub run { my @result; $@=''; $Apache::run::timeout=0; - $main::SIG{'ALRM'} = sub { + local $main::SIG{'ALRM'} = sub { $Apache::run::timeout=1; die("timeout"); }; @@ -128,22 +130,27 @@ sub run { }; my $error=$@; if (($Apache::run::timeout || $error ne '' || $innererror ne '') && !$hideerrors) { - if ($Apache::run::timeout) { - $error = 'Code ran too long. It ran for more than '. - $Apache::lonnet::perlvar{'lonScriptTimeout'}.' seconds'; - } - my $errormsg='<pre>'.&HTML::Entities::encode($error,'<>&"').' '. - &HTML::Entities::encode($innererror,'<>&"'). - '</pre> occured while running <pre>'; - $code=&HTML::Entities::encode($code,'<>&"'); - if ($innererror=~/line (\d+)/) { - my $linenumber=$1; - my @code=split("\n",$code); - $code[$linenumber-1]='<b><font color="red">'. - $code[$linenumber-1].'</font></b>'; - $code=join("\n",@code); - } - &Apache::lonxml::error($errormsg.$code.'</pre>'); + if ($Apache::run::timeout) { + $error = &mt('Code ran too long. It ran for more than [_1] seconds.', + $Apache::lonnet::perlvar{'lonScriptTimeout'}); + } + $code=&HTML::Entities::encode($code,'<>&"'); + if ($innererror=~/line (\d+)/) { + my $linenumber=$1; + my @code=split("\n",$code); + if ($linenumber < scalar(@code)) { + $code[$linenumber-1]= + '<span style="color:red;font-weight:bold;">'. + $code[$linenumber-1].'</span>'; + } + $code=join("\n",@code); + } + &Apache::lonxml::error( + '<pre>'.&HTML::Entities::encode($error,'<>&"').' '. + &HTML::Entities::encode($innererror,'<>&"'). + '</pre>' + .&mt('This occurred while running: [_1]', + '<pre>'.$code.'</pre>')); } if ( $#result < '1') { return $result[0]; @@ -156,27 +163,28 @@ sub run { sub dump { my ($target,$safeeval)=@_; my $dump=''; - foreach my $symname (sort keys %{$safeeval->varglob('main::')}) { - if (($symname!~/^\_/) && ($symname!~/\:$/)) { + foreach my $symname (sort(keys(%{$safeeval->varglob('main::')}))) { + if (($symname!~ /^(INC|SIG)/) && ($symname!~/\027/) && ($symname!~/\022/) && + ($symname!~/^\_/) && ($symname!~/\:$/)) { my $line; if ($safeeval->reval('defined($'.$symname.')')) { if ($symname =~ /^\w/) { $line.='$'.$symname.'='.$safeeval->reval('$'.$symname)."\n"; } } - if ($safeeval->reval('defined(@'.$symname.')')) { + if ($safeeval->reval('@'.$symname)) { $line.='@'.$symname.'=('. $safeeval->reval('join(",",@'.$symname.')').")"."\n"; } - if ($safeeval->reval('defined(%'.$symname.')')) { + if ($safeeval->reval('%'.$symname)) { $line.='%'.$symname.'=('; $line.=$safeeval->reval('join(",",map { $_."=>".$'. - $symname.'{$_} } sort keys %'. - $symname.')').")"."\n" - } + $symname.'{$_} } sort(keys(%'. + $symname.')))').")"."\n"; + } if ($line ne '') { $line=&HTML::Entities::encode($line,'<>&"'); - $line=~s|\n|<br />|; + $line=~s|\n|<br />|g; $dump.=$line; } } @@ -187,3 +195,29 @@ sub dump { 1; __END__; + +=pod + +=head1 NAME + +Apache::run.pm + +=head1 SYNOPSIS + +Used to prevent poorly written problems from +causing lingering after effects + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 NOTABLE SUBROUTINES + +=over + +=item run(), dump(), evaluate() + +=back + +=cut +