Parent Directory
|
Revision Log
Changes made to simplify the implementation of XMLRPC access to the functionality of WeBWorK. There is still a problem with making sure that the proper warning mechanism is passed into the problem rendering compartment. The proper permissions for creating directories also does not get transmitted properly. I would like to change the way that the defineEnvirVars subroutine is passed into the Local.pm object. I'd like to either pass the environment as a hash or explicitly pass a reference to define EnvirVars rather than inherit it from PG. In particular I'd like to be able to define environment variables directly in RenderProblem.pm instead of faking it by defining fake problem objects.
1 #!/usr/local/bin/perl -w 2 3 # Copyright (C) 2002 Michael Gage 4 5 ############################################################################### 6 # Web service which translates TeX to pdf or to HTML 7 ############################################################################### 8 9 #use lib '/home/gage/webwork/pg/lib'; 10 #use lib '/home/gage/webwork/webwork-modperl/lib'; 11 12 package WebworkWebservice::MathTranslators; 13 use WebworkWebservice; 14 use base qw(WebworkWebservice); 15 16 use strict; 17 use sigtrap; 18 use Carp; 19 use Safe; 20 use Apache; 21 use WeBWorK::PG::Translator; 22 use WeBWorK::PG::IO; 23 use Benchmark; 24 use MIME::Base64 qw( encode_base64 decode_base64); 25 26 27 28 our $WW_DIRECTORY = $WebworkWebservice::WW_DIRECTORY; 29 our $PG_DIRECTORY = $WebworkWebservice::PG_DIRECTORY; 30 our $COURSENAME = $WebworkWebservice::COURSENAME; 31 our $HOST_NAME = $WebworkWebservice::HOST_NAME; 32 33 our $ce =$WebworkWebservice::SeedCE; 34 # create a local course environment for some course 35 $ce = WeBWorK::CourseEnvironment->new($WW_DIRECTORY, "", "", $COURSENAME); 36 37 38 39 my $debugOn = 1; 40 my $PASSWORD = $WebworkWebservice::PASSWORD; 41 42 43 my $TEMPDIRECTORY = $ce->{webworkDirs}->{htdocs_temp}; 44 my $TEMP_BASE_URL = $ce->{webworkURLs}->{htdocs_temp}; 45 my $externalLatexPath = $ce->{externalPrograms}->{latex}; 46 # my $externalDvipsPath = $Global::externalDvipsPath; 47 my $externalpdflatexPath = $ce->{externalPrograms}->{pdflatex};; 48 # my $externalGsPath = $Global::externalGsPath; 49 50 51 # variables formerly set in Global 52 $Global::tmp_directory_permission = 0775; 53 $Global::numericalGroupID='100'; # group ID for wwdev 54 55 my $tmp_directory_permission = $Global::tmp_directory_permission; 56 my $numericalGroupID = $Global::numericalGroupID; # group ID for webadmin 57 58 sub tex2pdf { 59 60 my $rh = shift; 61 local($|) = 1; 62 my $out = {}; 63 unless ($rh->{pw} eq $PASSWORD ) { 64 $out->{error} = 404; 65 return($out); 66 } 67 #obtain the path to the file 68 my $filePath = $rh->{fileName}; 69 my @pathElements = split("/", $filePath); 70 71 # grab the last element as the fileName 72 #remove the extension from the file name 73 my $fileName = pop @pathElements; 74 $fileName =~ s/\.pg$//; 75 76 #Create the full url and the full directory path -- If pathElements is empty this can give an extra //? Should I worry? maybe 77 my $url = $TEMP_BASE_URL. join("/",@pathElements); 78 $url .= '/' unless $url =~ m|/$|; # only add / if it is needed. 79 $url .= "$fileName.pdf"; 80 my $texFileBasePath = $TEMPDIRECTORY.join("/",@pathElements); 81 $texFileBasePath .= '/' unless $texFileBasePath =~ m|/$|; 82 $texFileBasePath .= "$fileName"; 83 84 # create the intermediate directories if they don't exists 85 # create a dummy .pdf file 86 surePathToTmpFile2($texFileBasePath.'.pdf'); 87 # my $filePermission = '0775'; 88 # chmod("$filePermission","$texFileBasePath.pdf") 89 # or die "Can't change file permissions on $texFileBasePath.pdf to $filePermission"; 90 91 # Decode and cleanup the tex string 92 my $texString = decode_base64( $rh->{'texString'}); 93 #Make sure the line endings are correct 94 $texString=~s/\r\n/\n/g; 95 $texString=~s/\r/\n/g; 96 97 # Make sure that TeX is run in batchmode so that the tex program doesn't hang on errors 98 $texString = "\\batchmode\n".$texString; # force errors to log. 99 100 # Remove any old files 101 unlink("$texFileBasePath.tex","$texFileBasePath.dvi","$texFileBasePath.log","$texFileBasePath.aux", 102 "$texFileBasePath.ps","$texFileBasePath.pdf"); 103 # Create the texfile of the problem. 104 local(*TEX); 105 open(TEX,"> $texFileBasePath.tex") or die "Can't open $texFileBasePath.tex to store tex code"; 106 local($/)=undef; 107 print TEX $texString; 108 close(TEX); 109 110 111 # my $dviCommandLine = "$externalLatexPath $texFileBasePath.tex";# >/dev/null 2>/dev/null"; 112 # my $psCommandLine = "$externalDvipsPath -o $texFileBasePath.ps $texFileBasePath.dvi >/dev/null";# 2>/dev/null"; 113 # my $pdfCommandLine = "$externalGsPath -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$texFileBasePath.pdf -c save pop -f $texFileBasePath.ps"; 114 # print "dviCommandLine: $dviCommandLine\n"; 115 # print "psCommandLine: $psCommandLine\n"; 116 # print "pdfCommandLine: $pdfCommandLine\n"; 117 #print "execute pdflatex", `$externalpdflatexPath $texFileBasePath.tex`, "\n"; 118 #print "done $externalpdflatexPath $texFileBasePath.tex\n"; 119 # Change to the working directory and create the pdf files. 120 my $wd = $TEMPDIRECTORY.join("/",@pathElements); # working directory 121 # print "---cd $wd && $externalpdflatexPath $fileName.tex\n"; 122 123 system "cd $wd && $externalpdflatexPath $fileName.tex >>$fileName.log"; 124 chmod 0777, "$texFileBasePath.pdf"; 125 unless ($debugOn) { 126 unlink("$texFileBasePath.tex","$texFileBasePath.log","$texFileBasePath.aux", 127 ); 128 } 129 return({pdfURL => $url}); 130 131 132 133 134 } 135 136 sub surePathToTmpFile2 { # constructs intermediate directories if needed beginning at ${Global::htmlDirectory}tmp/ 137 # the input path must be either the full path, or the path relative to this tmp sub directory 138 my $path = shift; 139 my $delim = getDirDelim(); 140 my $tmpDirectory = $TEMPDIRECTORY; 141 # if the path starts with $tmpDirectory (which is permitted but optional) remove this initial segment 142 print "Original path $path\n"; 143 $path =~ s|^$tmpDirectory|| if $path =~ m|^$tmpDirectory|; 144 $path = convertPath($path); 145 print "Creating path to $path using $delim\n"; 146 # find the nodes on the given path 147 my @nodes = split("$delim",$path); 148 # create new path 149 $path = convertPath("$tmpDirectory"); 150 print "Creating path: $path\n "; 151 while (@nodes>1 ) { 152 153 $path = convertPath($path . shift (@nodes) ."/"); 154 print "Creating path: $path\n "; 155 unless (-e $path) { 156 # system("mkdir $path"); 157 createDirectory($path,$tmp_directory_permission, $numericalGroupID) || 158 die "Failed to create directory $path"; 159 160 } 161 162 } 163 $path = convertPath($path . shift(@nodes)); 164 print "Creating path: $path\n "; 165 # system(qq!echo "" > $path! ); 166 167 $path; 168 169 } 170 171 172 sub pretty_print_rh { 173 my $rh = shift; 174 my $out = ""; 175 my $type = ref($rh); 176 if ( ref($rh) =~/HASH/ ) { 177 foreach my $key (sort keys %{$rh}) { 178 $out .= " $key => " . pretty_print_rh( $rh->{$key} ) . "\n"; 179 } 180 } elsif ( ref($rh) =~ /SCALAR/ ) { 181 $out = "scalar reference ". ${$rh}; 182 } elsif ( ref($rh) =~/Base64/ ) { 183 $out .= "base64 reference " .$$rh; 184 } else { 185 $out = $rh; 186 } 187 if (defined($type) ) { 188 $out .= "type = $type \n"; 189 } 190 return $out; 191 } 192 193 194 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |