Bug 13937: Add support for Z39.50 responder to the Debian scripts
[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         LIBDIR=$KOHA_HOME
90     else
91         LIBDIR=$KOHA_HOME/lib
92     fi
93
94     Z3950RESPONDER="/usr/bin/perl $LIBDIR/misc/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 ${LIBDIR}/misc/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         log_daemon_msg "Starting Z39.50/SRU daemon for ${instancename}"
114
115         # Change to the instance's user dir
116         current_dir=$(pwd)
117         eval cd ~$instance_user
118
119         if ${Z3950RESPONDER} ${Z3950OPTS}; then
120             log_end_msg 0
121         else
122             log_end_msg 1
123         fi
124         # Go back to the original dir
125         cd "$current_dir"
126
127     else
128         log_daemon_msg "Error: Z39.50/SRU already running for ${instancename}"
129         log_end_msg 1
130     fi
131 }
132
133 stop_z3950()
134 {
135     local instancename=$1
136
137     local PIDFILE="/var/run/koha/${instancename}/z3950-responder.pid"
138
139     if is_z3950_running ${instancename}; then
140
141         log_daemon_msg "Stopping Z39.50/SRU daemon for ${instancename}"
142
143         if start-stop-daemon --pidfile ${PIDFILE} --stop --retry=TERM/30/KILL/5; then
144             log_end_msg 0
145         else
146             log_end_msg 1
147         fi
148     else
149         log_daemon_msg "Error: Z39.50/SRU not running for ${instancename}"
150         log_end_msg 1
151     fi
152 }
153
154 restart_z3950()
155 {
156     local instancename=$1
157
158     local PIDFILE="/var/run/koha/${instancename}/z3950.pid"
159
160     if is_z3950_running ${instancename}; then
161
162         log_daemon_msg "Restarting Z39.50/SRU daemon for ${instancename}"
163
164         if stop_z3950 $instancename && start_z3950 $instancename; then
165             log_end_msg 0
166         else
167             log_end_msg 1
168         fi
169     else
170         log_daemon_msg "Error: Z39.50/SRU not running for ${instancename}"
171         log_end_msg 1
172     fi
173 }
174
175 enable_z3950()
176 {
177     local instancename=$1
178
179     if [ ! -e /etc/koha/sites/${instancename}/koha-conf.xml ] ;
180     then
181         echo "No such instance: ${instancename}" > /dev/stderr
182         return 1
183     fi
184
185     local configdir=/etc/koha/sites/${instancename}/z3950
186     if [ -e ${configdir}/config.xml ]
187     then
188         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU already enabled for $name"
189         return 1
190     fi
191
192     if [ ! -e ${configdir} ]
193     then
194         mkdir ${configdir}
195     fi
196     cp /etc/koha/z3950/* ${configdir}/
197     chown ${name}-koha:${name}-koha ${configdir}/*
198     chmod 600 ${configdir}/*
199
200     [ "${quiet}" != "yes" ] && warn "Z39.50/SRU enabled for $name - edit files in ${configdir} to configure"
201     return 0
202 }
203
204 disable_z3950()
205 {
206     local instancename=$1
207
208     if is_z3950_enabled $instancename; then
209         local configdir=/etc/koha/sites/${instancename}/z3950
210         mv ${configdir} ${configdir}.`date +%F_%T`
211         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU disabled for ${instancename}"
212         return 0
213     else
214         [ "${quiet}" != "yes" ] && warn "Z39.50/SRU already disabled for ${instancename}"
215         return 1
216     fi
217 }
218
219 _check_and_fix_perms()
220 {
221     local instance=$1
222
223     local files="/var/log/koha/${instance}/z3950.log"
224
225     for file in ${files}
226     do
227         if [ ! -e "${file}" ]; then
228             touch ${file}
229         fi
230         chown "${instance}-koha":"${instance}-koha" ${file}
231     done
232 }
233
234 set_action()
235 {
236     if [ "$op" = "" ]; then
237         op=$1
238     else
239         die "Error: only one action can be specified."
240     fi
241 }
242
243 op=""
244 quiet="no"
245 debug_mode="no"
246 debugger_key=""
247 debugger_location="localhost:9000"
248 debugger_path=""
249
250 # Read command line parameters
251 while [ $# -gt 0 ]; do
252
253     case "$1" in
254         -h|--help)
255             usage ; exit 0 ;;
256         -q|--quiet)
257             quiet="yes"
258             shift ;;
259         --start)
260             set_action "start"
261             shift ;;
262         --stop)
263             set_action "stop"
264             shift ;;
265         --restart)
266             set_action "restart"
267             shift ;;
268         --enable)
269             set_action "enable"
270             shift ;;
271         --disable)
272             set_action "disable"
273             shift ;;
274         --debugger)
275             debug_mode="yes"
276             shift ;;
277         --debugger-key)
278             debugger_key="$2"
279             shift 2 ;;
280         --debugger-location)
281             debugger_location="$2"
282             shift 2 ;;
283         --debugger-path)
284             debugger_path="$2"
285             shift 2 ;;
286         -*)
287             die "Error: invalid option switch ($1)" ;;
288         *)
289             # We expect the remaining stuff are the instance names
290             break ;;
291     esac
292
293 done
294
295 if [ $# -gt 0 ]; then
296     # We have at least one instance name
297     for name in "$@"; do
298
299         if is_instance $name; then
300
301             adjust_paths_dev_install $name
302             export DEV_INSTALL
303             export KOHA_HOME
304             PERL5LIB=$PERL5LIB:$KOHA_HOME/installer:$KOHA_HOME/lib/installer
305             # If debug mode is enabled, add the debugger lib path
306             # to PERL5LIB if appropriate
307             if [ "$debug_mode" = "yes" ]; then
308                 if [ "$debugger_path" != "" ]; then
309                     PERL5LIB="${debugger_path}":$PERL5LIB
310                 fi
311                 export PERL5DB="BEGIN { require q(${debugger_path}/perl5db.pl) }"
312                 export PERLDB_OPTS="RemotePort=${debugger_location} async=1 LogFile=/var/log/koha/${name}/z3950-debug.log"
313                 export DBGP_IDEKEY=${debugger_key}
314                 export PERL5OPT="-d"
315             fi
316
317             export PERL5LIB
318
319             case $op in
320                 "start")
321                     start_z3950 $name
322                     ;;
323                 "stop")
324                     stop_z3950 $name
325                     ;;
326                 "restart")
327                     restart_z3950 $name
328                     ;;
329                 "enable")
330                     enable_z3950 $name
331                     ;;
332                 "disable")
333                     disable_z3950 $name
334                     ;;
335                 *)
336                     usage
337                     ;;
338             esac
339
340         else
341             if [ "$quiet" = "no" ]; then
342                 log_daemon_msg "Error: Invalid instance name $name"
343                 log_end_msg 1
344             fi
345         fi
346
347     done
348 else
349     if [ "$quiet" = "no" ]; then
350         warn "Error: you must provide at least one instance name"
351     fi
352 fi
353
354 exit 0