root/main/trunk/greenstone2/bin/script/activate.pl @ 25887

Revision 25887, 24.8 KB (checked in by ak19, 8 years ago)

Normal commit, before the first set of commits related to getting activate.pl working with solr. In this commit: fixed result of ping to no longer say 500 Failed when the GS3 library server is not running, as this is one of the expected results when pinging. Cleared up the code working out what the buildtype is, which is now simplified, since at the activate stage any change of indexers would already have been dealt with.

  • Property svn:executable set to *
Line 
1#!/usr/bin/perl -w
2
3###########################################################################
4#
5# activate.pl -- to be called after building a collection to activate it.
6#
7# A component of the Greenstone digital library software
8# from the New Zealand Digital Library Project at the
9# University of Waikato, New Zealand.
10#
11# Copyright (C) 2009 New Zealand Digital Library Project
12#
13# This program is free software; you can redistribute it and/or modify
14# it under the terms of the GNU General Public License as published by
15# the Free Software Foundation; either version 2 of the License, or
16# (at your option) any later version.
17#
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21# GNU General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26#
27###########################################################################
28
29
30# This program is designed to support the building process of Greenstone.
31# It deactivates the collection just built, if the web server is running
32# and is a persistent web server (or if the library_URL provided as
33# parameter to this script is of a currently running web server). It then
34# moves building to index, before activating the collection on the GS2 or
35# GS3 web server again if necessary.
36
37
38BEGIN {
39    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
40    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
41    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
42}
43
44
45use strict;
46no strict 'refs'; # allow filehandles to be variables and vice versa
47no strict 'subs'; # allow barewords (eg STDERR) as function arguments
48
49use File::Basename;
50use File::Find;
51
52use HTTP::Response;
53use LWP::Simple qw($ua !head); # import useragent object as $ua from the full LWP to use along with LWP::Simple
54        # don't import LWP::Simple's head function by name since it can conflict with CGI:head())           
55#use CGI qw(:standard);  # then only CGI.pm defines a head()
56use Net::Ping;
57use URI;
58
59use colcfg;
60use scriptutil;
61use util;
62#use enum;
63
64# enumerations in perl, http://stackoverflow.com/questions/473666/does-perl-have-an-enumeration-type
65# Unfortunately, not part of perl's core
66#use enum qw(LEVEL_NONE LEVEL_ERROR LEVEL_INFO LEVEL_DEBUG); # debugging levels NONE == 0, ERROR=1 INFO=2 DEBUG=3
67
68# global variables
69#my $default_verbosity = LEVEL_ERROR; # by default we display basic error messages
70
71my $default_verbosity = 2; # by default we display basic error and info messages
72
73sub print_task_msg {
74    my ($task_msg, $verbosity_setting) = @_;
75   
76    $verbosity_setting = $default_verbosity unless $verbosity_setting;
77    #$verbosity_setting = 1 unless defined $verbosity;
78    if($verbosity_setting >= 1) {
79        print STDERR "\n";
80        print STDERR "************************\n";
81        print STDERR "* $task_msg\n";
82        print STDERR "************************\n";
83    }
84}
85
86# Prints messages if the verbosity is right. Does not add new lines.
87sub print_msg {
88    my ($msg, $min_verbosity, $verbosity_setting) = @_;
89   
90    # only display error messages if the current
91    # verbosity setting >= the minimum verbosity level
92    # needed for that message to be displayed.
93   
94    $verbosity_setting = $default_verbosity unless defined $verbosity_setting;
95    $min_verbosity = 1 unless defined $min_verbosity;
96    if($verbosity_setting >= $min_verbosity) { # by default display all 1 messages
97        print STDERR "$msg";
98    }
99}
100
101# Method to send a command to a GS2 or GS3 library_URL
102# the commands used in this script can be activate, deactivate, ping,
103# and is-persistent (is-persistent only implemented for GS2).
104sub config {
105    my ($library_url, $command, $check_message_against_regex, $site, $expected_error_code) = @_;
106            # Gatherer.java's configGS3Server doesn't use the site variable
107            # so we don't have to either
108   
109    # for GS2, getting the HTTP status isn't enough, we need to read the output
110    # since this is what CollectionManager.config() stipulates.
111    # Using LWP::UserAgent::get($url) for this 
112   
113    if(!defined $library_url) {
114        return 0;
115    }
116    else {
117        $ua->timeout(5); # set LWP useragent to 5s max timeout for testing the URL
118            # Need to set this, else it takes I don't know how long to timeout
119            # http://www.perlmonks.org/?node_id=618534
120       
121        # http://search.cpan.org/~gaas/libwww-perl-6.04/lib/LWP/UserAgent.pm
122        # use LWP::UserAgent's get($url) since it returns an HTTP::Response code
123       
124        my $response_obj = $ua->get( $library_url.$command);
125       
126        # $response_obj->content stores the content and $response_obj->code the HTTP response code
127        my $response_code = $response_obj->code();
128       
129        if(LWP::Simple::is_success($response_code)) {# $response_code eq RC_OK) { # LWP::Simple::is_success($response_code)
130            &print_msg("*** Command $library_url$command\n", 3);
131            &print_msg("*** HTTP Response Status: $response_code - Complete.", 3);
132           
133            # check the page content is as expected
134            my $response_content = $response_obj->content;     
135            if($response_content =~ m/$check_message_against_regex/) {
136                &print_msg(" Response as expected.\n", 3);
137                return 1;
138            } else {
139                &print_msg("\n\tBUT: command $library_url$command response UNEXPECTED.\n", 3);
140                &print_msg("*** Got message:\n$response_content.\n", 4);
141                return 0; # ping on a collection may "not succeed."
142            }
143        }
144        elsif(LWP::Simple::is_error($response_code)) { # method exported by LWP::Simple, along with HTTP::Status constants
145            # check the page content is as expected
146            if(defined $expected_error_code && $response_code == $expected_error_code) {
147            &print_msg(" Response status $response_code as expected.\n", 3);
148            } else {
149            &print_msg("*** Command $library_url$command\n");
150            &print_msg("*** Unexpected error. HTTP Response Status: $response_code - Failed.\n");
151            }
152            return 0; # return false, since the response_code was an error, expected or not
153        }
154    }   
155}
156
157sub deactivate_collection {
158    my ($library_url, $gs_mode, $qualified_collection, $site) = @_;
159   
160    if($gs_mode eq "gs2") {
161        my $DEACTIVATE_COMMAND = "?a=config&cmd=release-collection&c=";
162        my $check_message_against_regex = q/configured release-collection/;
163        config($library_url, $DEACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
164    }
165    elsif ($gs_mode eq "gs3") {
166        my $DEACTIVATE_COMMAND = "?a=s&sa=d&st=collection&sn=";
167        my $check_message_against_regex = "collection: $qualified_collection deactivated";
168        config($library_url, $DEACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex, $site);
169    }   
170}
171
172sub activate_collection {
173    my ($library_url, $gs_mode, $qualified_collection, $site) = @_;
174   
175    if($gs_mode eq "gs2") {
176        my $ACTIVATE_COMMAND = "?a=config&cmd=add-collection&c=";
177        my $check_message_against_regex = q/configured add-collection/;
178        config($library_url, $ACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex);
179    }
180    elsif ($gs_mode eq "gs3") {
181        my $ACTIVATE_COMMAND = "?a=s&sa=a&st=collection&sn=";
182        my $check_message_against_regex = "collection: $qualified_collection activated";
183        config($library_url, $ACTIVATE_COMMAND.$qualified_collection, $check_message_against_regex, $site);
184    }   
185}
186
187sub ping {
188    my ($library_url, $command, $gs_mode, $site) = @_;
189
190    # If the GS server is not running, we *expect* to see a "500" status code.
191    # If the GS server is running, then "Ping" ... "succeeded" is expected on success.
192    # When pinging an inactive collection, it will say it did "not succeed". This is
193    # a message of interest to return.
194    my $check_responsemsg_against_regex = q/(succeeded)/;
195    my $expected_error_code = 500;
196    return config($library_url, $command, $check_responsemsg_against_regex, $site, $expected_error_code);
197}
198
199# send a pingaction to the GS library. General server-level ping.
200sub ping_library {
201    my ($library_url, $gs_mode, $site) = @_;
202   
203    my $command = "";
204    if($gs_mode eq "gs2") {     
205        $command = "?a=ping";       
206    }
207    elsif ($gs_mode eq "gs3") {     
208        $command = "?a=s&sa=ping";
209    }
210    return &ping($library_url, $command, $gs_mode, $site);
211}
212
213
214# send a pingaction to a collection in GS library to check if it's active
215sub ping_library_collection {
216    my ($library_url, $gs_mode, $qualified_collection, $site) = @_;
217   
218    my $command = "";
219    if($gs_mode eq "gs2") {     
220        $command = "?a=ping&c=$qualified_collection";
221    }
222    elsif ($gs_mode eq "gs3") {     
223        $command = "?a=s&sa=ping&st=collection&sn=$qualified_collection";       
224    }
225    return &ping($library_url, $command, $gs_mode, $site);
226}
227
228# return true if server is persistent, by calling is-persistent on library_url
229# this is only for GS2, since the GS3 server is always persistent
230sub is_persistent {
231    my ($library_url, $gs_mode) = @_;
232   
233    if($gs_mode eq "gs3") { # GS3 server is always persistent
234        return 1;
235    }
236   
237    my $command = "?a=is-persistent";   
238    my $check_responsemsg_against_regex = q/true/;  # isPersistent: true versus isPersistent: false     
239    return config($library_url, $command, $check_responsemsg_against_regex);
240}
241   
242sub get_library_URL {
243    my $gs_mode = shift(@_); # gs3 or gs2
244   
245    # If we get here, we are dealing with a server included with GS.
246    # For GS3, we ask ant for the library URL.
247    # For GS2, we derive the URL from the llssite.cfg file.
248   
249    my $url = undef;   
250   
251    if($gs_mode eq "gs2") {     
252        my $llssite_cfg = &util::filename_cat($ENV{'GSDLHOME'}, "llssite.cfg");
253       
254        if(-f $llssite_cfg) {
255            # check llssite.cfg for line with url property
256            # for server.exe also need to use portnumber and enterlib properties           
257           
258            # Read in the entire contents of the file in one hit
259            if (!open (FIN, $llssite_cfg)) {
260                &print_msg("activate.pl::get_library_URL failed to open $llssite_cfg ($!)\n");
261                return undef;
262            }
263           
264            my $contents;
265            sysread(FIN, $contents, -s FIN);           
266            close(FIN);
267           
268            my @lines = split(/[\n\r]+/, $contents); # split on carriage-returns and/or linefeeds
269            my $enterlib = "";
270            my $portnumber = ""; # will remain empty (implicit port 80) unless it's specifically been assigned
271           
272            foreach my $line (@lines) {             
273                if($line =~ m/^url=(.*)$/) {
274                    $url = $1;                 
275                } elsif($line =~ m/^enterlib=(.*)$/) {
276                    $enterlib = $1;                 
277                } elsif($line =~ m/^portnumber=(.*)$/) {
278                    $portnumber = $1;                   
279                }   
280            }
281           
282            if(!$url) {
283                return undef;
284            }
285            elsif($url eq "URL_pending") { # library is not running
286                # do not process url=URL_pending in the file, since for server.exe
287                # this just means the Enter Library button hasn't been pressed yet             
288                $url = undef;
289            }
290            else {
291                # In the case of server.exe, need to do extra work to get the proper URL
292                # But first, need to know whether we're indeed dealing with server.exe:
293               
294                # compare the URL's domain to the full URL
295                # E.g. for http://localhost:8383/greenstone3/cgi-bin, the domain is localhost:8383
296                my $uri = URI->new( $url );
297                my $host = $uri->host;
298                #print STDERR "@@@@@ host: $host\n";
299                if($url =~ m/http:\/\/$host(\/)?$/) {
300                    #if($url !~ m/http:\/\/$host:$portnumber(\/)?/ || $url =~ m/http:\/\/$host(\/)?$/) {
301                    # (if the URL does not contain the portnumber, OR if the port is implicitly 80 and)                 
302                    # If the domain with http:// prefix is completely the same as the URL, assume server.exe
303                    # then the actual URL is the result of suffixing the port and enterlib properties in llssite.cfg
304                    $url = $url.":".$portnumber.$enterlib;         
305                } # else, apache web server         
306               
307            }           
308        }
309    } elsif($gs_mode eq "gs3") {
310        # Either check build.properties for tomcat.server, tomcat.port and app.name (and default servlet name).
311        # app.name is stored in app.path by build.xml. Need to move app.name in build.properties from build.xml
312       
313        # Or, run the new target get-default-servlet-url
314        # the output can look like:
315        #
316        # Buildfile: build.xml
317        #   [echo] os.name: Windows Vista
318        #
319        # get-default-servlet-url:
320        #   [echo] http://localhost:8383/greenstone3/library
321        # BUILD SUCCESSFUL
322        # Total time: 0 seconds
323       
324        #my $output = qx/ant get-default-servlet-url/; # backtick operator, to get STDOUT (else 2>&1)
325            # see http://stackoverflow.com/questions/799968/whats-the-difference-between-perls-backticks-system-and-exec
326       
327            # The get-default-servlet-url ant target can be run from anywhere by specifying the
328            # location of GS3's ant build.xml buildfile. Activate.pl can be run from anywhere for GS3
329            # GSDL3SRCHOME will be set for GS3 by gs3-setup.sh, a step that would have been necessary
330            # to run the activate.pl script in the first place
331        my $perl_command = "ant -buildfile \"$ENV{'GSDL3SRCHOME'}/build.xml\" get-default-servlet-url";
332       
333        if (open(PIN, "$perl_command |")) {
334            while (defined (my $perl_output_line = <PIN>)) {
335                if($perl_output_line =~ m@http:\/\/(\S*)@) { # grab all the non-whitespace chars
336                    $url="http://".$1;
337                }
338            }
339            close(PIN);
340        } else {
341            &print_msg("activate.pl::get_library_URL: Failed to run $perl_command to work out library URL for $gs_mode\n");
342        }       
343    }
344   
345    # either the url is still undef or it is now set
346    #print STDERR "\n@@@@@ final URL:|$url|\n" if $url;     
347    #print STDERR "\n@@@@@ URL still undef\n" if !$url;
348    return $url;
349}
350
351### UNUSED METHODS TO MOVE TO util.pm?
352
353# This method is now unused. Using ping_library instead to send the ping action to a
354# GS2/GS3 server. This method can be used more generally to test whether a URL is alive.
355# http://search.cpan.org/dist/libwww-perl/lib/LWP/Simple.pm
356# and http://www.perlmonks.org/?node_id=618534
357sub is_URL_active {
358    my $url = shift(@_); # gs3 or gs2 URL   
359   
360    my $status = 0;
361    if(defined $url) {
362        $ua->timeout(5); # set LWP useragent to 5s max timeout for testing the URL
363            # Need to set this, else it takes I don't know how long to timeout
364            # http://www.perlmonks.org/?node_id=618534
365       
366        $status = LWP::Simple::head($url); # returns empty list of headers if it fails
367                # LWP::Simple::get($url) is more intensive, so don't need to do that
368        #print STDERR "**** $url is alive.\n" if $status;
369    }
370    return $status;
371}
372
373# Pinging seems to always return true, so this method doesn't work
374sub pingHost {
375    my $url = shift(@_); # gs3 or gs2 URL
376   
377    my $status = 0;
378    if(defined $url) {
379        # Get just the domain. "http://localhost/gsdl?uq=332033495" becomes "localhost"
380        # "http://localhost/greenstone/cgi-bin/library.cgi" becomes "localhost" too
381       
382        #my $host = $url;       
383        #$host =~ s@^http:\/\/(www.)?@@;       
384        #$host =~ s@\/.*@@;
385        #print STDERR "**** HOST: $host\n";
386       
387        # More robust way
388        # http://stackoverflow.com/questions/827024/how-do-i-extract-the-domain-out-of-an-url
389        my $uri = URI->new( $url );
390        my $host = $uri->host;
391       
392        # Ping the host. http://perldoc.perl.org/Net/Ping.html 
393        my $p = Net::Ping->new();       
394        $status = $p->ping($host); # || 0. Appears to set to undef rather than 0
395        print STDERR "**** $host is alive.\n" if $status; #print "$host is alive.\n" if $p->ping($host);
396        $p->close();       
397    }
398    # return whether pinging was a success or failure
399    return $status;
400}
401
402
403# Most of the arguments are familiar from the building scripts like buildcol.pl
404# The special optional argument -library_url is for when we're dealing with a web
405# library server such as an apache that's separate from any included with GS2.
406# In such a case, this script's caller should pass in -library_url <URL>.
407#
408# $site argument must be specified in the cmdline for collectionConfig.xml to get
409# generated which makes $gs_mode=gs3, else collect.cfg gets generated and $gs_mode=gs2
410sub main
411{
412    my ($argc,@argv) = @_;
413
414    if (($argc==0)  || (($argc==1) && ($argv[0] =~ m/^--?h(elp)?$/))) {
415        my ($progname) = ($0 =~ m/^.*[\/|\\](.*?)$/);
416
417
418        print STDERR "\n";
419        print STDERR "Usage: $progname [-collectdir c -builddir b -indexdir i -site s -removeold -keepold -verbosity v\n";
420        print STDERR "\t-library_url URL] <[colgroup/]collection>\n";
421        print STDERR "\n";
422
423        exit(-1);
424    }
425   
426    # get the collection details
427    my $qualified_collection = pop @argv; # qualified collection
428       
429    my $collect_dir = undef; #"collect"; # can't be "collect" when only -site is provided for GS3
430    my $build_dir = undef;
431    my $index_dir = undef;
432    my $site = undef;
433   
434    my $removeold = 0;
435    my $keepold = 0;
436   
437    my $library_url = undef; # to be specified on the cmdline if not using a GS-included web server
438   
439    while (my $arg = shift @argv) {
440        if ($arg eq "-collectdir") {
441            $collect_dir = shift @argv;
442        }
443        elsif ($arg eq "-builddir") {
444            $build_dir = shift @argv;
445        }
446        elsif ($arg eq "-indexdir") {
447            $index_dir = shift @argv;
448        }
449        elsif ($arg eq "-site") {
450            $site = shift @argv;
451        }
452        elsif ($arg eq "-removeold") {
453            $removeold = 1;
454        }
455        elsif ($arg eq "-keepold") {
456            $keepold = 1;
457        }
458        elsif ($arg eq "-library_url") {
459            $library_url = shift @argv;
460        }
461        elsif ($arg eq "-verbosity") {
462            $default_verbosity = shift @argv; # global variable
463           
464            # ensure we're working with ints not strings (int context not str context), in case verbosity=0
465            # http://stackoverflow.com/questions/288900/how-can-i-convert-a-string-to-a-number-in-perl
466            $default_verbosity = int($default_verbosity || 0); ### is this the best way?
467        }
468    }
469   
470    # work out the building and index dirs
471    my $collection_dir = &util::resolve_collection_dir($collect_dir, $qualified_collection, $site);
472    $build_dir = &util::filename_cat($collection_dir, "building") unless (defined $build_dir);
473    $index_dir = &util::filename_cat($collection_dir, "index") unless (defined $index_dir);
474   
475    &print_task_msg("Running  Collection  Activation  Stage");
476   
477    # can't do anything without a build directory with something in it to move into index
478    if(!&util::dir_exists($build_dir)) {
479        &print_msg("No building folder at $build_dir to move to index.\n");
480        exit -1;
481    } elsif (&util::is_dir_empty($build_dir)) {
482        &print_msg("Nothing in building folder $build_dir to move into index folder.\n");
483        exit -1;
484    }
485   
486    # get and check the collection name
487    if ((&colcfg::use_collection($site, $qualified_collection, $collect_dir)) eq "") {
488        &print_msg("Unable to use collection \"$qualified_collection\" within \"$collect_dir\"\n");
489        exit -1;
490    }
491   
492    # Read in the collection configuration file.
493    # Beware: Only if $site is specified in the cmdline does collectionConfig.xml get
494    # generated and does $gs_mode=gs3, else collect.cfg gets generated and $gs_mode=gs2
495    my ($collect_cfg_filename, $gs_mode) = &colcfg::get_collect_cfg_name(STDERR);
496    my $collectcfg = &colcfg::read_collection_cfg ($collect_cfg_filename,$gs_mode);
497
498    # look for build.cfg/buildConfig.xml
499    my $build_cfg_filename ="";
500   
501    if ($gs_mode eq "gs2") {
502        $build_cfg_filename = &util::filename_cat($build_dir,"build.cfg");
503    } else {
504        $build_cfg_filename = &util::filename_cat($build_dir, "buildConfig.xml");
505        # gs_mode is GS3. Set the site now if this was not specified as cmdline argument
506        #$site = "localsite" unless defined $site;
507    }
508   
509    # We need to know the buildtype for Solr.
510    # Any change of indexers is already detected and handled by the calling code (buildcol or
511    # full-rebuild), so that at this stage the config file's buildtype reflects the actual buildtype.
512
513    # From buildcol.pl we use searchtype for determining buildtype, but for old versions, use buildtype
514    my $buildtype;
515    if (defined $collectcfg->{'buildtype'}) {
516    $buildtype = $collectcfg->{'buildtype'};
517    } elsif (defined $collectcfg->{'searchtypes'} || defined $collectcfg->{'searchtype'}) {
518    $buildtype = "mgpp";
519    } else {
520    $buildtype = "mg"; #mg is the default
521    }
522   
523    # Now the logic in GLI's CollectionManager.java (processComplete()
524    # and installCollection()) and Gatherer.configGS3Server().
525
526    # 1. Get library URL
527   
528    # For web servers that are external to a Greenstone installation,
529    # the user can pass in their web server's library URL.
530    # For web servers included with GS (like tomcat for GS3 and server.exe
531    # and apache for GS2), we work out the library URL:
532    if(!$library_url) {
533        $library_url = &get_library_URL($gs_mode); # returns undef if no server is running
534    }
535   
536    # CollectionManager's installCollection phase in GLI
537    # 2. Ping the library URL, and if it's a persistent server and running, release the collection
538   
539    my $is_persistent_server = undef;
540    if($library_url) { # undef if no valid server URL
541   
542        &print_msg("Pinging $library_url\n");       
543        if(&ping_library($library_url, $gs_mode, $site)) { # server running
544       
545            # server is running, so release the collection if
546            # the server is persistent and the collection is active
547            &print_msg("Checking if Greenstone server is persistent\n");
548            $is_persistent_server = &is_persistent($library_url, $gs_mode);         
549           
550            if($is_persistent_server) { # only makes sense to issue activate and deactivate cmds to a persistent server
551               
552                &print_msg("Checking if the collection $qualified_collection is already active\n");
553                my $collection_active = &ping_library_collection($library_url, $gs_mode, $qualified_collection, $site);
554
555                if($collection_active) {
556                &print_msg("De-activating collection $qualified_collection\n");
557                &deactivate_collection($library_url, $gs_mode, $qualified_collection, $site);
558                }
559            }   
560        }
561    }
562   
563    # 3. Do all the moving building to index stuff now 
564
565    # If removeold: replace index dir with building dir.
566    # If keepold: move building's contents into index, where only duplicates will get deleted.
567    # removeold and keepold can't both be on at the same time
568    ($removeold, $keepold) = &scriptutil::check_removeold_and_keepold($removeold, $keepold,
569                           0, # incremental is irrelevant to what activate.pl does, setting this = 0
570                           $build_dir, # checkdir. Usually archives or export to be deleted. activate.pl deletes building
571                           $collectcfg);
572   
573    if($removeold) {
574       
575        if(&util::dir_exists($index_dir)) {
576            &print_task_msg("Removing \"index\"");
577            &util::rm_r($index_dir);
578           
579            # Wait for a couple of seconds, just for luck
580            sleep 2;
581           
582            if (&util::dir_exists($index_dir)) {
583                &print_msg("The index directory $index_dir could not be deleted.\n"); # CollectionManager.Index_Not_Deleted
584            }
585        }
586       
587        # if remote GS server: gliserver.pl would call activate.pl to activate
588        # the collection at this point since activate.pl lives on the server side
589       
590        # Move the building directory to become the new index directory
591        &print_task_msg("Moving \"building\" -> \"index\"");
592        &util::mv($build_dir, $index_dir);
593        if(&util::dir_exists($build_dir) || !&util::dir_exists($index_dir)) {           
594            &print_msg("Could not move $build_dir to $index_dir.\n"); # CollectionManager.Build_Not_Moved
595        }
596    }
597    elsif ($keepold) {
598        # Copy just the contents of building dir into the index dir, overwriting
599        # existing files, but don't replace index with building.
600        &print_task_msg("Moving \"building\" -> \"index\"");
601        &util::mv_dir_contents($build_dir, $index_dir);
602    }
603   
604    # 4. Ping the library URL, and if it's a persistent server and running, activate the collection again   
605   
606    # Check for success: if building does not exist OR is empty
607    if(!&util::dir_exists($build_dir) || &util::is_dir_empty($build_dir)) {
608   
609        if($library_url) { # undef if no valid server URL
610       
611            &print_msg("Pinging $library_url\n");
612            if(&ping_library($library_url, $gs_mode, $site)) { # server running
613           
614                # don't need to work out persistency of server more than once, since the libraryURL hasn't changed             
615                if(!defined $is_persistent_server) {
616                    &print_msg("Checking if Greenstone server is persistent\n");
617                    $is_persistent_server = &is_persistent($library_url, $gs_mode);
618                }
619               
620                   
621                if($is_persistent_server) { # persistent server, so can try activating collection
622
623                    &print_msg("Checking if the collection $qualified_collection is not already active\n");
624                    my $collection_active = &ping_library_collection($library_url, $gs_mode, $qualified_collection, $site);
625
626                    if(!$collection_active) {
627                    &print_msg("Activating collection $qualified_collection\n");
628                    &activate_collection($library_url, $gs_mode, $qualified_collection, $site);
629                   
630                    # unless an error occurred, the collection should now be active:
631                    $collection_active = &ping_library_collection($library_url, $gs_mode, $qualified_collection, $site);
632                    if(!$collection_active) {
633                        &print_msg("ERROR: collection $qualified_collection did not get activated\n");
634                    }
635                    }
636                }
637            }
638        }
639    } else { # installcollection failed     
640        #CollectionManager.Preview_Ready_Failed
641        &print_msg("Building directory is not empty or still exists. Failed to properly move $build_dir to $index_dir.\n");
642    }
643
644    &print_msg("\n");
645}
646
647&main(scalar(@ARGV),@ARGV);
Note: See TracBrowser for help on using the browser.