########################################################################### # # buildaction.pm -- # A component of the Greenstone digital library software # from the New Zealand Digital Library Project at the # University of Waikato, New Zealand. # # Copyright (C) 2009 New Zealand Digital Library Project # # This program is free software; you can redistr te it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ########################################################################### package buildaction; use strict; use JSON; use cgiactions::baseaction; use dbutil; use ghtml; use util; BEGIN { # unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8"); require XML::Rules; } @buildaction::ISA = ('baseaction'); # 'a' for action, and 'c' for collection are also compulsorary, and # added in automatically by baseaction my $action_table = { "full-import" => { 'compulsory-args' => [], 'optional-args' => [] }, "full-buildcol" => { 'compulsory-args' => [], 'optional-args' => [] }, "full-rebuild" => { 'compulsory-args' => [], 'optional-args' => [] }, "incremental-import" => { 'compulsory-args' => [], 'optional-args' => [] }, "incremental-buildcol" => { 'compulsory-args' => [], 'optional-args' => [] }, "incremental-rebuild" => { 'compulsory-args' => [], 'optional-args' => [] }, "build-by-manifest" => { 'compulsory-args' => [], 'optional-args' => ["index-files", "reindex-files", "delete-OIDs"] } }; sub new { my $class = shift (@_); my ($gsdl_cgi,$iis6_mode) = @_; my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode); return bless $self, $class; } sub run_build_cmd { my $self = shift @_; my ($cmd) = @_; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; my $output = `$cmd 2>&1`; my $status = $?; my $report = undef; if ($status == 0) { $report = "Perl build successful: $cmd\n--\n"; $report .= "$output\n"; } else { $report = "Perl rebuild failed: $cmd\n--\n"; $report .= "$output\n"; $report .= "Exit status: " . ($status / 256) . "\n"; ## $report .= $gsdl_cgi->check_perl_home(); # $report .= "PATH = ". $ENV{'PATH'}. "\n"; } return($status,$report); } sub full_import { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S full-import.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub full_buildcol { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S full-buildcol.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub full_rebuild { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S full-rebuild.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub incremental_import { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-import.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub incremental_buildcol { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-buildcol.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub incremental_rebuild { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-rebuild.pl \"$collect\""; my ($status,$report) = $self->run_build_cmd($cmd); # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } } sub build_by_manifest { my $self = shift @_; my $username = $self->{'username'}; my $collect = $self->{'collect'}; my $gsdl_cgi = $self->{'gsdl_cgi'}; my $gsdl_home = $self->{'gsdlhome'}; # Authenticate user if it is enabled if ($baseaction::authentication_enabled) { # Ensure the user is allowed to edit this collection &authenticate_user($gsdl_cgi, $username, $collect); } # Obtain the collect dir my $collect_dir = &util::filename_cat($gsdl_home, "collect"); # Make sure the collection isn't locked by someone else $self->lock_collection($username, $collect); my $if_json_str = $self->{'index-files'}; my $rf_json_str = $self->{'reindex-files'}; my $df_json_str = $self->{'delete-OIDs'}; my $index_files = (defined $if_json_str) ? decode_json $if_json_str : []; my $reindex_files = (defined $rf_json_str) ? decode_json $rf_json_str : []; my $delete_files = (defined $df_json_str) ? decode_json $df_json_str : []; my $index_files_xml = join("\n", map { " $_" } @$index_files); my $reindex_files_xml = join("\n", map { " $_" } @$reindex_files); my $delete_files_xml = join("\n", map { " $_" } @$delete_files); my $manifest_filename = &util::get_tmp_filename(".xml"); my ($status,$report); if (open(MOUT,">$manifest_filename")) { binmode(MOUT,":utf8"); print MOUT < $index_files_xml $reindex_files_xml $delete_files_xml MOUTRAW close(MOUT); ## my $bin_script = &util::filename_cat($gsdl_home,"bin","script"); my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-rebuild.pl -manifest \"$manifest_filename\" \"$collect\""; ($status,$report) = $self->run_build_cmd($cmd); if ($status==0) { &util::rm($manifest_filename); } } else { $status = -1; $report = "Failed to open '$manifest_filename' for output\n$!\n"; } # Release the lock once it is done $self->unlock_collection($username, $collect); if ($status==0) { $gsdl_cgi->generate_ok_message($report); } else { $gsdl_cgi->generate_error($report); } # incremental-rebuild.pl -manifest manifest.xml \"" + _greenstoneCollectionName + "\""; } 1;