#!/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 <https://www.gnu.org/licenses/>.

use Getopt::Long;
use Modern::Perl;

Getopt::Long::Configure("bundling");

my $pwd = `pwd`;
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} || !$opts{command};
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}'" : " -c 'cd \"$pwd\"; $shell'" );

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`;
        $result = "$result:$result/lib";
    }
    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.
