source: main/trunk/greenstone2/perllib/servercontrol.pm@ 32432

Last change on this file since 32432 was 32432, checked in by ak19, 6 years ago
  1. Since there's a chance that 127.0.0.1 isn't always the loopback address or may not always work, we allow this to be specified by the new property localhost.server.http in build.properties. Updating recently commited code that is affected by this and where I had been hardcoding 127.0.0.1. 2. Fixing up the port and now the server host name used by the solr extension: these should be the correct property names, which are localhost.port.http and the new localhost.server.http instead of tomcat.server and the default port for the default protocol, since all GS3 internal communications with solr are done through the local HTTP url, whatever the public URL (with default protocol, matching port and server name) might be. I also updated the get-solr-servlet-url target in build.xml to use the local http base URL (see point 3), so that solr building will work correctly. 3. build.xml now has 2 new targets, one to get the local http base URL and one to get the local http default servlet URL. Both also use the new localhost.server.http property, besides the recently introduced localhost.port.http property. 4. Now the default behaviour of util.pm::get_full_greenstone_url_prefix() is to call the new get-local-http-servlet-url ant target, since only activate.pl's servercontrol.pm helper module uses it. If you want util.pm::get_full_greenstone_url_prefix() to return the non-local (public) servlet URL, pass in 1 (true) for the new 3rd parameter. The important decision here is that activate will use the internal (i.e. local http) greenstone servlet URL to issue pinging and (de)activating commands, since localhost (specifically 127.0.0.1) over http is now always available and because a domain named server over https will create complications to do with certification checks by wget, when wget gets run by activate.pl. Alternatively, activate.pl/servercontrol.pm could run wget with the no-cert-checking flag or we could make wget check the GS3 https certificate if one exists. But all that is convoluted and unnecessary: we've so far always worked with http, and usually with localhost over the httpport, and activate.pl so far has worked well with this, so have some confidence that using the local http URL internally should still work, even if the default GS3 URL has been set up to be a public (https) URL.
