source: greenstone3/trunk/web/WEB-INF/cgi/gsdlCGI4gs3.pm@ 16031

Last change on this file since 16031 was 16031, checked in by ak19, 16 years ago

RemoteGreenstone 3 server requires the path to perl to be set in the PATH variable (whenever gliserver.pl does an eval using Perl). However the perl path is not passed to gliserver.pl by Tomcat (even though build.xml sets Tomcat's PATH). Therefore perlpath has been added as a user-definable property in file gsdl3site.cfg and will be read in by gsdlCGI(4gs3).pm. This is a problem similar to the issue of JAVA_HOME not being set for GS3.

  • Property svn:executable set to *
File size: 7.4 KB
Line 
1
2package gsdlCGI4gs3;
3
4use CGI;
5use Cwd;
6
7@ISA = ('CGI');
8
9sub new {
10 my $class = shift @_;
11
12 my $self;
13 if ((defined $ENV{'REQUEST_METHOD'}) && ($ENV{'REQUEST_METHOD'} eq "POST")) {
14 my $line = <STDIN>;
15 if ((defined $line) && ($line ne "") && ($line !~ /upload-collection-file/)) {
16 $self = new CGI($line);
17 }
18 else {
19 $self = new CGI();
20 }
21 }
22 else {
23 $self = new CGI();
24 }
25
26 return bless $self, $class;
27}
28
29
30sub parse_cgi_args
31{
32 my $self = shift @_;
33 my $xml = (defined $self->param("xml")) ? 1 : 0;
34
35 $self->{'xml'} = $xml;
36
37 my @var_names = $self->param;
38 my @arg_list = ();
39 foreach my $n ( @var_names ) {
40 my $arg = "$n=";
41 my $val = $self->param($n);
42 $arg .= $val if (defined $val);
43 push(@arg_list,$arg);
44 }
45
46 $self->{'args'} = join("&",@arg_list);
47}
48
49
50sub clean_param
51{
52 my $self = shift @_;
53 my ($param) = @_;
54
55 my $val = $self->SUPER::param($param);
56 $val =~ s/[\r\n]+$// if (defined $val);
57
58 return $val;
59}
60
61sub safe_val
62{
63 my $self = shift @_;
64 my ($val) = @_;
65
66 # ensure only alpha-numeric plus a few other special chars remain
67
68 $val =~ s/[^[:alnum:]@\.\/\- :_]//g if (defined $val);
69
70 return $val;
71}
72
73
74sub generate_error
75{
76 my $self = shift @_;
77 my ($mess) = @_;
78
79 my $xml = $self->{'xml'};
80
81 my $full_mess;
82 my $args = $self->{'args'};
83
84 if ($xml) {
85 # Make $args XML safe
86 my $args_xml_safe = $args;
87 $args_xml_safe =~ s/&/&amp;/g;
88
89 $full_mess = "<Error>\n";
90 $full_mess .= " $mess\n";
91 $full_mess .= " CGI args were: $args_xml_safe\n";
92 $full_mess .= "</Error>\n";
93 }
94 else {
95 $full_mess = "ERROR: $mess\n ($args)\n";
96 }
97
98 print STDOUT "Content-type:text/plain\n\n";
99 print STDOUT $full_mess;
100
101 die $full_mess;
102}
103
104sub generate_warning
105{
106 my $self = shift @_;
107 my ($mess) = @_;
108
109 my $xml = $self->{'xml'};
110
111 my $full_mess;
112 my $args = $self->{'args'};
113
114 if ($xml) {
115 # Make $args XML safe
116 my $args_xml_safe = $args;
117 $args_xml_safe =~ s/&/&amp;/g;
118
119 $full_mess = "<Warning>\n";
120 $full_mess .= " $mess\n";
121 $full_mess .= " CGI args were: $args_xml_safe\n";
122 $full_mess .= "</Warning>\n";
123 }
124 else {
125 $full_mess = "Warning: $mess ($args)\n";
126 }
127
128 print STDOUT "Content-type:text/plain\n\n";
129 print STDOUT $full_mess;
130
131 print STDERR $full_mess;
132}
133
134
135sub generate_ok_message
136{
137 my $self = shift @_;
138 my ($mess) = @_;
139
140 my $xml = $self->{'xml'};
141
142 my $full_mess;
143
144 if ($xml) {
145 $full_mess = "<Accepted>\n";
146 $full_mess .= " $mess\n";
147 $full_mess .= "</Accepted>\n";
148 }
149 else {
150 $full_mess = "$mess\n";
151 }
152
153 print "<pre>";
154 print STDOUT $full_mess;
155 print "</pre>";
156}
157
158
159
160sub get_config_info {
161 my $self = shift @_;
162 my ($infotype) = @_;
163
164 my $site_filename = "gsdl3site.cfg";
165 open (FILEIN, "<$site_filename")
166 || $self->generate_error("Could not open gsdl3site.cfg");
167
168 my $config_content = "";
169 while(defined (my $line = <FILEIN>)) {
170 $config_content .= $line;
171 }
172 close(FILEIN);
173
174 my ($loc) = ($config_content =~ m/^$infotype\s+((\".+\")|(\S+))\s*\n/m);
175 $loc =~ s/\"//g;
176
177 if ((!defined $loc) || ($loc =~ m/^\s*$/)) {
178 $self->generate_error("$infotype is not set in gsdl3site.cfg");
179 }
180
181 return $loc;
182}
183
184sub get_gsdl3_src_home{
185 my $self = shift @_;
186 if (defined $self->{'gsdl3srchome'}) {
187 return $self->{'gsdl3srchome'};
188 }
189
190 my $gsdl3srchome = $self->get_config_info("gsdl3srchome");
191
192 $gsdl3srchome =~ s/(\/|\\)$//; # remove trailing slash
193
194 $self->{'gsdl3srchome'} = $gsdl3srchome;
195
196 return $gsdl3srchome;
197}
198
199
200sub get_gsdl_home {
201 my $self = shift @_;
202
203 if (defined $self->{'gsdlhome'}) {
204 return $self->{'gsdlhome'};
205 }
206
207 my $gsdlhome = $self->get_config_info("gsdlhome");
208
209 #require "$gsdlhome/perllib/util.pm";
210
211 $gsdlhome =~ s/(\/|\\)$//; # remove trailing slash
212
213 $self->{'gsdlhome'} = $gsdlhome;
214
215 return $gsdlhome;
216}
217
218sub get_java_home {
219 my $self = shift @_;
220
221 if (defined $self->{'javahome'}) {
222 return $self->{'javahome'};
223 }
224
225 my $javahome = $self->get_config_info("javahome");
226
227 $javahome =~ s/(\/|\\)$//; # remove trailing slash
228
229 $self->{'javahome'} = $javahome;
230
231 return $javahome;
232}
233
234sub get_perl_path {
235 my $self = shift @_;
236
237 if (defined $self->{'perlpath'}) {
238 return $self->{'perlpath'};
239 }
240
241 my $perlpath = $self->get_config_info("perlpath");
242
243 $perlpath =~ s/(\/|\\)$//; # remove trailing slash
244
245 return $perlpath;
246}
247
248sub get_gsdl_os {
249 my $self = shift @_;
250
251 my $os = $^O;
252
253 if ($os =~ m/linux/i) {
254 return "linux";
255 }
256 elsif ($os =~ /mswin/i) {
257 return "windows";
258 }
259 elsif ($os =~ /macos/i) {
260 return "darwin";
261 }
262 else {
263 # return as is.
264 return $os;
265 }
266}
267
268sub setup_gsdl {
269 my $self = shift @_;
270
271 my $gsdl3srchome = $self->get_gsdl3_src_home();
272 my $gsdlhome = $self->get_gsdl_home();
273 my $gsdlos = $self->get_gsdl_os();
274 my $javahome = $self->get_java_home();
275
276 $ENV{'GSDL3SRCHOME'} = $gsdl3srchome;
277 $ENV{'GSDLHOME'} = $gsdlhome;
278 $ENV{'GSDLOS'} = $gsdlos;
279 $ENV{'JAVA_HOME'} = $javahome;
280
281 require "$gsdlhome/perllib/util.pm";
282
283 my $gsdl_bin_script = &util::filename_cat($gsdlhome,"bin","script");
284 &util::envvar_append("PATH",$gsdl_bin_script);
285
286 my $gsdl_bin_os = &util::filename_cat($gsdlhome,"bin",$gsdlos);
287 &util::envvar_append("PATH",$gsdl_bin_os);
288
289 if ($gsdlos eq "windows") {
290 my $gsdl_perl_bin_directory = &util::filename_cat($gsdlhome, "bin", "windows", "perl", "bin");
291 &util::envvar_append("PATH", $gsdl_perl_bin_directory);
292 }
293 else { # it's on linux now
294 my $perlpath = $self->get_perl_path();
295 &util::envvar_append("PATH", $perlpath);
296 }
297}
298
299
300sub local_rm_r
301{
302 my $self = shift @_;
303 my ($local_dir) = @_;
304
305 my $prefix_dir = getcwd();
306
307 if ($prefix_dir !~ m/collect/) {
308 $self->generate_error("Trying to delete outside of Greenstone collect: $full_dir");
309 }
310
311 my $full_dir = &util::filename_cat($prefix_dir,$local_dir);
312
313 # Delete recursively
314 if (!-e $full_dir) {
315 $self->generate_error("File/Directory does not exist: $full_dir");
316 }
317
318 &util::rm_r($full_dir);
319}
320
321
322sub get_java_path()
323{
324 # Check the JAVA_HOME environment variable first
325 if (defined $ENV{'JAVA_HOME'}) {
326 my $java_home = $ENV{'JAVA_HOME'};
327 $java_home =~ s/\/$//; # Remove trailing slash if present (Unix specific)
328 return &util::filename_cat($java_home, "bin", "java");
329 }
330
331 # Hope that Java is on the PATH
332 return "java";
333}
334
335
336sub check_java_home()
337{
338 # Return a warning unless the JAVA_HOME enrivonmen variable is set
339 if (!defined $ENV{'JAVA_HOME'}) {
340 return "JAVA_HOME environment variable not set. Might not be able to find Java unless in PATH (" . $ENV{'PATH'} . ")";
341 }
342
343 return "";
344}
345
346
347sub checked_chdir
348{
349 my $self = shift @_;
350 my ($dir) = @_;
351
352 if (!-e $dir) {
353 $self->generate_error("Directory '$dir' does not exist");
354 }
355
356 chdir $dir
357 || $self->generate_error("Unable to change to directory: $dir");
358}
359
360sub rot13()
361{
362 my $self = shift @_;
363 my ($password)=@_;
364 my @password_arr=split(//,$password);
365
366 my @encrypt_password;
367 foreach my $str (@password_arr){
368 my $char=unpack("c",$str);
369 if ($char>=97 && $char<=109){
370 $char+=13;
371 }elsif ($char>=110 && $char<=122){
372 $char-=13;
373 }elsif ($char>=65 && $char<=77){
374 $char+=13;
375 }elsif ($char>=78 && $char<=90){
376 $char-=13;
377 }
378 $char=pack("c",$char);
379 push(@encrypt_password,$char);
380 }
381 return join("",@encrypt_password);
382}
383
384
3851;
386
Note: See TracBrowser for help on using the repository browser.