Koha/debian/scripts/koha-plack
pongtawat afb62d9a6c Bug 17814: koha-plack --stop should make sure that Plack really stop
koha-plack --stop doesn't ensure that Plack was really stopped before
returning

So in case that koha-plack --stop was quickly follows by koha-plack
--start (e.g. logrotate), it could leave Plack in stop state. This is
due to koha-plack --start think that Plack was already started, while it
actually is being stopped.

For me I think this is the cause why I got random Plack stop when
logrotate is run.

It should be similar to the case of Zebra in Bug #16885, and the
solution might be the same: adding "--retry=TERM/30/KILL/5;" to
start-stop-daemon command.

TEST PLAN
---------
1) Login to staff client and do something that will hold connection for
a long time, e.g. a batch import or a slow report.
2) sudo koha-plack --stop mykoha
3) ps aux | grep plack   <-- a Plack process will still running work in
1)
4) wait for 1) to finish and all Plack processes exit
5) sudo koha-plack --start mykoha
6) apply the patch
7) repeat step 1)-2)
8) ps aux | grep plack   <-- There should be no Plack process running
now
9) Note that work in step 1) might get terminated midway. Since we force
Plack to stop after some wait.

Signed-off-by: Marc Véron <veron@veron.ch>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
2017-04-21 07:38:10 -04:00

322 lines
8.9 KiB
Bash
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Copyright 2015 Theke Solutions
#
# 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
--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"
STARMANOPTS="-M FindBin --max-requests ${PLACK_MAX_REQUESTS} --workers ${PLACK_WORKERS} \
--user=${instancename}-koha --group ${instancename}-koha \
--pid ${PIDFILE} \
--daemonize \
--access-log /var/log/koha/${instancename}/plack.log \
--error-log /var/log/koha/${instancename}/plack-error.log \
-E deployment --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}"
if ${STARMAN} ${STARMANOPTS}; then
log_end_msg 0
else
log_end_msg 1
fi
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"
# 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 ;;
-*)
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 KOHA_HOME PERL5LIB=$PERL5LIB:$KOHA_HOME/installer:$KOHA_HOME/lib/installer
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