"Fossies" - the Fresh Open Source Software Archive

Member "koha-19.11.15/debian/scripts/koha-plack" (23 Feb 2021, 13538 Bytes) of package /linux/misc/koha-19.11.15.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Bash source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #!/bin/bash
    2 #
    3 # Copyright 2015 Theke Solutions
    4 # Copyright 2016 Koha-Suomi
    5 #
    6 # This file is part of Koha.
    7 #
    8 # This program is free software: you can redistribute it and/or modify
    9 # it under the terms of the GNU General Public License as published by
   10 # the Free Software Foundation, either version 3 of the License, or
   11 # (at your option) any later version.
   12 #
   13 # This program is distributed in the hope that it will be useful,
   14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
   15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16 # GNU General Public License for more details.
   17 #
   18 # You should have received a copy of the GNU General Public License
   19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
   20 
   21 set -e
   22 
   23 . /lib/lsb/init-functions
   24 
   25 # Read configuration variable file if it is present
   26 [ -r /etc/default/koha-common ] && . /etc/default/koha-common
   27 
   28 # include helper functions
   29 if [ -f "/usr/share/koha/bin/koha-functions.sh" ]; then
   30     . "/usr/share/koha/bin/koha-functions.sh"
   31 else
   32     echo "Error: /usr/share/koha/bin/koha-functions.sh not present." 1>&2
   33     exit 1
   34 fi
   35 
   36 usage()
   37 {
   38     local scriptname=$(basename $0)
   39 
   40     cat <<EOF
   41 $scriptname
   42 
   43 This script lets you manage the plack daemons for your Koha instances.
   44 
   45 Usage:
   46 $scriptname --start|--stop|--restart [--quiet|-q] instancename1 [instancename2...]
   47 $scriptname --enable|--disable instancename1 [instancename2]
   48 $scriptname -h|--help
   49 
   50     --start               Start the plack daemon for the specified instances
   51     --stop                Stop the plack daemon for the specified instances
   52     --restart             Restart the plack daemon for the specified instances
   53     --enable              Enable plack for the specified instances
   54     --disable             Disable plack for the specified instances
   55     --debugger            Enable running Plack in debug mode
   56     --debugger-key        Specify the key the IDE is expecting
   57     --debugger-location   Specify the host:port for your debugger tool (defaults
   58                           to localhost:9000)
   59     --debugger-path       Specify the path for the debugger library
   60     --quiet|-q            Make the script quiet about non existent instance names
   61                           (useful for calling from another scripts).
   62     --help|-h             Display this help message
   63 
   64 EOF
   65 }
   66 
   67 start_plack()
   68 {
   69     local instancename=$1
   70 
   71     local PIDFILE="/var/run/koha/${instancename}/plack.pid"
   72     local PLACKSOCKET="/var/run/koha/${instancename}/plack.sock"
   73     local PSGIFILE="/etc/koha/plack.psgi"
   74     local NAME="${instancename}-koha-plack"
   75 
   76     if [ -e "/etc/koha/sites/${instancename}/plack.psgi" ]; then
   77         # pick instance-specific psgi file
   78         PSGIFILE="/etc/koha/sites/${instancename}/plack.psgi"
   79     fi # else stick with the default one
   80 
   81     _check_and_fix_perms $instancename
   82 
   83     PLACK_MAX_REQUESTS=$(run_safe_xmlstarlet $instancename plack_max_requests)
   84     [ -z $PLACK_MAX_REQUESTS ] && PLACK_MAX_REQUESTS="50"
   85     PLACK_WORKERS=$(run_safe_xmlstarlet $instancename plack_workers)
   86     [ -z $PLACK_WORKERS ] && PLACK_WORKERS="2"
   87 
   88     instance_user="${instancename}-koha"
   89 
   90     environment="deployment"
   91     daemonize="--daemonize"
   92     logging="--access-log /var/log/koha/${instancename}/plack.log \
   93              --error-log /var/log/koha/${instancename}/plack-error.log"
   94     max_requests_and_workers="--max-requests ${PLACK_MAX_REQUESTS} --workers ${PLACK_WORKERS}"
   95 
   96     if [ "$DEV_INSTALL" = "1" ]; then
   97         # Maybe we should switch off debug_mode if DEV_INSTALL is not set?
   98         environment="development"
   99     fi
  100 
  101     if [ "$debug_mode" = "yes" ]; then
  102         environment="development"
  103         daemonize=""
  104         logging="" # remote debugger takes care
  105         max_requests_and_workers="--workers 1"
  106         STARMAN="/usr/bin/perl -d ${STARMAN}"
  107     fi
  108 
  109     STARMANOPTS="-M FindBin ${max_requests_and_workers} \
  110                  --user=${instance_user} --group ${instancename}-koha \
  111                  --pid ${PIDFILE} ${daemonize} ${logging} \
  112                  -E ${environment} --socket ${PLACKSOCKET} ${PSGIFILE}"
  113 
  114     if ! is_plack_running ${instancename}; then
  115         export KOHA_CONF="/etc/koha/sites/${instancename}/koha-conf.xml"
  116 
  117         log_daemon_msg "Starting Plack daemon for ${instancename}"
  118 
  119         # Change to the instance's user dir
  120         current_dir=$(pwd)
  121         eval cd ~$instance_user
  122 
  123         if ${STARMAN} ${STARMANOPTS}; then
  124             log_end_msg 0
  125         else
  126             log_end_msg 1
  127         fi
  128         # Go back to the original dir
  129         cd "$current_dir"
  130 
  131     else
  132         log_daemon_msg "Error: Plack already running for ${instancename}"
  133         log_end_msg 1
  134     fi
  135 }
  136 
  137 stop_plack()
  138 {
  139     local instancename=$1
  140 
  141     local PIDFILE="/var/run/koha/${instancename}/plack.pid"
  142 
  143     if is_plack_running ${instancename}; then
  144 
  145         log_daemon_msg "Stopping Plack daemon for ${instancename}"
  146 
  147         if start-stop-daemon --pidfile ${PIDFILE} --user="${instancename}-koha" --stop --retry=TERM/30/KILL/5; then
  148             log_end_msg 0
  149         else
  150             log_end_msg 1
  151         fi
  152     else
  153         log_daemon_msg "Error: Plack not running for ${instancename}"
  154         log_end_msg 1
  155     fi
  156 }
  157 
  158 restart_plack()
  159 {
  160     local instancename=$1
  161 
  162     local PIDFILE="/var/run/koha/${instancename}/plack.pid"
  163 
  164     if is_plack_running ${instancename}; then
  165         stop_plack $instancename && start_plack $instancename
  166     else
  167         log_daemon_msg "Error: Plack not running for ${instancename}"
  168         log_end_msg 1
  169     fi
  170 }
  171 
  172 enable_plack()
  173 {
  174     local instancename=$1
  175     local instancefile=$(get_apache_config_for "$instancename")
  176 
  177     alreadyopac=0
  178     alreadyintra=0
  179     failopac=0
  180     failintra=0
  181     if ! is_plack_enabled_opac $instancefile; then
  182         # Uncomment the plack related lines for OPAC
  183         sed -i 's:^\s*#\(\s*Include /etc/koha/apache-shared-opac-plack.conf\)$:\1:' "$instancefile"
  184         if ! is_plack_enabled_opac $instancefile; then
  185             [ "${quiet}" != "yes" ] && warn "Plack not enabled for ${instancename} OPAC"
  186             failopac=1
  187         else
  188             [ "${quiet}" != "yes" ] && warn "Plack enabled for ${instancename} OPAC"
  189         fi
  190     else
  191         [ "${quiet}" != "yes" ] && warn "Plack already enabled for ${instancename} OPAC"
  192         alreadyopac=1
  193     fi
  194     if ! is_plack_enabled_intranet $instancefile; then
  195         # Uncomment the plack related lines for intranet
  196         sed -i 's:^\s*#\(\s*Include /etc/koha/apache-shared-intranet-plack.conf\)$:\1:' "$instancefile"
  197         if ! is_plack_enabled_intranet $instancefile; then
  198             [ "${quiet}" != "yes" ] && warn "Plack not enabled for ${instancename} Intranet"
  199             failintra=1
  200         else
  201             [ "${quiet}" != "yes" ] && warn "Plack enabled for ${instancename} Intranet"
  202         fi
  203     else
  204         [ "${quiet}" != "yes" ] && warn "Plack already enabled for ${instancename} Intranet"
  205         alreadyintra=1
  206     fi
  207 
  208     # Fail if it was already plack enabled.
  209     if [ $alreadyopac -eq 1 ] && [ $alreadyintra -eq 1 ] ; then
  210         return 1
  211     elif [ "$alreadyopac" != "$alreadyintra" ]; then
  212         [ "${quiet}" != "yes" ] && warn "$instancename had a plack configuration error. Please confirm it is corrected."
  213     fi
  214 
  215     # Succeed if both or any plack were turned on.
  216     if [ $failopac -eq 0 ] ||  [ $failintra -eq 0 ] ; then
  217         return 0
  218     else
  219         return 1
  220     fi
  221 }
  222 
  223 disable_plack()
  224 {
  225     local instancename=$1
  226     local instancefile=$(get_apache_config_for "$instancename")
  227 
  228     alreadyopac=0
  229     alreadyintra=0
  230     failopac=0
  231     failintra=0
  232     if is_plack_enabled_opac $instancefile ; then
  233         # Comment the plack related lines for OPAC
  234         sed -i 's:^\(\s*Include /etc/koha/apache-shared-opac-plack.conf\)$:#\1:' "$instancefile"
  235         if is_plack_enabled_opac $instancefile ; then
  236             [ "${quiet}" != "yes" ] && warn "Plack not disabled for ${instancename} OPAC"
  237             failopac=1
  238         else
  239             [ "${quiet}" != "yes" ] && warn "Plack disabled for ${instancename} OPAC"
  240         fi
  241     else
  242         [ "${quiet}" != "yes" ] && warn "Plack already disabled for ${instancename} OPAC"
  243         alreadyopac=1
  244     fi
  245     if is_plack_enabled_intranet $instancefile; then
  246         # Comment the plack related lines for intranet
  247         sed -i 's:^\(\s*Include /etc/koha/apache-shared-intranet-plack.conf\)$:#\1:' "$instancefile"
  248         if is_plack_enabled_intranet $instancefile; then
  249             [ "${quiet}" != "yes" ] && warn "Plack not disabled for ${instancename} Intranet"
  250             failintra=1
  251         else
  252             [ "${quiet}" != "yes" ] && warn "Plack disabled for ${instancename} Intranet"
  253         fi
  254     else
  255         [ "${quiet}" != "yes" ] && warn "Plack already disabled for ${instancename} Intranet"
  256         alreadyintra=1
  257     fi
  258 
  259     # Fail if it was already plack disabled.
  260     if [ $alreadyopac -eq 1 ] &&  [ $alreadyintra -eq 1 ] ; then
  261         return 1
  262     elif [ "$alreadyopac" != "$alreadyintra" ]; then
  263         [ "${quiet}" != "yes" ] && warn "$instancename had a plack configuration error. Please confirm it is corrected."
  264     fi
  265 
  266     # Succeed if both or any plack were turned off.
  267     if  [ $failopac -eq 0 ] || [ $failintra -eq 0 ] ; then
  268         return 0
  269     else
  270         return 1
  271     fi
  272 }
  273 
  274 check_env_and_warn()
  275 {
  276     local apache_version_ok="no"
  277     local required_modules="headers proxy_http"
  278     local missing_modules=""
  279 
  280     if /usr/sbin/apache2ctl -v | grep -q "Server version: Apache/2.4"; then
  281         apache_version_ok="yes"
  282     fi
  283 
  284     for module in ${required_modules}; do
  285         if ! /usr/sbin/apachectl -M 2> /dev/null | grep -q ${module}; then
  286             missing_modules="${missing_modules}${module} "
  287         fi
  288     done
  289 
  290     if [ "${apache_version_ok}" != "yes" ]; then
  291         warn "WARNING: koha-plack requires Apache 2.4.x and you don't have that."
  292     fi
  293 
  294     if [ "${missing_modules}" != "" ]; then
  295         cat 1>&2 <<EOM
  296 WARNING: koha-plack requires some Apache modules that you are missing.
  297 You can install them with:
  298 
  299     sudo a2enmod ${missing_modules}
  300 
  301 EOM
  302 
  303     fi
  304 }
  305 
  306 _check_and_fix_perms()
  307 {
  308     local instance=$1
  309 
  310     local files="/var/log/koha/${instance}/plack.log \
  311                  /var/log/koha/${instance}/plack-error.log"
  312 
  313     for file in ${files}
  314     do
  315         if [ ! -e "${file}" ]; then
  316             touch ${file}
  317         fi
  318         chown "${instance}-koha":"${instance}-koha" ${file}
  319     done
  320 }
  321 
  322 set_action()
  323 {
  324     if [ "$op" = "" ]; then
  325         op=$1
  326     else
  327         die "Error: only one action can be specified."
  328     fi
  329 }
  330 
  331 _do_instance() {
  332     local name=$1
  333     local PERL5LIB=$PERL5LIB
  334     local KOHA_HOME=$KOHA_HOME
  335     local DEV_INSTALL=$DEV_INSTALL
  336 
  337     adjust_paths_dev_install $name
  338     PERL5LIB=$PERL5LIB:$KOHA_HOME/installer:$KOHA_HOME/lib/installer
  339     # If debug mode is enabled, add the debugger lib path
  340     # to PERL5LIB if appropriate
  341     #FIXME: many of these variables should be set in a higher scope
  342     if [ "$debug_mode" = "yes" ]; then
  343         if [ "$debugger_path" != "" ]; then
  344             PERL5LIB="${debugger_path}":$PERL5LIB
  345         fi
  346         export PERL5DB="BEGIN { require q(${debugger_path}/perl5db.pl) }"
  347         export PERLDB_OPTS="RemotePort=${debugger_location} async=1 LogFile=/var/log/koha/${name}/plack-debug.log"
  348         export DBGP_IDEKEY=${debugger_key}
  349         export PLACK_DEBUG=1
  350         export PERL5OPT="-d"
  351     fi
  352 
  353     case $op in
  354         "start")
  355             start_plack $name
  356             ;;
  357         "stop")
  358             stop_plack $name
  359             ;;
  360         "restart")
  361             restart_plack $name
  362             ;;
  363         "enable")
  364             enable_plack $name
  365             ;;
  366         "disable")
  367             disable_plack $name
  368             ;;
  369         *)
  370             usage
  371             ;;
  372     esac
  373 }
  374 
  375 STARMAN=$(which starman)
  376 op=""
  377 quiet="no"
  378 debug_mode="no"
  379 debugger_key=""
  380 debugger_location="localhost:9000"
  381 debugger_path=""
  382 
  383 # Read command line parameters
  384 while [ $# -gt 0 ]; do
  385 
  386     case "$1" in
  387         -h|--help)
  388             usage ; exit 0 ;;
  389         -q|--quiet)
  390             quiet="yes"
  391             shift ;;
  392         --start)
  393             set_action "start"
  394             shift ;;
  395         --stop)
  396             set_action "stop"
  397             shift ;;
  398         --restart)
  399             set_action "restart"
  400             shift ;;
  401         --enable)
  402             set_action "enable"
  403             shift ;;
  404         --disable)
  405             set_action "disable"
  406             shift ;;
  407         --debugger)
  408             debug_mode="yes"
  409             shift ;;
  410         --debugger-key)
  411             debugger_key="$2"
  412             shift 2 ;;
  413         --debugger-location)
  414             debugger_location="$2"
  415             shift 2 ;;
  416         --debugger-path)
  417             debugger_path="$2"
  418             shift 2 ;;
  419         -*)
  420             die "Error: invalid option switch ($1)" ;;
  421         *)
  422             # We expect the remaining stuff are the instance names
  423             break ;;
  424     esac
  425 
  426 done
  427 
  428 [ "${quiet}" != "yes" ] && check_env_and_warn
  429 
  430 export PERL5LIB
  431 export DEV_INSTALL
  432 export KOHA_HOME
  433 
  434 if [ $# -gt 0 ]; then
  435     # We have at least one instance name
  436     for name in "$@"; do
  437 
  438         if is_instance $name; then
  439             _do_instance $name
  440         else
  441             if [ "$quiet" = "no" ]; then
  442                 log_daemon_msg "Error: Invalid instance name $name"
  443                 log_end_msg 1
  444             fi
  445         fi
  446 
  447     done
  448 else
  449     if [ "$quiet" = "no" ]; then
  450         warn "Error: you must provide at least one instance name"
  451     fi
  452 fi
  453 
  454 exit 0