Koha/debian/scripts/koha-shell
Jonathan Druart ab94a12ee4
Bug 17532: Make koha-shell propagate the error code
Context: I am trying to make koha-misc4dev stop when something wrong happens.
Basically we do not want the process to continue of the DB has not been populated correctly.
It will make the errors easier to catch.

The issue: Say a script that will return an error (die in perl for an easy example),
koha-shell will not return the 255 error code, but 0 instead.
The caller cannot know something wrong happened

The solution is to propagate the error and make koha-shell return the same error code
as the command it executed

An example:
=== t.pl ===
die('something wrong');

% perl t.pl;echo $?
something wrong at t.pl line 1.
255

% sudo koha-shell kohadev -p -c 'perl xxx.pl' ; echo $?
something wrong at xxx.pl line 1.
0

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Tested it with
  $ sudo debian/scripts/koha-shell kohadev -c 'exit 8'
  $ echo $?
  8
The unpatched version returns 0 (forgets about the error code).

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2020-03-03 09:15:57 +00:00

110 lines
3.4 KiB
Perl
Executable file

#!/usr/bin/perl
# koha-shell -- put you in a shell with a koha environment set up
# Copyright 2012 Catalyst IT, Ltd
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>.
use Getopt::Long;
use Modern::Perl;
Getopt::Long::Configure("bundling");
my %opts;
my $res = GetOptions( \%opts, "command|c=s", "help|h", "login|l", "shell|s=s",
"preserve-environment|p|m", "verbose|v" );
if ( !$res || $opts{help} ) {
show_help( !$res );
exit( !$res );
}
if ( !@ARGV ) {
show_help( 1, "An instance name must be supplied." );
exit(1);
}
my $instance = shift @ARGV;
if ( !-e "/etc/koha/sites/$instance" ) {
show_help( 1, "The instance doesn't exist: $instance" );
exit(1);
}
my $shell = $opts{shell} || $ENV{SHELL} || '/bin/sh';
# Now we're set up, build the 'su' command
my $perl5lib = read_perl5lib( $instance );
my @su_args;
push @su_args, '/usr/bin/sudo';
push @su_args, '--preserve-env' if $opts{'preserve-environment'};
push @su_args, '--login' if $opts{login};
push @su_args, "-u", "$instance-koha";
push @su_args,
"env "
. "KOHA_CONF=/etc/koha/sites/$instance/koha-conf.xml "
. "PERL5LIB=$perl5lib $shell"
. ( $opts{command} ? " -c '$opts{command}'" : '' );
print "Command: '".join("' '",@su_args)."'\n" if $opts{verbose};
system("@su_args");
if ( $? == -1 ) {
print STDERR "failed to execute: $!\n";
}
elsif ( $? & 127 ) {
printf STDERR "child died with signal %d, %s coredump\n",
( $? & 127 ), ( $? & 128 ) ? 'with' : 'without';
}
exit $? >> 8;
sub show_help {
my ( $err, $msg ) = @_;
my $fh = $err ? *STDERR : *STDOUT;
say $fh "Error: " . $msg if $msg;
print $fh $_ while <DATA>;
}
sub read_perl5lib {
my ( $instance ) = @_;
# This simulates what the debian shell scripts do:
# Read /etc/default/koha-common
# Check dev_install in koha-conf.xml
my $result = `grep "^PERL5LIB=" /etc/default/koha-common`;
chomp $result;
$result =~ s/^PERL5LIB=\s*//;
my $dev_install = `xmlstarlet sel -t -v 'yazgfs/config/dev_install' /etc/koha/sites/$instance/koha-conf.xml`;
chomp $dev_install;
if ( $dev_install ) {
# pick PERL5LIB from the intranetdir entry
$result = `xmlstarlet sel -t -v "yazgfs/config/intranetdir" /etc/koha/sites/$instance/koha-conf.xml`;
}
return $result;
}
__DATA__
koha-shell -- gives you a shell with your Koha environment set up
Usage: koha-shell [options] [instance name]
Options:
-c, --command COMMAND pass COMMAND to the invoked shell
-h, --help show this help and quit
-l, --login make the shell a login shell
-m, -p,
--preserve-environment do not reset environment variables
-s, --shell SHELL use SHELL instead of the one from your environment
-v, --verbose output the full command that will be executed
The default shell is the one currently in use. Refer to su(1) for more detail
on these options.