Tomas Cohen Arazi
4e3c60a192
This patch makes koha-plack jump into the instance's home directory to run. It is required because Perl 5.18 introduced a breaking change that makes perl die if @INC includes directories for which the user doesn't have read permission, and need to be traversed when querying for a lib. This is the case of '.', which is introduced automatically into @INC until Perl 5.26 (which removes the 'feature'). The Mojolicious::Plugins lib prefixes the plugin names with 'Mojolicious::Plugin' so it first looks (for example) for Mojolicious::Plugin::Koha::REST::Plugin::Pagination (Pagination is just the first one on the list). When it looks for it at '.' it dies (because of Perl's behaviour) so it doesn't query for the right namespace (the following to try). I only reproduced it in koha-testing-docker. To test, you just need to try this patched koha-plack and make sure it doesn't break due to this permissions issue. To test: - In your koha-testing-docker clone, run: $ docker-compose up -p test - Open a shell inside the container (on a separate terminal): $ docker exec -it test_koha_1 bash - From within the /root directory, restart plack: $ cd /root $ koha-plack --restart kohadev => FAIL: Logs show plack is broken due to permissions problems trying to find Mojolicious::Plugin::Koha::REST::Plugin::Pagination - Use the patched script from this patch: $ /kohadevbox/koha/debian/scripts/koha-plack --restart kohadev => SUCCESS: Plack runs fine, no error in the logs - Sign off :-D Note: people who has environments in which the problems is reproducible, please test this version of koha-plack and stamp your sign-off, PLEASE. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
380 lines
11 KiB
Bash
Executable file
380 lines
11 KiB
Bash
Executable file
#!/bin/bash
|
||
#
|
||
# Copyright 2015 Theke Solutions
|
||
# Copyright 2016 Koha-Suomi
|
||
#
|
||
# This file is part of Koha.
|
||
#
|
||
# 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/>.
|
||
|
||
set -e
|
||
|
||
. /lib/lsb/init-functions
|
||
|
||
# Read configuration variable file if it is present
|
||
[ -r /etc/default/koha-common ] && . /etc/default/koha-common
|
||
|
||
# include helper functions
|
||
if [ -f "/usr/share/koha/bin/koha-functions.sh" ]; then
|
||
. "/usr/share/koha/bin/koha-functions.sh"
|
||
else
|
||
echo "Error: /usr/share/koha/bin/koha-functions.sh not present." 1>&2
|
||
exit 1
|
||
fi
|
||
|
||
usage()
|
||
{
|
||
local scriptname=$(basename $0)
|
||
|
||
cat <<EOF
|
||
$scriptname
|
||
|
||
This script lets you manage the plack daemons for your Koha instances.
|
||
|
||
Usage:
|
||
$scriptname --start|--stop|--restart [--quiet|-q] instancename1 [instancename2...]
|
||
$scriptname --enable|--disable instancename1 [instancename2]
|
||
$scriptname -h|--help
|
||
|
||
--start Start the plack daemon for the specified instances
|
||
--stop Stop the plack daemon for the specified instances
|
||
--restart Restart the plack daemon for the specified instances
|
||
--enable Enable plack for the specified instances
|
||
--disable Disable plack for the specified instances
|
||
--debugger Enable running Plack in debug mode
|
||
--debugger-key Specify the key the IDE is expecting
|
||
--debugger-location Specify the host:port for your debugger tool (defaults
|
||
to localhost:9000)
|
||
--debugger-path Specify the path for the debugger library
|
||
--quiet|-q Make the script quiet about non existent instance names
|
||
(useful for calling from another scripts).
|
||
--help|-h Display this help message
|
||
|
||
EOF
|
||
}
|
||
|
||
start_plack()
|
||
{
|
||
local instancename=$1
|
||
|
||
local PIDFILE="/var/run/koha/${instancename}/plack.pid"
|
||
local PLACKSOCKET="/var/run/koha/${instancename}/plack.sock"
|
||
local PSGIFILE="/etc/koha/plack.psgi"
|
||
local NAME="${instancename}-koha-plack"
|
||
|
||
if [ -e "/etc/koha/sites/${instancename}/plack.psgi" ]; then
|
||
# pick instance-specific psgi file
|
||
PSGIFILE="/etc/koha/sites/${instancename}/plack.psgi"
|
||
fi # else stick with the default one
|
||
|
||
_check_and_fix_perms $instancename
|
||
|
||
PLACK_MAX_REQUESTS=$(run_safe_xmlstarlet $instancename plack_max_requests)
|
||
[ -z $PLACK_MAX_REQUESTS ] && PLACK_MAX_REQUESTS="50"
|
||
PLACK_WORKERS=$(run_safe_xmlstarlet $instancename plack_workers)
|
||
[ -z $PLACK_WORKERS ] && PLACK_WORKERS="2"
|
||
|
||
instance_user="${instancename}-koha"
|
||
|
||
environment="deployment"
|
||
daemonize="--daemonize"
|
||
logging="--access-log /var/log/koha/${instancename}/plack.log \
|
||
--error-log /var/log/koha/${instancename}/plack-error.log"
|
||
max_requests_and_workers="--max-requests ${PLACK_MAX_REQUESTS} --workers ${PLACK_WORKERS}"
|
||
|
||
if [ "$debug_mode" = "yes" ]; then
|
||
environment="development"
|
||
daemonize=""
|
||
logging="" # remote debugger takes care
|
||
max_requests_and_workers="--workers 1"
|
||
STARMAN="/usr/bin/perl -d ${STARMAN}"
|
||
fi
|
||
|
||
STARMANOPTS="-M FindBin ${max_requests_and_workers} \
|
||
--user=${instance_user} --group ${instancename}-koha \
|
||
--pid ${PIDFILE} ${daemonize} ${logging} \
|
||
-E ${environment} --socket ${PLACKSOCKET} ${PSGIFILE}"
|
||
|
||
if ! is_plack_running ${instancename}; then
|
||
export KOHA_CONF="/etc/koha/sites/${instancename}/koha-conf.xml"
|
||
|
||
log_daemon_msg "Starting Plack daemon for ${instancename}"
|
||
|
||
# Change to the instance's user dir
|
||
current_dir=$(pwd)
|
||
eval cd ~$instance_user
|
||
|
||
if ${STARMAN} ${STARMANOPTS}; then
|
||
log_end_msg 0
|
||
else
|
||
log_end_msg 1
|
||
fi
|
||
# Go back to the original dir
|
||
cd $current_dir
|
||
|
||
else
|
||
log_daemon_msg "Error: Plack already running for ${instancename}"
|
||
log_end_msg 1
|
||
fi
|
||
}
|
||
|
||
stop_plack()
|
||
{
|
||
local instancename=$1
|
||
|
||
local PIDFILE="/var/run/koha/${instancename}/plack.pid"
|
||
|
||
if is_plack_running ${instancename}; then
|
||
|
||
log_daemon_msg "Stopping Plack daemon for ${instancename}"
|
||
|
||
if start-stop-daemon --pidfile ${PIDFILE} --stop --retry=TERM/30/KILL/5; then
|
||
log_end_msg 0
|
||
else
|
||
log_end_msg 1
|
||
fi
|
||
else
|
||
log_daemon_msg "Error: Plack not running for ${instancename}"
|
||
log_end_msg 1
|
||
fi
|
||
}
|
||
|
||
restart_plack()
|
||
{
|
||
local instancename=$1
|
||
|
||
local PIDFILE="/var/run/koha/${instancename}/plack.pid"
|
||
|
||
if is_plack_running ${instancename}; then
|
||
|
||
log_daemon_msg "Restarting Plack daemon for ${instancename}"
|
||
|
||
if stop_plack $instancename && start_plack $instancename; then
|
||
log_end_msg 0
|
||
else
|
||
log_end_msg 1
|
||
fi
|
||
else
|
||
log_daemon_msg "Error: Plack not running for ${instancename}"
|
||
log_end_msg 1
|
||
fi
|
||
}
|
||
|
||
enable_plack()
|
||
{
|
||
local instancename=$1
|
||
local instancefile=$(get_apache_config_for "$instancename")
|
||
|
||
if ! is_plack_enabled $instancename; then
|
||
# Uncomment the plack related lines for OPAC and intranet
|
||
sed -i 's:^\s*#\(\s*Include /etc/koha/apache-shared-opac-plack.conf\)$:\1:' "$instancefile"
|
||
sed -i 's:^\s*#\(\s*Include /etc/koha/apache-shared-intranet-plack.conf\)$:\1:' "$instancefile"
|
||
[ "${quiet}" != "yes" ] && warn "Plack enabled for ${instancename}"
|
||
return 0
|
||
else
|
||
[ "${quiet}" != "yes" ] && warn "Plack already enabled for ${instancename}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
disable_plack()
|
||
{
|
||
local instancename=$1
|
||
local instancefile=$(get_apache_config_for "$instancename")
|
||
|
||
if is_plack_enabled $instancename; then
|
||
# Comment out the plack related lines for OPAC and intranet
|
||
sed -i 's:^\(\s*Include /etc/koha/apache-shared-opac-plack.conf\)$:#\1:' "$instancefile"
|
||
sed -i 's:^\(\s*Include /etc/koha/apache-shared-intranet-plack.conf\)$:#\1:' "$instancefile"
|
||
[ "${quiet}" != "yes" ] && warn "Plack disabled for ${instancename}"
|
||
return 0
|
||
else
|
||
[ "${quiet}" != "yes" ] && warn "Plack already disabled for ${instancename}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
check_env_and_warn()
|
||
{
|
||
local apache_version_ok="no"
|
||
local required_modules="headers proxy_http"
|
||
local missing_modules=""
|
||
|
||
if /usr/sbin/apache2ctl -v | grep -q "Server version: Apache/2.4"; then
|
||
apache_version_ok="yes"
|
||
fi
|
||
|
||
for module in ${required_modules}; do
|
||
if ! /usr/sbin/apachectl -M 2> /dev/null | grep -q ${module}; then
|
||
missing_modules="${missing_modules}${module} "
|
||
fi
|
||
done
|
||
|
||
if [ "${apache_version_ok}" != "yes" ]; then
|
||
warn "WARNING: koha-plack requires Apache 2.4.x and you don't have that."
|
||
fi
|
||
|
||
if [ "${missing_modules}" != "" ]; then
|
||
cat 1>&2 <<EOM
|
||
WARNING: koha-plack requires some Apache modules that you are missing.
|
||
You can install them with:
|
||
|
||
sudo a2enmod ${missing_modules}
|
||
|
||
EOM
|
||
|
||
fi
|
||
}
|
||
|
||
_check_and_fix_perms()
|
||
{
|
||
local instance=$1
|
||
|
||
local files="/var/log/koha/${instance}/plack.log \
|
||
/var/log/koha/${instance}/plack-error.log"
|
||
|
||
for file in ${files}
|
||
do
|
||
if [ ! -e "${file}" ]; then
|
||
touch ${file}
|
||
fi
|
||
chown "${instance}-koha":"${instance}-koha" ${file}
|
||
done
|
||
}
|
||
|
||
set_action()
|
||
{
|
||
if [ "$op" = "" ]; then
|
||
op=$1
|
||
else
|
||
die "Error: only one action can be specified."
|
||
fi
|
||
}
|
||
|
||
STARMAN=$(which starman)
|
||
op=""
|
||
quiet="no"
|
||
debug_mode="no"
|
||
debugger_key=""
|
||
debugger_location="localhost:9000"
|
||
debugger_path=""
|
||
|
||
# Read command line parameters
|
||
while [ $# -gt 0 ]; do
|
||
|
||
case "$1" in
|
||
-h|--help)
|
||
usage ; exit 0 ;;
|
||
-q|--quiet)
|
||
quiet="yes"
|
||
shift ;;
|
||
--start)
|
||
set_action "start"
|
||
shift ;;
|
||
--stop)
|
||
set_action "stop"
|
||
shift ;;
|
||
--restart)
|
||
set_action "restart"
|
||
shift ;;
|
||
--enable)
|
||
set_action "enable"
|
||
shift ;;
|
||
--disable)
|
||
set_action "disable"
|
||
shift ;;
|
||
--debugger)
|
||
debug_mode="yes"
|
||
shift ;;
|
||
--debugger-key)
|
||
debugger_key="$2"
|
||
shift 2 ;;
|
||
--debugger-location)
|
||
debugger_location="$2"
|
||
shift 2 ;;
|
||
--debugger-path)
|
||
debugger_path="$2"
|
||
shift 2 ;;
|
||
-*)
|
||
die "Error: invalid option switch ($1)" ;;
|
||
*)
|
||
# We expect the remaining stuff are the instance names
|
||
break ;;
|
||
esac
|
||
|
||
done
|
||
|
||
[ "${quiet}" != "yes" ] && check_env_and_warn
|
||
|
||
if [ $# -gt 0 ]; then
|
||
# We have at least one instance name
|
||
for name in "$@"; do
|
||
|
||
if is_instance $name; then
|
||
|
||
adjust_paths_dev_install $name
|
||
export DEV_INSTALL
|
||
export KOHA_HOME
|
||
PERL5LIB=$PERL5LIB:$KOHA_HOME/installer:$KOHA_HOME/lib/installer
|
||
# If debug mode is enabled, add the debugger lib path
|
||
# to PERL5LIB if appropriate
|
||
if [ "$debug_mode" = "yes" ]; then
|
||
if [ "$debugger_path" != "" ]; then
|
||
PERL5LIB="${debugger_path}":$PERL5LIB
|
||
fi
|
||
export PERL5DB="BEGIN { require q(${debugger_path}/perl5db.pl) }"
|
||
export PERLDB_OPTS="RemotePort=${debugger_location} async=1 LogFile=/var/log/koha/${name}/plack-debug.log"
|
||
export DBGP_IDEKEY=${debugger_key}
|
||
export PLACK_DEBUG=1
|
||
export PERL5OPT="-d"
|
||
fi
|
||
|
||
export PERL5LIB
|
||
|
||
case $op in
|
||
"start")
|
||
start_plack $name
|
||
;;
|
||
"stop")
|
||
stop_plack $name
|
||
;;
|
||
"restart")
|
||
restart_plack $name
|
||
;;
|
||
"enable")
|
||
enable_plack $name
|
||
;;
|
||
"disable")
|
||
disable_plack $name
|
||
;;
|
||
*)
|
||
usage
|
||
;;
|
||
esac
|
||
|
||
else
|
||
if [ "$quiet" = "no" ]; then
|
||
log_daemon_msg "Error: Invalid instance name $name"
|
||
log_end_msg 1
|
||
fi
|
||
fi
|
||
|
||
done
|
||
else
|
||
if [ "$quiet" = "no" ]; then
|
||
warn "Error: you must provide at least one instance name"
|
||
fi
|
||
fi
|
||
|
||
exit 0
|