File size: 25.6 KB
Line 
1#############################################################################
2#
3# activate.pm -- functions to get the GS library URL, ping the library URL,
4# activate and deactivate a collection.
5#
6# A component of the Greenstone digital library software
7# from the New Zealand Digital Library Project at the
8# University of Waikato, New Zealand.
9#
10# Copyright (C) 1999 New Zealand Digital Library Project
11#
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
24# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25#
26###############################################################################
27
28package servercontrol;
29
30
31use strict;
32no strict 'refs'; # allow filehandles to be variables and vice versa
33no strict 'subs'; # allow barewords (eg STDERR) as function arguments
34
35# Greenstone includes
36use printusage;
37use parse2;
38
39
40# The perl library imports below are used by deprecated methods config_old(), is_URL_active() and pingHost()
41# If the following library imports are not supported by your perl installation, comment out these
42# imports and move the methods config_old(), is_URL_active() and pingHost() out to a temporary file.
43use HTTP::Response;
44use LWP::Simple qw($ua !head); # import useragent object as $ua from the full LWP to use along with LWP::Simple
45 # don't import LWP::Simple's head function by name since it can conflict with CGI:head())
46#use CGI qw(:standard); # then only CGI.pm defines a head()
47use Net::Ping;
48use URI;
49
50
51sub new
52{
53 my $class = shift(@_);
54
55 my ($qualified_collection, $site, $verbosity, $build_dir, $index_dir, $collect_dir, $library_url, $library_name) = @_;
56
57 # library_url: to be specified on the cmdline if not using a GS-included web server
58 # the GSDL_LIBRARY_URL env var is useful when running cmdline buildcol.pl in the linux package manager versions of GS3
59
60 my $self = {'build_dir' => $build_dir,
61 'index_dir' => $index_dir,
62 'collect_dir' => $collect_dir,
63 'site' => $site,
64 'qualified_collection' => $qualified_collection,
65 #'is_persistent_server' => undef,
66 'library_url' => $library_url || $ENV{'GSDL_LIBRARY_URL'} || undef, # to be specified on the cmdline if not using a GS-included web server
67 'library_name' => $library_name,
68 #'gs_mode' => "gs2",
69 'verbosity' => $verbosity || 2
70 };
71
72 if ((defined $site) && ($site ne "")) { # GS3
73 $self->{'gs_mode'} = "gs3";
74 } else {
75 $self->{'gs_mode'} = "gs2";
76 }
77
78 return bless($self, $class);
79}
80
81## TODO: gsprintf to $self->{'out'} in these 2 print functions
82## See buildcolutils.pm new() for setting up $out
83
84sub print_task_msg {
85 my $self = shift(@_);
86 my ($task_msg, $verbosity_setting) = @_;
87
88 $verbosity_setting = $self->{'verbosity'} unless $verbosity_setting;
89 #$verbosity_setting = 1 unless defined $verbosity;
90 if($verbosity_setting >= 1) {
91 print STDERR "\n";
92 print STDERR "************************\n";
93 print STDERR "* $task_msg\n";
94 print STDERR "************************\n";
95 }
96}
97
98# Prints messages if the verbosity is right. Does not add new lines.
99sub print_msg {
100 my $self = shift(@_);
101 my ($msg, $min_verbosity, $verbosity_setting) = @_;
102
103 # only display error messages if the current
104 # verbosity setting >= the minimum verbosity level
105 # needed for that message to be displayed.
106
107 $verbosity_setting = $self->{'verbosity'} unless defined $verbosity_setting;
108 $min_verbosity = 1 unless defined $min_verbosity;
109 if($verbosity_setting >= $min_verbosity) { # by default display all 1 messages
110 print STDERR "$msg";
111 }
112}
113
114# Method to send a command to a GS2 or GS3 library_URL
115# the commands used in this script can be activate, deactivate, ping,
116# and is-persistent (is-persistent only implemented for GS2).
117sub config {
118 my $self = shift(@_);
119 my ($command, $check_message_against_regex, $expected_error_code, $silent) = @_;
120
121 my $library_url = $self->get_library_URL(); #$self->{'library_url'};
122
123
124 # Gatherer.java's configGS3Server doesn't use the site variable
125 # so we don't have to either
126
127 # for GS2, getting the HTTP status isn't enough, we need to read the output
128 # since this is what CollectionManager.config() stipulates.
129 # Using LWP::UserAgent::get($url) for this
130
131 if(!defined $library_url) {
132 return 0;
133 }
134 else {
135 # ampersands need to be escaped
136 # - with single quotes around it for linux for the cmd to run in bash subshell
137 # - with a ^ before it on windows for the cmd to run in a DOS prompt subshell
138 # - or the entire wget command should be nested in double quotes (single quotes don't work on windows)
139 my $wgetCommand = $command;
140
141 my $wget_file_path = &FileUtils::filenameConcatenate($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "wget");
142 my $tmpfilename = &util::get_tmp_filename(".html"); # random file name with html extension in tmp location in which we'll store the HTML page retrieved by wget
143
144 # https://www.gnu.org/software/wget/manual/wget.html
145 # output-document set to - (STDOUT), so page is streamed to STDOUT
146 # timeout: 5 seconds, tries: 1
147 # wget sends status information and response code to STDERR, so redirect it to STDOUT
148 # Searching for "perl backtick operator redirect stderr to stdout":
149 # http://www.perlmonks.org/?node=How%20can%20I%20capture%20STDERR%20from%20an%20external%20command%3F
150 ##$wgetCommand = "\"$wget_file_path\" --spider -T 5 -t 1 \"$library_url$wgetCommand\" 2>&1"; # won't save page
151 #$wgetCommand = "\"$wget_file_path\" --output-document=- -T 5 -t 1 \"$library_url$wgetCommand\" 2>&1"; # THIS CAN MIX UP STDERR WITH STDOUT IN THE VERY LINE WE REGEX TEST AGAINST EXPECTED OUTPUT!!
152 $wgetCommand = "\"$wget_file_path\" --output-document=\"$tmpfilename\" -T 5 -t 1 \"$library_url$wgetCommand\" 2>&1"; # keep stderr (response code, response_content) separate from html page content
153
154 ##print STDERR "@@@@ $wgetCommand\n";
155
156 my $response_content = "";
157 my $response_code = undef;
158 #my $response_content = `$wgetCommand`; # Dr Bainbridge advises against using backticks for running a process. If capturing std output, use open():
159 if (open(PIN, "$wgetCommand |")) {
160 while (defined (my $perl_output_line = <PIN>)) {
161 $response_content = $response_content . $perl_output_line;
162 }
163 close(PIN);
164 } else {
165 print STDERR "servercontrol.pm::config() failed to run $wgetCommand\n";
166 }
167
168
169 my @lines = split( /\n/, $response_content );
170 foreach my $line (@lines) {
171 #print STDERR "@@@@ LINE: $line\n";
172 if($line =~ m@failed: Connection timed out.$@) { # linux
173 $response_code = "failed: Connection timed out.";
174 last; # break keyword in perl = last
175 }
176 elsif($line =~ m@Giving up.$@) { # windows (unless -T 5 -t 1 is not passed in)
177 $response_code = "failed: Giving up.";
178 last; # break keyword in perl = last
179 }
180 elsif($line =~ m@failed: Connection refused.$@) {
181 $response_code = "failed: Connection refused.";
182 last; # break keyword in perl = last
183 }
184 elsif($line =~ m@HTTP request sent, @) {
185 $response_code = $line;
186 $response_code =~ s@[^\d]*(.*)$@$1@;
187 last;
188 }
189 }
190
191 if($command =~ m@ping@ && $response_code =~ m@failed: (Connection refused|Giving up)@) {
192 # server not running
193 $self->print_msg("*** Server not running. $library_url$command\n", 3);
194 &FileUtils::removeFiles($tmpfilename); # get rid of the ping response's temporary html file we downloaded
195 return 0;
196 }
197 if($response_code && $response_code eq "200 OK") {
198 $self->print_msg("*** Command $library_url$command\n", 3);
199 $self->print_msg("*** HTTP Response Status: $response_code - Complete.", 3);
200
201 # check the page content is as expected
202 #my $resultstr = $response_content;
203
204 # The following file reading section is a candidate to use FileUtils::readUTF8File()
205 # in place of calling sysread() directly. But only if we can reason we'd be working with UTF8
206 open(FIN,"<$tmpfilename") or die "servercontrol.pm: Unable to open $tmpfilename to read ping response page...ERROR: $!\n";
207 my $resultstr;
208 # Read in the entire contents of the file in one hit
209 sysread(FIN, $resultstr, -s FIN);
210 close(FIN);
211 &FileUtils::removeFiles($tmpfilename); # get rid of the ping response's temporary html file we downloaded
212
213
214 #$resultstr =~ s@.*gs_content\"\>@@s; ## only true for default library servlet
215 #$resultstr =~ s@</div>.*@@s;
216 if($resultstr =~ m/$check_message_against_regex/) {
217 $self->print_msg(" Response as expected.\n", 3);
218 $self->print_msg("@@@@@@ Got result:\n$resultstr\n", 4);
219 return 1;
220 } else {
221 # if we expect the collection to be inactive, then we'd be in silent mode: if so,
222 # don't print out the "ping did not succeed" response, but print out any other messages
223
224 # So we only suppress the ping col "did not succeed" response if we're in silent mode
225 # But if any message other than ping "did not succeed" is returned, we always print it
226 if($resultstr !~ m/did not succeed/ || !$silent) {
227 $self->print_msg("\n\tBUT: command $library_url$command response UNEXPECTED.\n", 3);
228 $self->print_msg("*** Got message:\n$response_content.\n", 4);
229 $self->print_msg("*** Got result:\n$resultstr\n", 3);
230 }
231 return 0; # ping on a collection may "not succeed."
232 }
233 }
234 elsif($response_code && $response_code =~ m@^(4|5)\d\d@) { # client side errors start with 4xx, server side with 5xx
235 # check the page content is as expected
236 if(defined $expected_error_code && $response_code =~ m@^$expected_error_code@) {
237 $self->print_msg(" Response status $response_code as expected.\n", 3);
238 } else {
239 $self->print_msg("*** Command $library_url$command\n");
240 $self->print_msg("*** Unexpected error type 1. HTTP Response Status: $response_code - Failed.\n");
241 }
242 return 0; # return false, since the response_code was an error, expected or not
243 }
244 else { # also if response_code is still undefined, as can happen with connection timing out
245 $self->print_msg("*** Command $library_url$command\n");
246 if(defined $response_code) {
247 $self->print_msg("*** Unexpected error type 2. HTTP Response Status: $response_code - Failed.\n");
248 } else {
249 $self->print_msg("*** Unexpected error type 3. Failed:\n\n$response_content\n\n");
250 }
251 return 0;
252 }
253 #print STDERR "********** WgetCommand: $wgetCommand\n\n";
254 #print STDERR "********** Response_content:\n$response_content\n\n";
255 #print STDERR "********** Response_CODE: $response_code\n";
256
257 }
258}
259
260sub deactivate_collection {
261 my $self = shift(@_);
262
263 my $gs_mode = $self->{'gs_mode'};
264 my $qualified_collection = $self->{'qualified_collection'};
265
266 if($gs_mode eq "gs2") {
267 my $DEACTIVATE_COMMAND = "?a=config&cmd=release-collection&c=";
268 my $check_message_against_regex = q/configured release-collection/;
269 $self->config($DEACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
270 }
271 elsif ($gs_mode eq "gs3") {
272 my $DEACTIVATE_COMMAND = "?a=s&sa=d&st=collection&sn=";
273 my $check_message_against_regex = "collection: $qualified_collection deactivated";
274 $self->config($DEACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
275 }
276}
277
278sub activate_collection {
279 my $self = shift(@_);
280
281 my $gs_mode = $self->{'gs_mode'};
282 my $qualified_collection = $self->{'qualified_collection'};
283
284 if($gs_mode eq "gs2") {
285 my $ACTIVATE_COMMAND = "?a=config&cmd=add-collection&c=";
286 my $check_message_against_regex = q/configured add-collection/;
287 $self->config($ACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
288 }
289 elsif ($gs_mode eq "gs3") {
290 my $ACTIVATE_COMMAND = "?a=s&sa=a&st=collection&sn=";
291 my $check_message_against_regex = "collection: $qualified_collection activated";
292 $self->config($ACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
293 }
294}
295
296sub ping {
297 my $self = shift(@_);
298 my $command = shift(@_);
299 my $silent = shift(@_);
300
301 # If the GS server is not running, we *expect* to see a "500" status code.
302 # If the GS server is running, then "Ping" ... "succeeded" is expected on success.
303 # When pinging an inactive collection, it will say it did "not succeed". This is
304 # a message of interest to return.
305 my $check_responsemsg_against_regex = q/(succeeded)/;
306 my $expected_error_code = 500;
307
308 $self->print_msg("*** COMMAND WAS: |$command| ***\n", 4);
309
310 return $self->config($command, $check_responsemsg_against_regex, $expected_error_code, $silent);
311}
312
313# send a pingaction to the GS library. General server-level ping.
314sub ping_library {
315 my $self = shift(@_);
316
317 my $gs_mode = $self->{'gs_mode'};
318
319 my $command = "";
320 if($gs_mode eq "gs2") {
321 $command = "?a=ping";
322 }
323 elsif ($gs_mode eq "gs3") {
324 $command = "?a=s&sa=ping";
325 }
326 return $self->ping($command);
327}
328
329
330# send a pingaction to a collection in GS library to check if it's active
331sub ping_library_collection {
332 my $self = shift(@_);
333 my $silent = shift(@_);
334
335 my $gs_mode = $self->{'gs_mode'};
336 my $qualified_collection = $self->{'qualified_collection'};
337
338 my $command = "";
339 if($gs_mode eq "gs2") {
340 $command = "?a=ping&c=$qualified_collection";
341 }
342 elsif ($gs_mode eq "gs3") {
343 $command = "?a=s&sa=ping&st=collection&sn=$qualified_collection";
344 }
345 return $self->ping($command, $silent);
346}
347
348# return true if server is persistent, by calling is-persistent on library_url
349# this is only for GS2, since the GS3 server is always persistent
350sub is_persistent {
351 my $self = shift(@_);
352
353 if($self->{'gs_mode'} eq "gs3") { # GS3 server is always persistent
354 return 1;
355 }
356
357 my $command = "?a=is-persistent";
358 my $check_responsemsg_against_regex = q/true/; # isPersistent: true versus isPersistent: false
359 return $self->config($command, $check_responsemsg_against_regex);
360}
361
362sub set_library_URL {
363 my $self = shift(@_);
364 my $library_url = shift(@_);
365 $self->{'library_url'} = $library_url;
366}
367
368sub get_library_URL {
369 my $self = shift(@_);
370
371 # For web servers that are external to a Greenstone installation,
372 # the user can pass in their web server's library URL.
373 if($self->{'library_url'}) {
374 return $self->{'library_url'};
375 }
376
377 # For web servers included with GS (like tomcat for GS3 and server.exe
378 # and apache for GS2), we work out the library URL:
379 my ($gs_mode, $lib_name); # gs_mode can be gs3 or gs2, lib_name is the custom servlet name
380 $gs_mode = $self->{'gs_mode'};
381 $lib_name = $self->{'library_name'};
382
383 # If we get here, we are dealing with a server included with GS.
384 # For GS3, we ask ant for the library URL.
385 # For GS2, we derive the URL from the llssite.cfg file.
386
387 # note that unless we pass in $get_public_url=1, we now get the local http URL
388 # by default (e.g. http://127.0.0.1:httpPort/greenstone/library)
389 my $url = &util::get_full_greenstone_url_prefix($gs_mode, $lib_name); # found largely identical method copied
390 # into util.pm. Don't want duplicates, so calling that from here.
391
392 # either the url is still undef or it is now set
393 #print STDERR "\n@@@@@ final URL:|$url|\n" if $url;
394 #print STDERR "\n@@@@@ URL still undef\n" if !$url;
395
396 if (defined $url) {
397 $self->{'library_url'} = $url;
398 }
399
400 return $url;
401}
402
403sub do_deactivate {
404 my $self = shift(@_);
405
406 # 1. Get library URL
407
408 # For web servers that are external to a Greenstone installation,
409 # the user can pass in their web server's library URL.
410 # For web servers included with GS (like tomcat for GS3 and server.exe
411 # and apache for GS2), we work out the library URL:
412
413 # Can't do $self->{'library_url'}, because it may not yet be set
414 my $library_url = $self->get_library_URL(); # returns undef if no valid server URL
415
416 if(!defined $library_url) { # undef if no valid server URL
417 return; # can't do any deactivation without a valid server URL
418 }
419
420 my $is_persistent_server = $self->{'is_persistent_server'};
421 my $qualified_collection = $self->{'qualified_collection'};
422
423 # CollectionManager's installCollection phase in GLI
424 # 2. Ping the library URL, and if it's a persistent server and running, release the collection
425
426 $self->print_msg("Pinging $library_url\n");
427 if ($self->ping_library()) { # server running
428
429 # server is running, so release the collection if
430 # the server is persistent and the collection is active
431
432 # don't need to work out persistency of server more than once, since the libraryURL hasn't changed
433 if (!defined $is_persistent_server) {
434 $self->print_msg("Checking if Greenstone server is persistent\n");
435 $is_persistent_server = $self->is_persistent();
436 $self->{'is_persistent_server'} = $is_persistent_server;
437 }
438
439 if ($is_persistent_server) { # only makes sense to issue activate and deactivate cmds to a persistent server
440
441 $self->print_msg("Checking if the collection $qualified_collection is already active\n");
442 my $collection_active = $self->ping_library_collection();
443
444 if ($collection_active) {
445 $self->print_msg("De-activating collection $qualified_collection\n");
446 $self->deactivate_collection();
447 }
448 else {
449 $self->print_msg("Collection is not active => No need to deactivate\n");
450 }
451 }
452 else {
453 $self->print_msg("Server is not persistent => No need to deactivate collection\n");
454 }
455 }
456 else {
457 $self->print_msg("No response to Ping => Taken to mean server is not running\n");
458 }
459
460 return $is_persistent_server;
461}
462
463sub do_activate {
464 my $self = shift @_;
465
466 my $library_url = $self->get_library_URL(); # Can't do $self->{'library_url'}; as it may not be set yet
467
468 if(!defined $library_url) { # undef if no valid server URL
469 return; # nothing to activate if without valid server URL
470 }
471
472 my $is_persistent_server = $self->{'is_persistent_server'};
473 my $qualified_collection = $self->{'qualified_collection'};
474
475 $self->print_msg("Pinging $library_url\n");
476 if ($self->ping_library()) { # server running
477
478 # don't need to work out persistency of server more than once, since the libraryURL hasn't changed
479 if (!defined $is_persistent_server) {
480 $self->print_msg("Checking if Greenstone server is persistent\n");
481 $is_persistent_server = $self->is_persistent();
482 $self->{'is_persistent_server'} = $is_persistent_server;
483 }
484
485 if ($is_persistent_server) { # persistent server, so can try activating collection
486
487 $self->print_msg("Checking if the collection $qualified_collection is not already active\n");
488
489 # Since we could have deactivated the collection at this point,
490 # it is likely that it is not yet active. When pinging the collection
491 # a "ping did not succeed" message is expected, therefore tell the ping
492 # to proceed silently
493 my $silent = 1;
494 my $collection_active = $self->ping_library_collection($silent);
495
496 if (!$collection_active) {
497 $self->print_msg(" Collection is not active.\n");
498 $self->print_msg("Activating collection $qualified_collection\n");
499 $self->activate_collection();
500
501 # unless an error occurred, the collection should now be active:
502 $collection_active = $self->ping_library_collection(); # not silent if ping did not succeed
503 if(!$collection_active) {
504 $self->print_msg("ERROR: collection $qualified_collection did not get activated\n");
505 }
506 }
507 else {
508 $self->print_msg("Collection is already active => No need to activate\n");
509 }
510 }
511 else {
512 $self->print_msg("Server is not persistent => No need to activate collection\n");
513 }
514 }
515 else {
516 $self->print_msg("No response to Ping => Taken to mean server is not running\n");
517 }
518
519 return $is_persistent_server;
520}
521
522
523#########################################################
524### UNUSED METHODS - CAN BE HANDY
525
526
527# This method uses the perl libraries we're advised to use in place of wget for pinging and retrieving web
528# pages. The problem is that not all perl installations may support these libraries. So we now use the new
529# config() method further above, which uses the wget included in Greenstone binary installations.
530# If the library imports at page top conflict, comment out those imports and move the methods config_old(),
531# is_URL_active() and pingHost() out to a temporary file.
532#
533# If for some reason you can't use wget, then rename the config() method to config_old(), and rename the
534# method below to config() and things should work as before.
535sub config_old {
536 my $self = shift(@_);
537 my ($command, $check_message_against_regex, $expected_error_code, $silent) = @_;
538
539 my $library_url = $self->get_library_URL(); #$self->{'library_url'};
540
541
542 # Gatherer.java's configGS3Server doesn't use the site variable
543 # so we don't have to either
544
545 # for GS2, getting the HTTP status isn't enough, we need to read the output
546 # since this is what CollectionManager.config() stipulates.
547 # Using LWP::UserAgent::get($url) for this
548
549 if(!defined $library_url) {
550 return 0;
551 }
552 else {
553 $ua->timeout(5); # set LWP useragent to 5s max timeout for testing the URL
554 # Need to set this, else it takes I don't know how long to timeout
555 # http://www.perlmonks.org/?node_id=618534
556
557 # http://search.cpan.org/~gaas/libwww-perl-6.04/lib/LWP/UserAgent.pm
558 # use LWP::UserAgent's get($url) since it returns an HTTP::Response code
559
560 my $response_obj = $ua->get($library_url.$command);
561
562 # $response_obj->content stores the content and $response_obj->code the HTTP response code
563 my $response_code = $response_obj->code();
564
565 if(LWP::Simple::is_success($response_code)) {# $response_code eq RC_OK) { # LWP::Simple::is_success($response_code)
566 $self->print_msg("*** Command $library_url$command\n", 3);
567 $self->print_msg("*** HTTP Response Status: $response_code - Complete.", 3);
568
569 # check the page content is as expected
570 my $response_content = $response_obj->content;
571 my $resultstr = $response_content;
572 $resultstr =~ s@.*gs_content\"\>@@s;
573 $resultstr =~ s@</div>.*@@s;
574
575 if($resultstr =~ m/$check_message_against_regex/) {#if($response_content =~ m/$check_message_against_regex/) {
576 $self->print_msg(" Response as expected.\n", 3);
577 $self->print_msg("@@@@@@ Got result:\n$resultstr\n", 4);
578 return 1;
579 } else {
580 # if we expect the collection to be inactive, then we'd be in silent mode: if so,
581 # don't print out the "ping did not succeed" response, but print out any other messages
582
583 # So we only suppress the ping col "did not succeed" response if we're in silent mode
584 # But if any message other than ping "did not succeed" is returned, we always print it
585 if($resultstr !~ m/did not succeed/ || !$silent) {#if($response_content !~ m/did not succeed/ || !$silent) {
586 $self->print_msg("\n\tBUT: command $library_url$command response UNEXPECTED.\n", 3);
587 $self->print_msg("*** Got message:\n$response_content.\n", 4);
588 $self->print_msg("*** Got result:\n$resultstr\n", 3);
589 }
590 return 0; # ping on a collection may "not succeed."
591 }
592 }
593 elsif(LWP::Simple::is_error($response_code)) { # method exported by LWP::Simple, along with HTTP::Status constants
594 # check the page content is as expected
595 if(defined $expected_error_code && $response_code == $expected_error_code) {
596 $self->print_msg(" Response status $response_code as expected.\n", 3);
597 } else {
598 $self->print_msg("*** Command $library_url$command\n");
599 $self->print_msg("*** Unexpected error. HTTP Response Status: $response_code - Failed.\n");
600 }
601 return 0; # return false, since the response_code was an error, expected or not
602 }
603 else {
604 $self->print_msg("*** Command $library_url$command\n");
605 $self->print_msg("*** Unexpected error. HTTP Response Status: $response_code - Failed.\n");
606 return 0;
607 }
608 }
609}
610
611# This method is now unused. Using ping_library instead to send the ping action to a
612# GS2/GS3 server. This method can be used more generally to test whether a URL is alive.
613# http://search.cpan.org/dist/libwww-perl/lib/LWP/Simple.pm
614# and http://www.perlmonks.org/?node_id=618534
615sub is_URL_active {
616 my $url = shift(@_); # gs3 or gs2 URL
617
618 my $status = 0;
619 if(defined $url) {
620 $ua->timeout(10); # set LWP useragent to 5s max timeout for testing the URL
621 # Need to set this, else it takes I don't know how long to timeout
622 # http://www.perlmonks.org/?node_id=618534
623
624 $status = LWP::Simple::head($url); # returns empty list of headers if it fails
625 # LWP::Simple::get($url) is more intensive, so don't need to do that
626 #print STDERR "**** $url is alive.\n" if $status;
627 }
628 return $status;
629}
630
631# Pinging seems to always return true, so this method doesn't work
632sub pingHost {
633 my $url = shift(@_); # gs3 or gs2 URL
634
635 my $status = 0;
636 if(defined $url) {
637 # Get just the domain. "http://localhost/gsdl?uq=332033495" becomes "localhost"
638 # "http://localhost/greenstone/cgi-bin/library.cgi" becomes "localhost" too
639
640 #my $host = $url;
641 #$host =~ s@^https?:\/\/(www.)?@@;
642 #$host =~ s@\/.*@@;
643 #print STDERR "**** HOST: $host\n";
644
645 # More robust way
646 # http://stackoverflow.com/questions/827024/how-do-i-extract-the-domain-out-of-an-url
647 my $uri = URI->new( $url );
648 my $host = $uri->host;
649
650 # Ping the host. http://perldoc.perl.org/Net/Ping.html
651 my $p = Net::Ping->new();
652 $status = $p->ping($host); # || 0. Appears to set to undef rather than 0
653 print STDERR "**** $host is alive.\n" if $status; #print "$host is alive.\n" if $p->ping($host);
654 $p->close();
655 }
656 # return whether pinging was a success or failure
657 return $status;
658}
659
6601;
Note: See TracBrowser for help on using the repository browser.