Bug 25716: Add ability to specify additional options in koha-conf.xml for z3950_respo...
[koha.git] / debian / scripts / koha-z3950-responder
1 #!/bin/bash
2 #
3 # Copyright 2015 Theke Solutions
4 # Copyright 2016 Koha-Suomi
5 # Copyright 2018 The National Library of Finland, University of Helsinki
6 #
7 # This file is part of Koha.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 set -e
23
24 . /lib/lsb/init-functions
25
26 # Read configuration variable file if it is present
27 [ -r /etc/default/koha-common ] && . /etc/default/koha-common
28
29 # include helper functions
30 if [ -f "/usr/share/koha/bin/koha-functions.sh" ]; then
31     . "/usr/share/koha/bin/koha-functions.sh"
32 else
33     echo "Error: /usr/share/koha/bin/koha-functions.sh not present." 1>&2
34     exit 1
35 fi
36
37 usage()
38 {
39     local scriptname=$(basename $0)
40
41     cat <<EOF
42 $scriptname
43
44 This script lets you manage the Z39.50/SRU daemons for your Koha instances.
45
46 Usage:
47 $scriptname --start|--stop|--restart [--quiet|-q] instancename1 [instancename2...]
48 $scriptname --enable|--disable instancename1 [instancename2]
49 $scriptname -h|--help
50
51     --start               Start the Z39.50/SRU daemon for the specified instances
52     --stop                Stop the Z39.50/SRU daemon for the specified instances
53     --restart             Restart the Z39.50/SRU daemon for the specified instances
54     --enable              Enable Z39.50/SRU for the specified instances
55     --disable             Disable Z39.50/SRU for the specified instances
56     --debugger            Enable running Z39.50/SRU in debug mode
57     --debugger-key        Specify the key the IDE is expecting
58     --debugger-location   Specify the host:port for your debugger tool (defaults
59                           to localhost:9000)
60     --debugger-path       Specify the path for the debugger library
61     --quiet|-q            Make the script quiet about non existent instance names
62                           (useful for calling from another scripts).
63     --help|-h             Display this help message
64
65 EOF
66 }
67
68 start_z3950()
69 {
70     local instancename=$1
71
72     local PIDFILE="/var/run/koha/${instancename}/z3950-responder.pid"
73     local NAME="${instancename}-koha-z3950-responder"
74     local CONFIGDIR="/etc/koha/z3950"
75
76     if [ -e "/etc/koha/sites/${instancename}/z3950/config.xml" ]; then
77         # pick instance-specific config dir
78         CONFIGDIR="/etc/koha/sites/${instancename}/z3950"
79     fi # else stick with the default one
80
81     _check_and_fix_perms $instancename
82
83     instance_user="${instancename}-koha"
84
85     daemonize="-D -d ${instancename}-koha-z3950"
86     logging="-l /var/log/koha/${instancename}/z3950.log"
87
88     if [ "$DEV_INSTALL" = "1" ]; then
89         MISCDIR=$KOHA_HOME/misc
90     else
91         MISCDIR=/usr/share/koha/bin
92     fi
93
94     Z3950RESPONDER="/usr/bin/perl $MISCDIR/z3950_responder.pl"
95     if [ "$debug_mode" = "yes" ]; then
96         if [ "$DEV_INSTALL" = "1" ]; then
97             warn "Not a dev install, disabling debug mode"
98         else
99             environment="development"
100             daemonize=""
101             logging="" # remote debugger takes care
102             Z3950RESPONDER="/usr/bin/perl -d ${MISCDIR}/z3950_responder.pl"
103         fi
104     fi
105
106     Z3950OPTS="-c ${CONFIGDIR} \
107                -u ${instance_user} \
108                -p ${PIDFILE} ${daemonize} ${logging}"
109
110     if ! is_z3950_running ${instancename}; then
111         export KOHA_CONF="/etc/koha/sites/${instancename}/koha-conf.xml"
112
113         Z3950_ADDITIONAL_OPTS="$( xmlstarlet sel -t -v 'yazgfs/config/z3950_responder_options' $KOHA_CONF )"
114
115         log_daemon_msg "Starting Z39.50/SRU daemon for ${instancename}"
116
117         # Change to the instance's user dir
118         current_dir=$(pwd)
119         eval cd ~$instance_user
120
121         if ${Z3950RESPONDER} ${Z3950_ADDITIONAL_OPTS} ${Z3950OPTS}; then
122             log_end_msg 0
123         else
124             log_end_msg 1
125         fi
126         # Go back to the original dir
127         cd "$current_dir"
128
129     else
130         log_daemon_msg "Error: Z39.50/SRU already running for ${instancename}"
131         log_end_msg 1
132     fi
133 }
134
135 stop_z3950()
136 {
137     local instancename=$1
138
139     local PIDFILE="/var/run/koha/${instancename}/z3950-responder.pid"
140
141     if is_z3950_running ${instancename}; then
142
143         log_daemon_msg "Stopping Z39.50/SRU daemon for ${instancename}"
144
145         if start-stop-daemon --pidfile ${PIDFILE} --stop --retry=TERM/30/KILL/5; then
146             log_end_msg 0
147         else
148             log_end_msg 1
149         fi
150     else
151         log_daemon_msg "Error: Z39.50/SRU not running for ${instancename}"
152         log_end_msg 1
153     fi
154 }
155
156 restart_z3950()
157 {
158     local instancename=$1
159
160     local PIDFILE="/var/run/koha/${instancename}/z3950.pid"
161
162     if is_z3950_running ${instancename}; then
163
164         log_daemon_msg "Restarting Z39.50/SRU daemon for ${instancename}"
165
166         if stop_z3950 $instancename && start_z3950 $instancename; then
167             log_end_msg 0
168         else
169             log_end_msg 1
170         fi
171     else
172         log_warning_msg "Z39.50/SRU not running for ${instancename}."
173         start_z3950 $instancename
174     fi
175 }
176
177 enable_z3950()
178 {
179     local instancename=$1
180
181     if [ ! -e /etc/koha/sites/${instancename}/koha-conf.xml ] ;
182     then
183         echo "No such instance: ${instancename}" > /dev/stderr
184         return 1
185     fi
186
187     local configdir=/etc/koha/sites/${instancename}/z3950
188     if [ -e ${configdir}/config.xml ]
189     then
190         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU already enabled for $name"
191         return 1
192     fi
193
194     if [ ! -e ${configdir} ]
195     then
196         mkdir ${configdir}
197     fi
198     cp /etc/koha/z3950/* ${configdir}/
199     chown ${name}-koha:${name}-koha ${configdir}/*
200     chmod 600 ${configdir}/*
201
202     [ "${quiet}" != "yes" ] && warn "Z39.50/SRU enabled for $name - edit files in ${configdir} to configure"
203     return 0
204 }
205
206 disable_z3950()
207 {
208     local instancename=$1
209
210     if is_z3950_enabled $instancename; then
211         local configdir=/etc/koha/sites/${instancename}/z3950
212         mv ${configdir} ${configdir}.`date +%F_%T`
213         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU disabled for ${instancename}"
214         return 0
215     else
216         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU already disabled for ${instancename}"
217         return 1
218     fi
219 }
220
221 _check_and_fix_perms()
222 {
223     local instance=$1
224
225     local files="/var/log/koha/${instance}/z3950.log"
226
227     for file in ${files}
228     do
229         if [ ! -e "${file}" ]; then
230             touch ${file}
231         fi
232         chown "${instance}-koha":"${instance}-koha" ${file}
233     done
234 }
235
236 set_action()
237 {
238     if [ "$op" = "" ]; then
239         op=$1
240     else
241         die "Error: only one action can be specified."
242     fi
243 }
244
245 op=""
246 quiet="no"
247 debug_mode="no"
248 debugger_key=""
249 debugger_location="localhost:9000"
250 debugger_path=""
251
252 # Read command line parameters
253 while [ $# -gt 0 ]; do
254
255     case "$1" in
256         -h|--help)
257             usage ; exit 0 ;;
258         -q|--quiet)
259             quiet="yes"
260             shift ;;
261         --start)
262             set_action "start"
263             shift ;;
264         --stop)
265             set_action "stop"
266             shift ;;
267         --restart)
268             set_action "restart"
269             shift ;;
270         --enable)
271             set_action "enable"
272             shift ;;
273         --disable)
274             set_action "disable"
275             shift ;;
276         --debugger)
277             debug_mode="yes"
278             shift ;;
279         --debugger-key)
280             debugger_key="$2"
281             shift 2 ;;
282         --debugger-location)
283             debugger_location="$2"
284             shift 2 ;;
285         --debugger-path)
286             debugger_path="$2"
287             shift 2 ;;
288         -*)
289             die "Error: invalid option switch ($1)" ;;
290         *)
291             # We expect the remaining stuff are the instance names
292             break ;;
293     esac
294
295 done
296
297 if [ $# -gt 0 ]; then
298     # We have at least one instance name
299     for name in "$@"; do
300
301         if is_instance $name; then
302
303             adjust_paths_dev_install $name
304             export DEV_INSTALL
305             export KOHA_HOME
306             PERL5LIB=$PERL5LIB:$KOHA_HOME/installer:$KOHA_HOME/lib/installer
307             # If debug mode is enabled, add the debugger lib path
308             # to PERL5LIB if appropriate
309             if [ "$debug_mode" = "yes" ]; then
310                 if [ "$debugger_path" != "" ]; then
311                     PERL5LIB="${debugger_path}":$PERL5LIB
312                 fi
313                 export PERL5DB="BEGIN { require q(${debugger_path}/perl5db.pl) }"
314                 export PERLDB_OPTS="RemotePort=${debugger_location} async=1 LogFile=/var/log/koha/${name}/z3950-debug.log"
315                 export DBGP_IDEKEY=${debugger_key}
316                 export PERL5OPT="-d"
317             fi
318
319             export PERL5LIB
320
321             case $op in
322                 "start")
323                     start_z3950 $name
324                     ;;
325                 "stop")
326                     stop_z3950 $name
327                     ;;
328                 "restart")
329                     restart_z3950 $name
330                     ;;
331                 "enable")
332                     enable_z3950 $name
333                     ;;
334                 "disable")
335                     disable_z3950 $name
336                     ;;
337                 *)
338                     usage
339                     ;;
340             esac
341
342         else
343             if [ "$quiet" = "no" ]; then
344                 log_daemon_msg "Error: Invalid instance name $name"
345                 log_end_msg 1
346             fi
347         fi
348
349     done
350 else
351     if [ "$quiet" = "no" ]; then
352         warn "Error: you must provide at least one instance name"
353     fi
354 fi
355
356 exit 0