Tomas Cohen Arazi
79fe1a6ab9
This patch makes koha-create generate the log4perl.conf file for the instance, belonging to the instance user. This is done in order to have the z3950 responder work. My original idea was to make the responder accept a '-g' parameter but that is not supported by Net::Z3950::Responder. Also, as the library insists on handling the PID file on its own, it wont' work to handle the responsability to start-stop-daemon. The only solution I found was making the fiel be owned by the instance user. 1. Create a Koha instance: $ koha-create --create-db test 2. Initiate all the things 3. Enable and start the z3950 responder $ koha-z3950-responder --enable test $ koha-z3950-responder --start test 4. Try doing some search: $ yaz-client localhost:2100 => FAIL: you get: Connecting...OK. Sent initrequest. Target closed connection Z> quit See you later, alligator. => FAIL: No warning or anything on the logs 5. Stop the daemon $ koha-z3950-responder --stop test 6. Run it manually: $ PERL5LIB=/usr/share/koha/lib KOHA_CONF=/etc/koha/sites/test/koha-conf.xml \ /usr/bin/perl /usr/share/koha/bin/z3950_responder.pl \ -c /etc/koha/sites/test/z3950 -u test-koha \ -p /var/run/koha/test/z3950-responder.pid -d test-koha-z3950 7. Repeat the 4, on a separate terminal (no daemon mode this time) => FAIL: You get: Cannot open /etc/koha/sites/test/log4perl.conf (Permission denied) at /usr/share/perl5/Log/Log4perl/Config/BaseConfigurator.pm line 51. 8. Change the file owner: $ chown test-koha /etc/koha/sites/test/log4perl.conf 9. Repeat 6, and 4 => SUCCESS: It doesn't break anymore! 10. Apply this patch 11. Create a new instance, with the patched koha-create: $ debian/scripts/koha-create --create-db test1 12: Check the generated files permissions: $ ls -l /etc/koha/sites/test2 => SUCCESS: You get: -rw-r----- 1 root test2-koha 19720 May 17 13:26 koha-conf.xml -rw-r----- 1 test2-koha test2-koha 2825 May 17 13:26 log4perl.conf -rw-r----- 1 root test2-koha 2014 May 17 13:26 zebra-authorities-dom.cfg -rw-r----- 1 root test2-koha 2279 May 17 13:26 zebra-biblios-dom.cfg -rw-r----- 1 root test2-koha 26 May 17 13:26 zebra.passwd 13. Sign off :-D Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Ere Maijala <ere.maijala@helsinki.fi> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
923 lines
28 KiB
Bash
Executable file
923 lines
28 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# koha-create -- Create a new Koha instance.
|
|
# Copyright 2010 Catalyst IT, Ltd
|
|
#
|
|
# 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/>.
|
|
|
|
# Read configuration variable file if it is present
|
|
[ -r /etc/default/koha-common ] && . /etc/default/koha-common
|
|
|
|
set -e
|
|
|
|
# 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=$0
|
|
cat <<EOF
|
|
|
|
Creates new Koha instances.
|
|
|
|
Usage:
|
|
|
|
$scriptname [DB usage mode] [options] instancename
|
|
|
|
DB usage mode:
|
|
--create-db Create a new database on localhost. (default).
|
|
--request-db Creates a instancename-db-request.txt file where
|
|
you adjust your DB settings and re-run with --populate-db.
|
|
--populate-db Finish the installation you started with --request-db after
|
|
you adjusted the instancename-db-request.txt file.
|
|
--use-db Use this option if you already created and populated your DB.
|
|
|
|
Options:
|
|
--marcflavor flavor Set the MARC flavor. Valid values are marc21 (default),
|
|
normarc and unimarc.
|
|
--zebralang lang Choose the primary language for Zebra indexing. Valid
|
|
values are cs, el, en (default), es, fr, nb, ru and uk.
|
|
--elasticsearch-server s Enforce the use of the specified Elasticsearch server(s)
|
|
(default: localhost:9200).
|
|
--memcached-servers str Set a comma-separated list of host:port memcached servers.
|
|
--memcached-prefix str Set the desired prefix for the instance memcached namespace.
|
|
--enable-sru Enable the Z39.50/SRU server in Zebra search engine
|
|
(default: disabled).
|
|
--sru-port Specify a TCP port number for Zebra's Z39.50/SRU server
|
|
to listen on. (default: 7090).
|
|
--defaultsql some.sql Specify a default SQL file to be loaded on the DB.
|
|
--configfile cfg_file Specify an alternate config file for reading default values.
|
|
--passwdfile passwd Specify an alternate passwd file.
|
|
--dbhost host Enforce the use of the specified DB server
|
|
--database dbname Enforce the use of the specified DB name (64 char limit)
|
|
--adminuser n Explicit the admin user ID in the DB. Relevant in
|
|
conjunction with --defaultsql and --populate-db.
|
|
--template-cache-dir Set a user defined template_cache_dir. It defaults to
|
|
/var/cache/koha/<instance>/templates
|
|
--timezone time/zone Specify a timezone. e.g. America/Argentina
|
|
--upload-path dir Set a user defined upload_path. It defaults to
|
|
/var/lib/koha/<instance>/uploads
|
|
--tmp-path dir Set a user defined tmp_path. It defaults to
|
|
/var/lib/koha/<instance>/tmp
|
|
--letsencrypt Set up a https-only site with letsencrypt certificates
|
|
--smtp-host host SMTP host name
|
|
--smtp-port NN SMTP port
|
|
--smtp-timeout NN Connection timeout in seconds
|
|
--smtp-ssl-mode mode SSL mode. Options are 'disabled' (default), 'ssl' and 'starttls'.
|
|
--smtp-user-name user User name to be used on SMTP auth
|
|
--smtp-password pass Password to authenticate SMTP
|
|
--smtp-debug Enable debug mode for SMTP
|
|
|
|
--mb-host host RabbitMQ host name (default: localhost)
|
|
--mb-port NN RabbitMQ port (default: 61613)
|
|
--mb-user user RabbitMQ user (default: guest)
|
|
--mb-pass pass RabbitMQ password (default: guest)
|
|
--mb-vhost vhost RabbitMQ vhost (default: koha_<instance>)
|
|
|
|
--help,-h Show this help.
|
|
|
|
Note: the instance name cannot be longer that 11 chars.
|
|
|
|
EOF
|
|
}
|
|
|
|
# UPPER CASE VARIABLES - from configfile or default value
|
|
# lower case variables - generated within this script
|
|
generate_config_file() {
|
|
touch "$2"
|
|
chown "root:$username" "$2"
|
|
# Bug 28364: the z3950 responder needs other permissions
|
|
[ "$1" = "log4perl-site.conf.in" ] && chown "$username:$username" "$2"
|
|
|
|
chmod 0640 "$2"
|
|
sed -e "s/__KOHA_CONF_DIR__/\/etc\/koha\/sites\/$name/g" \
|
|
-e "s/__KOHASITE__/$name/g" \
|
|
-e "s/__OPACPORT__/$OPACPORT/g" \
|
|
-e "s/__INTRAPORT__/$INTRAPORT/g" \
|
|
-e "s/__OPACSERVER__/$opacdomain/g" \
|
|
-e "s/__INTRASERVER__/$intradomain/g" \
|
|
-e "s/__ZEBRA_PASS__/$zebrapwd/g" \
|
|
-e "s/__ZEBRA_MARC_FORMAT__/$ZEBRA_MARC_FORMAT/g" \
|
|
-e "s/__ZEBRA_LANGUAGE__/$ZEBRA_LANGUAGE/g" \
|
|
-e "s/__SRU_BIBLIOS_PORT__/$SRU_SERVER_PORT/g" \
|
|
-e "s/__START_SRU_PUBLICSERVER__/$START_SRU_PUBLICSERVER/g" \
|
|
-e "s/__END_SRU_PUBLICSERVER__/$END_SRU_PUBLICSERVER/g" \
|
|
-e "s/__API_SECRET__/$API_SECRET/g" \
|
|
-e "s/__DB_NAME__/$mysqldb/g" \
|
|
-e "s/__DB_HOST__/$mysqlhost/g" \
|
|
-e "s/__DB_USER__/$mysqluser/g" \
|
|
-e "s/__DB_PASS__/$mysqlpwd/g" \
|
|
-e "s/__ELASTICSEARCH_SERVER__/${ELASTICSEARCH_SERVER}/g" \
|
|
-e "s/__UNIXUSER__/$username/g" \
|
|
-e "s/__UNIXGROUP__/$username/g" \
|
|
-e "s#__TEMPLATE_CACHE_DIR__#$TEMPLATE_CACHE_DIR#g" \
|
|
-e "s#__TIMEZONE__#$TIMEZONE#g" \
|
|
-e "s#__BCRYPT_SETTINGS__#$BCRYPT_SETTINGS#g" \
|
|
-e "s#__UPLOAD_PATH__#$UPLOAD_PATH#g" \
|
|
-e "s#__TMP_PATH__#$TMP_PATH#g" \
|
|
-e "s/__LOG_DIR__/\/var\/log\/koha\/$name/g" \
|
|
-e "s/__PLUGINS_DIR__/\/var\/lib\/koha\/$name\/plugins/g" \
|
|
-e "s/__MEMCACHED_NAMESPACE__/$MEMCACHED_NAMESPACE/g" \
|
|
-e "s/__MEMCACHED_SERVERS__/$MEMCACHED_SERVERS/g" \
|
|
-e "s/__SMTP_HOST__/$SMTP_HOST/g" \
|
|
-e "s/__SMTP_PORT__/$SMTP_PORT/g" \
|
|
-e "s/__SMTP_TIMEOUT__/$SMTP_TIMEOUT/g" \
|
|
-e "s/__SMTP_SSL_MODE__/$SMTP_SSL_MODE/g" \
|
|
-e "s/__SMTP_USER_NAME__/$SMTP_USER_NAME/g" \
|
|
-e "s/__SMTP_PASSWORD__/$SMTP_PASSWORD/g" \
|
|
-e "s/__SMTP_DEBUG__/$SMTP_DEBUG/g" \
|
|
-e "s/__MESSAGE_BROKER_HOST__/$MESSAGE_BROKER_HOST/g" \
|
|
-e "s/__MESSAGE_BROKER_PORT__/$MESSAGE_BROKER_PORT/g" \
|
|
-e "s/__MESSAGE_BROKER_USER__/$MESSAGE_BROKER_USER/g" \
|
|
-e "s/__MESSAGE_BROKER_PASS__/$MESSAGE_BROKER_PASS/g" \
|
|
-e "s/__MESSAGE_BROKER_VHOST__/$MESSAGE_BROKER_VHOST/g" \
|
|
"/etc/koha/$1" > "$2"
|
|
|
|
}
|
|
|
|
getmysqlhost() {
|
|
if [ ! -f /etc/mysql/debian.cnf ]
|
|
then
|
|
echo localhost
|
|
return
|
|
fi
|
|
awk '
|
|
BEGIN { FS="=" }
|
|
$1 ~/\[/ { inclient=0 }
|
|
$1 ~/\[client\]/ { inclient=1; next }
|
|
inclient==1 && $1 ~/host/ { gsub(/ /, "", $2); print $2 }' \
|
|
/etc/mysql/koha-common.cnf
|
|
}
|
|
|
|
getinstancemysqlpassword() {
|
|
xmlstarlet sel -t -v 'yazgfs/config/pass' "/etc/koha/sites/$1/koha-conf.xml"
|
|
}
|
|
|
|
getinstancemysqluser() {
|
|
xmlstarlet sel -t -v 'yazgfs/config/user' "/etc/koha/sites/$1/koha-conf.xml"
|
|
}
|
|
|
|
getinstancemysqldatabase() {
|
|
xmlstarlet sel -t -v 'yazgfs/config/database' "/etc/koha/sites/$1/koha-conf.xml"
|
|
}
|
|
|
|
check_apache_config()
|
|
{
|
|
|
|
# Check that mpm_itk is installed and enabled
|
|
if ! /usr/sbin/apachectl -M | grep -q 'mpm_itk'; then
|
|
# Check Apache version
|
|
APACHE_DISABLE_MPM_MSG=""
|
|
if /usr/sbin/apache2ctl -v | grep -q "Server version: Apache/2.4"; then
|
|
# mpm_event or mpm_worker need to be disabled first. mpm_itk depends
|
|
# on mpm_prefork, which is enabled if needed. See
|
|
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734865
|
|
if /usr/sbin/apachectl -M | grep -q 'mpm_event'; then
|
|
APACHE_DISABLE_MPM_MSG=" sudo a2dismod mpm_event ;"
|
|
elif /usr/sbin/apachectl -M | grep -q 'mpm_worker'; then
|
|
APACHE_DISABLE_MPM_MSG=" sudo a2dismod mpm_worker ;"
|
|
# else mpm_prefork: a2enmod mpm_itk works
|
|
fi
|
|
# else Apache 2.2: a2enmod mpm_itk works
|
|
fi
|
|
|
|
cat 1>&2 <<EOM
|
|
|
|
Koha requires mpm_itk to be enabled within Apache in order to run.
|
|
Typically this can be enabled with:
|
|
|
|
$APACHE_DISABLE_MPM_MSG sudo a2enmod mpm_itk
|
|
EOM
|
|
|
|
die
|
|
fi
|
|
|
|
# Check that mod_rewrite is installed and enabled.
|
|
if ! /usr/sbin/apachectl -M | grep -q 'rewrite_module'; then
|
|
cat 1>&2 <<EOM
|
|
|
|
Koha requires mod_rewrite to be enabled within Apache in order to run.
|
|
Typically this can be enabled with:
|
|
|
|
sudo a2enmod rewrite
|
|
EOM
|
|
die
|
|
fi
|
|
|
|
# Check that the CGI module is installed and enabled
|
|
# (Apache 2.4 may not have it by default.)
|
|
if ! /usr/sbin/apachectl -M | grep -q 'cgi_module'; then
|
|
cat 1>&2 << EOM
|
|
Koha requires mod_cgi to be enabled within Apache in order to run.
|
|
Typically this can be enabled with:
|
|
|
|
sudo a2enmod cgi
|
|
EOM
|
|
die
|
|
fi
|
|
|
|
# Check that mod_ssl is installed and enabled.
|
|
if [ "$CLO_LETSENCRYPT" = "yes" ]; then
|
|
if ! /usr/sbin/apachectl -M | grep -q 'ssl_module'; then
|
|
cat 1>&2 <<EOM
|
|
|
|
Koha requires mod_ssl to be enabled within Apache in order to run with --letsencrypt.
|
|
Typically this can be enabled with:
|
|
|
|
sudo a2enmod ssl
|
|
EOM
|
|
die
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
set_memcached()
|
|
{
|
|
local instance="$1"
|
|
|
|
if [ "$CLO_MEMCACHED_SERVERS" != "" ]; then
|
|
MEMCACHED_SERVERS=$CLO_MEMCACHED_SERVERS
|
|
else
|
|
if [ "$MEMCACHED_SERVERS" = "" ]; then
|
|
MEMCACHED_SERVERS=$DEFAULT_MEMCACHED_SERVERS
|
|
# else: was set by the koha-sites.conf file
|
|
fi
|
|
fi
|
|
|
|
if [ "$CLO_MEMCACHED_PREFIX" != "" ]; then
|
|
MEMCACHED_NAMESPACE="$CLO_MEMCACHED_PREFIX$instance"
|
|
else
|
|
if [ "$MEMCACHED_PREFIX" != "" ]; then
|
|
MEMCACHED_NAMESPACE="$MEMCACHED_PREFIX$instance"
|
|
else
|
|
MEMCACHED_NAMESPACE="$DEFAULT_MEMCACHED_PREFIX$instance"
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
set_smtp()
|
|
{
|
|
if [ "$CLO_SMTP_HOST" != "" ]; then
|
|
SMTP_HOST=$CLO_SMTP_HOST
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_PORT" != "" ]; then
|
|
SMTP_PORT=$CLO_SMTP_PORT
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_TIMEOUT" != "" ]; then
|
|
SMTP_TIMEOUT=$CLO_SMTP_TIMEOUT
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_SSL_MODE" != "" ]; then
|
|
SMTP_SSL_MODE=$CLO_SMTP_SSL_MODE
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_USER_NAME" != "" ]; then
|
|
SMTP_USER_NAME=$CLO_SMTP_USER_NAME
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_PASSWORD" != "" ]; then
|
|
SMTP_PASSWORD=$CLO_SMTP_PASSWORD
|
|
fi
|
|
|
|
if [ "$CLO_SMTP_DEBUG" != "" ]; then
|
|
SMTP_DEBUG=$CLO_SMTP_DEBUG
|
|
fi
|
|
}
|
|
|
|
set_message_broker()
|
|
{
|
|
local instance="$1"
|
|
|
|
if [ "$CLO_MESSAGE_BROKER_HOST" != "" ]; then
|
|
MESSAGE_BROKER_HOST=$CLO_MESSAGE_BROKER_HOST
|
|
fi
|
|
|
|
if [ "$CLO_MESSAGE_BROKER_PORT" != "" ]; then
|
|
MESSAGE_BROKER_PORT=$CLO_MESSAGE_BROKER_PORT
|
|
fi
|
|
|
|
if [ "$CLO_MESSAGE_BROKER_USER" != "" ]; then
|
|
MESSAGE_BROKER_USER=$CLO_MESSAGE_BROKER_USER
|
|
fi
|
|
|
|
if [ "$CLO_MESSAGE_BROKER_PASS" != "" ]; then
|
|
MESSAGE_BROKER_PASS=$CLO_MESSAGE_BROKER_PASS
|
|
fi
|
|
|
|
if [ "$CLO_MESSAGE_BROKER_VHOST" != "" ]; then
|
|
MESSAGE_BROKER_VHOST=$CLO_MESSAGE_BROKER_VHOST
|
|
fi
|
|
}
|
|
|
|
set_upload_path()
|
|
{
|
|
local instance="$1"
|
|
|
|
if [ "$CLO_UPLOAD_PATH" != "" ]; then
|
|
UPLOAD_PATH=$CLO_UPLOAD_PATH
|
|
else
|
|
UPLOAD_PATH="$INSTANCE_PATH_BASE/$instance/$UPLOAD_DIR"
|
|
fi
|
|
}
|
|
|
|
set_tmp_path()
|
|
{
|
|
local instance="$1"
|
|
|
|
if [ "$CLO_TMP_PATH" != "" ]; then
|
|
TMP_PATH=$CLO_TMP_PATH
|
|
else
|
|
TMP_PATH="$INSTANCE_PATH_BASE/$instance/$TMP_DIR"
|
|
fi
|
|
}
|
|
|
|
enable_sru_server()
|
|
{
|
|
# remove the commenting symbols
|
|
START_SRU_PUBLICSERVER=""
|
|
END_SRU_PUBLICSERVER=""
|
|
if [ "$SRU_SERVER_PORT" = "" ]; then
|
|
# --sru-port not passed, use the default
|
|
SRU_SERVER_PORT=$DEFAULT_SRU_SERVER_PORT
|
|
fi
|
|
}
|
|
|
|
check_letsencrypt()
|
|
{
|
|
if [ $(dpkg-query -W -f='${Status}' letsencrypt 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
|
|
set +e
|
|
apt-cache show letsencrypt &>/dev/null
|
|
local aptcacheshow=$?
|
|
set -e
|
|
if [ $aptcacheshow -eq 0 ]; then
|
|
read -r -p "The letsencrypt package is not installed. Do it now? [y/N] " response
|
|
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
local debrelease="$(lsb_release -c -s)"
|
|
if [ $debrelease = "jessie" ]; then
|
|
apt-get install -y -t jessie-backports letsencrypt
|
|
else
|
|
apt-get install -y letsencrypt
|
|
fi
|
|
else
|
|
die "You have to install letsencrypt to use the --letsencrypt parameter."
|
|
fi
|
|
else
|
|
echo "No installation candidate available for package letsencrypt."
|
|
if [[ -f /usr/bin/letsencrypt ]]; then
|
|
read -r -p "If you have a symlink from /usr/bin/letsencrypt to letsencrypt-auto, it should work. [y/N] " response
|
|
if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
die "You have to install letsencrypt to use the --letsencrypt parameter."
|
|
fi
|
|
else
|
|
die "You can create a symlink from /usr/bin/letsencrypt to letsencrypt-auto."
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
letsencrypt_instance()
|
|
{
|
|
# Get letsencrypt certificates
|
|
letsencrypt --agree-tos --renew-by-default --webroot certonly \
|
|
-w /usr/share/koha/opac/htdocs/ -d $opacdomain -w /usr/share/koha/intranet/htdocs/ -d $intradomain
|
|
# enable all ssl settings (apache won't start with these before certs are present)
|
|
sed -i "s:^\s*#\(\s*SSL.*\)$:\1:" "/etc/apache2/sites-available/$name.conf"
|
|
# change port from 80 to 443. (apache won't start if it is 443 without certs present)
|
|
sed -i "s:^\s*\(<VirtualHost \*\:\)80> #https$:\1443>:" "/etc/apache2/sites-available/$name.conf"
|
|
# enable redirect from http to https on port 80
|
|
sed -i "s:^\s*#\(.*\)#nohttps$:\1:" "/etc/apache2/sites-available/$name.conf"
|
|
# make koha-list --letsencrypt aware of this instance # could be done by checking apache conf instead
|
|
echo -e "opacdomain=\"$opacdomain\"\nintradomain=\"$intradomain\"" > /var/lib/koha/$name/letsencrypt.enabled
|
|
# restart apache with working certs
|
|
service apache2 restart
|
|
}
|
|
|
|
# Set defaults and read config file, if it exists.
|
|
DOMAIN=""
|
|
OPACPORT="80"
|
|
OPACPREFIX=""
|
|
OPACSUFFIX=""
|
|
INTRAPORT="8080"
|
|
INTRAPREFIX=""
|
|
INTRASUFFIX=""
|
|
DEFAULTSQL=""
|
|
ZEBRA_MARC_FORMAT="marc21"
|
|
ZEBRA_LANGUAGE="en"
|
|
ADMINUSER="1"
|
|
PASSWDFILE="/etc/koha/passwd"
|
|
|
|
# SMTP config
|
|
SMTP_HOST="localhost"
|
|
SMTP_PORT="25"
|
|
SMTP_TIMEOUT="120"
|
|
SMTP_SSL_MODE="disabled"
|
|
SMTP_USER_NAME=""
|
|
SMTP_PASSWORD=""
|
|
SMTP_DEBUG="0"
|
|
|
|
# Message broker (a.k.a. RabbitMQ) config
|
|
DEFAULT_MESSAGE_BROKER_PREFIX="koha_"
|
|
MESSAGE_BROKER_HOST="localhost"
|
|
MESSAGE_BROKER_PORT="61613"
|
|
MESSAGE_BROKER_USER="guest"
|
|
MESSAGE_BROKER_PASS="guest"
|
|
MESSAGE_BROKER_VHOST=""
|
|
|
|
# memcached variables
|
|
USE_MEMCACHED="yes"
|
|
MEMCACHED_SERVERS=""
|
|
MEMCACHED_PREFIX=""
|
|
# elasticsearch config
|
|
ELASTICSEARCH_SERVER="localhost:9200"
|
|
# hardcoded memcached defaults
|
|
DEFAULT_MEMCACHED_SERVERS="127.0.0.1:11211"
|
|
DEFAULT_MEMCACHED_PREFIX="koha_"
|
|
# hardcoded instance base path
|
|
INSTANCE_PATH_BASE="/var/lib/koha"
|
|
UPLOAD_DIR="uploads"
|
|
UPLOAD_PATH=""
|
|
# timezone defaults to empty
|
|
TIMEZONE=""
|
|
# hardcoded upload_tmp_path
|
|
TMP_DIR="tmp"
|
|
TMP_PATH=""
|
|
# cache base dir
|
|
CACHE_DIR_BASE="/var/cache/koha"
|
|
# Generate a randomizaed API secret
|
|
API_SECRET="$(pwgen -s 64 1)"
|
|
# SRU server variables
|
|
ENABLE_SRU="no"
|
|
SRU_SERVER_PORT=""
|
|
# hardcoded default SRU server port
|
|
DEFAULT_SRU_SERVER_PORT="7090"
|
|
START_SRU_PUBLICSERVER="<!--"
|
|
END_SRU_PUBLICSERVER="-->"
|
|
|
|
APACHE_CONFIGFILE=""
|
|
|
|
if [ -e /etc/koha/koha-sites.conf ]
|
|
then
|
|
. /etc/koha/koha-sites.conf
|
|
fi
|
|
|
|
[ $# -ge 1 ] && [ $# -le 16 ] || ( usage ; die "Error: wrong parameters" )
|
|
|
|
TEMP=`getopt -o chrpm:l:d:f:b:a: -l create-db,request-db,populate-db,use-db,enable-sru,sru-port:,help,marcflavor:,auth-idx:,biblio-idx:,zebralang:,defaultsql:,configfile:,passwdfile:,dbhost:,database:,elasticsearch-server:,adminuser:,memcached-servers:,memcached-prefix:,template-cache-dir:,timezone:,upload-path:,tmp-path:,smtp-host:,smtp-port:,smtp-timeout:,smtp-ssl-mode:,smtp-user-name:,smtp-password:,smtp-debug,mb-host:,mb-port:,mb-user:,mb-pass:,mb-vhost:,letsencrypt, \
|
|
-n "$0" -- "$@"`
|
|
|
|
# Note the quotes around `$TEMP': they are essential!
|
|
eval set -- "$TEMP"
|
|
|
|
# Temporary variables for the command line options
|
|
CLO_ZEBRA_MARC_FORMAT=""
|
|
CLO_ZEBRA_LANGUAGE=""
|
|
CLO_DEFAULTSQL=""
|
|
CLO_ADMINUSER=""
|
|
CLO_MEMCACHED_SERVERS=""
|
|
CLO_MEMCACHED_PREFIX=""
|
|
CLO_ELASTICSEARCH_SERVER=""
|
|
CLO_UPLOAD_PATH=""
|
|
CLO_TMP_PATH=""
|
|
CLO_LETSENCRYPT=""
|
|
CLO_TEMPLATE_CACHE_DIR=""
|
|
CLO_TIMEZONE=""
|
|
CLO_SMTP_HOST=""
|
|
CLO_SMTP_PORT=""
|
|
CLO_SMTP_TIMEOUT=""
|
|
CLO_SMTP_SSL_MODE=""
|
|
CLO_SMTP_USER_NAME=""
|
|
CLO_SMTP_PASSWORD=""
|
|
CLO_SMTP_DEBUG=""
|
|
|
|
CLO_MESSAGE_BROKER_HOST=""
|
|
CLO_MESSAGE_BROKER_PORT=""
|
|
CLO_MESSAGE_BROKER_USER=""
|
|
CLO_MESSAGE_BROKER_PASS=""
|
|
CLO_MESSAGE_BROKER_VHOST=""
|
|
|
|
while true ; do
|
|
case "$1" in
|
|
-c|--create-db)
|
|
op=create ; shift ;;
|
|
-r|--request-db)
|
|
op=request ; shift ;;
|
|
-p|--populate-db)
|
|
op=populate ; shift ;;
|
|
-u|--use-db)
|
|
op=use ; shift ;;
|
|
--memcached-servers)
|
|
CLO_MEMCACHED_SERVERS="$2" ; shift 2 ;;
|
|
--memcached-prefix)
|
|
CLO_MEMCACHED_PREFIX="$2" ; shift 2;;
|
|
--elasticsearch-server)
|
|
CLO_ELASTICSEARCH_SERVER="$2" ; shift 2 ;;
|
|
-m|--marcflavor)
|
|
CLO_ZEBRA_MARC_FORMAT="$2" ; shift 2 ;;
|
|
-l|--zebralang)
|
|
CLO_ZEBRA_LANGUAGE="$2" ; shift 2 ;;
|
|
-d|--defaultsql)
|
|
CLO_DEFAULTSQL="$2" ; shift 2 ;;
|
|
-f|--configfile)
|
|
configfile="$2" ; shift 2 ;;
|
|
-s|--passwdfile)
|
|
CLO_PASSWDFILE="$2" ; shift 2 ;;
|
|
-b|--database)
|
|
CLO_DATABASE="$2" ; shift 2 ;;
|
|
--dbhost)
|
|
CLO_DBHOST="$2" ; shift 2 ;;
|
|
-a|--adminuser)
|
|
CLO_ADMINUSER="$2" ; shift 2 ;;
|
|
--enable-sru)
|
|
ENABLE_SRU="yes" ; shift ;;
|
|
--mb-host)
|
|
CLO_MESSAGE_BROKER_HOST="$2" ; shift 2 ;;
|
|
--mb-port)
|
|
CLO_MESSAGE_BROKER_PORT="$2" ; shift 2 ;;
|
|
--mb-user)
|
|
CLO_MESSAGE_BROKER_USER="$2" ; shift 2 ;;
|
|
--mb-pass)
|
|
CLO_MESSAGE_BROKER_PASS="$2" ; shift 2 ;;
|
|
--mb-vhost)
|
|
CLO_MESSAGE_BROKER_VHOST="$2" ; shift 2 ;;
|
|
--smtp-debug)
|
|
CLO_SMTP_DEBUG="1" ; shift ;;
|
|
--smtp-host)
|
|
CLO_SMTP_HOST="$2" ; shift 2 ;;
|
|
--smtp-port)
|
|
CLO_SMTP_PORT="$2" ; shift 2 ;;
|
|
--smtp-timeout)
|
|
CLO_SMTP_TIMEOUT="$2" ; shift 2 ;;
|
|
--smtp-ssl-mode)
|
|
CLO_SMTP_SSL_MODE="$2" ; shift 2 ;;
|
|
--smtp-user-name)
|
|
CLO_SMTP_USER_NAME="$2" ; shift 2 ;;
|
|
--smtp-password)
|
|
CLO_SMTP_PASSWORD="$2" ; shift 2 ;;
|
|
--sru-port)
|
|
SRU_SERVER_PORT="$2" ; shift 2 ;;
|
|
--template-cache-dir)
|
|
CLO_TEMPLATE_CACHE_DIR="$2" ; shift 2 ;;
|
|
--timezone)
|
|
CLO_TIMEZONE="$2" ; shift 2 ;;
|
|
--upload-path)
|
|
CLO_UPLOAD_PATH="$2" ; shift 2 ;;
|
|
--tmp-path)
|
|
CLO_TMP_PATH="$2" ; shift 2 ;;
|
|
--letsencrypt)
|
|
CLO_LETSENCRYPT="yes" ; shift ;;
|
|
-h|--help)
|
|
usage ; exit 0 ;;
|
|
--)
|
|
shift ; break ;;
|
|
*)
|
|
die "Internal error processing command line arguments" ;;
|
|
esac
|
|
done
|
|
|
|
# Load the configfile given on the command line
|
|
if [ "$configfile" != "" ]
|
|
then
|
|
if [ -e "$configfile" ]
|
|
then
|
|
. "$configfile"
|
|
else
|
|
die "$configfile does not exist.";
|
|
fi
|
|
fi
|
|
|
|
# Make sure options from the command line get the highest precedence
|
|
if [ "$CLO_ZEBRA_MARC_FORMAT" != "" ]
|
|
then
|
|
ZEBRA_MARC_FORMAT="$CLO_ZEBRA_MARC_FORMAT"
|
|
fi
|
|
if [ "$CLO_ZEBRA_LANGUAGE" != "" ]
|
|
then
|
|
ZEBRA_LANGUAGE="$CLO_ZEBRA_LANGUAGE"
|
|
fi
|
|
if [ "$CLO_DEFAULTSQL" != "" ]
|
|
then
|
|
DEFAULTSQL="$CLO_DEFAULTSQL"
|
|
fi
|
|
if [ "$CLO_ADMINUSER" != "" ]
|
|
then
|
|
ADMINUSER="$CLO_ADMINUSER"
|
|
fi
|
|
if [ "$CLO_PASSWDFILE" != "" ]
|
|
then
|
|
PASSWDFILE="$CLO_PASSWDFILE"
|
|
fi
|
|
|
|
if [ "$CLO_TIMEZONE" != "" ]; then
|
|
TIMEZONE=$CLO_TIMEZONE
|
|
fi
|
|
|
|
if [ "${CLO_ELASTICSEARCH_SERVER}" != "" ]; then
|
|
ELASTICSEARCH_SERVER="${CLO_ELASTICSEARCH_SERVER}"
|
|
fi
|
|
|
|
BCRYPT_SETTINGS=$(htpasswd -bnBC 10 "" password | tr -d ':\n' | sed 's/$2y/$2a/');
|
|
|
|
|
|
if [ "$ENABLE_SRU" != "no" ]; then
|
|
enable_sru_server
|
|
fi
|
|
|
|
[ $# -ge 1 ] || ( usage ; die "Missing instance name..." )
|
|
|
|
name="$1"
|
|
|
|
set_smtp
|
|
set_upload_path $name
|
|
set_tmp_path $name
|
|
|
|
if [ "$op" = use ] && [ "$CLO_DATABASE" = "" ] &&
|
|
( [ ! -f "$PASSWDFILE" ] || [ ! `cat $PASSWDFILE | grep "^$name:"` ] )
|
|
then
|
|
cat <<NO_DB
|
|
--use-db must have a database name. It can be specified in a readable
|
|
password file ($PASSWDFILE). Using --passwdfile overrides the default
|
|
/usr/koha/passwd file. Each line of a passwd file should be in the format of:
|
|
instance:username:password:dbname:dbhost
|
|
A database name can also be specified using '--database dbname'.
|
|
NO_DB
|
|
die;
|
|
fi
|
|
|
|
if [ "$USE_MEMCACHED" = "no" ]; then
|
|
MEMCACHED_SERVERS=""
|
|
MEMCACHED_NAMESPACE=""
|
|
MEMCACHED_PREFIX=""
|
|
else
|
|
set_memcached $name
|
|
fi
|
|
|
|
set_message_broker $name
|
|
|
|
# Set template cache dir
|
|
if [ "$CLO_TEMPLATE_CACHE_DIR" != "" ]; then
|
|
TEMPLATE_CACHE_DIR="$CLO_TEMPLATE_CACHE_DIR"
|
|
else
|
|
TEMPLATE_CACHE_DIR="$CACHE_DIR_BASE/$name/templates"
|
|
fi
|
|
|
|
# Are we root? If not, the mod_rewrite check will fail and be confusing, so
|
|
# we look into this first.
|
|
if [[ $UID -ne 0 ]]
|
|
then
|
|
die "This script must be run with root privileges."
|
|
fi
|
|
|
|
# Check everything is ok with Apache, die otherwise
|
|
check_apache_config
|
|
|
|
opacdomain="$OPACPREFIX$name$OPACSUFFIX$DOMAIN"
|
|
intradomain="$INTRAPREFIX$name$INTRASUFFIX$DOMAIN"
|
|
|
|
# Check everything is ok with letsencrypt, die otherwise
|
|
if [ "$CLO_LETSENCRYPT" = "yes" ]; then
|
|
check_letsencrypt
|
|
fi
|
|
|
|
if [ -f $PASSWDFILE ] && [ `cat $PASSWDFILE | grep "^$name:"` ]
|
|
then
|
|
passwdline=`cat $PASSWDFILE | grep "^$name:"`
|
|
mysqluser=`echo $passwdline | cut -d ":" -f 2`
|
|
mysqlpwd=`echo $passwdline | cut -d ":" -f 3`
|
|
mysqldb=`echo $passwdline | cut -d ":" -f 4`
|
|
mysqlhost=`echo $passwdline | cut -d ":" -f 5`
|
|
fi
|
|
|
|
# The order of precedence for MySQL database name is:
|
|
# default < passwd file < command line
|
|
if [ "$mysqldb" = "" ]
|
|
then
|
|
mysqldb="koha_$name"
|
|
fi
|
|
|
|
if [ "$CLO_DATABASE" != "" ]
|
|
then
|
|
mysqldb="$CLO_DATABASE"
|
|
fi
|
|
|
|
if [ "$mysqluser" = "" ]
|
|
then
|
|
mysqluser="koha_$name"
|
|
fi
|
|
|
|
if [ "$CLO_DBHOST" != "" ]
|
|
then
|
|
mysqlhost="$CLO_DBHOST"
|
|
fi
|
|
|
|
if [ "$mysqlhost" = "" ]
|
|
then
|
|
mysqlhost="$(getmysqlhost)"
|
|
fi
|
|
|
|
if [ "$op" = create ] || [ "$op" = request ] || [ "$op" = use ]
|
|
then
|
|
if [ "$mysqlpwd" = "" ]
|
|
then
|
|
mysqlpwd="$(pwgen -s 15 1)"
|
|
mysqlpwd="$mysqlpwd@"
|
|
fi
|
|
else
|
|
mysqlpwd="$(getinstancemysqlpassword $name)"
|
|
fi
|
|
|
|
|
|
if [ "$op" = create ] || [ "$op" = request ] || [ "$op" = use ]
|
|
then
|
|
# Create new user and group.
|
|
username="$name-koha"
|
|
if getent passwd "$username" > /dev/null
|
|
then
|
|
die "User $username already exists."
|
|
fi
|
|
if getent group "$username" > /dev/null
|
|
then
|
|
die "Group $username already exists."
|
|
fi
|
|
adduser --no-create-home --disabled-login \
|
|
--gecos "Koha instance $username" \
|
|
--home "/var/lib/koha/$name" \
|
|
--quiet "$username"
|
|
|
|
# Create the site-specific directories.
|
|
koha-create-dirs "$name"
|
|
|
|
# Generate Zebra database password.
|
|
zebrapwd="$(pwgen -s 16 1)"
|
|
# Future enhancement: make this configurable for when your db is on
|
|
# another server.
|
|
mysql_hostname="localhost"
|
|
# Set up MySQL database for this instance.
|
|
if [ "$op" = create ]
|
|
then
|
|
if [ ! -e /etc/mysql/debian.cnf ]; then
|
|
MYSQL_OPTIONS="-u root"
|
|
echo "WARNING: The koha-common.cnf file is a dead soft link!"
|
|
else
|
|
MYSQL_OPTIONS="--defaults-extra-file=/etc/mysql/koha-common.cnf"
|
|
fi
|
|
mysql $MYSQL_OPTIONS <<eof
|
|
CREATE DATABASE \`$mysqldb\`;
|
|
CREATE USER \`$mysqluser\`@'$mysql_hostname' IDENTIFIED BY '$mysqlpwd';
|
|
GRANT ALL PRIVILEGES ON \`$mysqldb\`.* TO \`$mysqluser\`@'$mysql_hostname';
|
|
FLUSH PRIVILEGES;
|
|
eof
|
|
fi #`
|
|
|
|
if [ "$CLO_LETSENCRYPT" = "yes" ]; then
|
|
APACHE_CONFIGFILE="apache-site-https.conf.in"
|
|
else
|
|
APACHE_CONFIGFILE="apache-site.conf.in"
|
|
fi
|
|
# Generate and install Apache site-available file and log dir.
|
|
generate_config_file $APACHE_CONFIGFILE \
|
|
"/etc/apache2/sites-available/$name.conf"
|
|
mkdir "/var/log/koha/$name"
|
|
chown "$username:$username" "/var/log/koha/$name"
|
|
|
|
|
|
# Generate and install main Koha config file.
|
|
generate_config_file koha-conf-site.xml.in \
|
|
"/etc/koha/sites/$name/koha-conf.xml"
|
|
|
|
# Generate and install the log4perl config file.
|
|
generate_config_file log4perl-site.conf.in \
|
|
"/etc/koha/sites/$name/log4perl.conf"
|
|
|
|
# Generate and install Zebra config files.
|
|
generate_config_file zebra-biblios-dom-site.cfg.in \
|
|
"/etc/koha/sites/$name/zebra-biblios-dom.cfg"
|
|
generate_config_file zebra-authorities-dom-site.cfg.in \
|
|
"/etc/koha/sites/$name/zebra-authorities-dom.cfg"
|
|
generate_config_file zebra.passwd.in \
|
|
"/etc/koha/sites/$name/zebra.passwd"
|
|
|
|
# Create a GPG-encrypted file for requesting a DB to be set up.
|
|
if [ "$op" = request ]
|
|
then
|
|
touch "$name-db-request.txt"
|
|
chmod 0600 "$name-db-request.txt"
|
|
cat > "$name-db-request.txt" << eof
|
|
Please create a MySQL database and user on $mysqlhost as follows:
|
|
|
|
database name: $mysqldb
|
|
database user: $mysqluser
|
|
password: $mysqlpwd
|
|
|
|
Thank you.
|
|
eof
|
|
|
|
echo "See $name-db-request.txt for database creation request."
|
|
echo "Please forward it to the right person, and then run"
|
|
echo "$0 --populate-db $name"
|
|
echo "Thanks."
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ "$op" = create ] || [ "$op" = populate ]
|
|
then
|
|
# Re-fetch the passwords from the config we've generated, allows it
|
|
# to be different from what we set, in case the user had to change
|
|
# something.
|
|
mysqluser=$(getinstancemysqluser $name)
|
|
mysqldb=$(getinstancemysqldatabase $name)
|
|
# Use the default database content if that exists.
|
|
if [ -e "$DEFAULTSQL" ]
|
|
then
|
|
# Populate the database with default content.
|
|
zcat -f "$DEFAULTSQL" |
|
|
sed "s/__KOHASITE__/koha_$name/g" |
|
|
mysql --host="$mysqlhost" --user="$mysqluser" --password="$mysqlpwd" "$mysqldb"
|
|
|
|
|
|
# Change the default user's password.
|
|
staffpass="$(pwgen 12 1)"
|
|
staffdigest=$(echo -n "$staffpass" |
|
|
perl -e '
|
|
use Digest::MD5 qw(md5_base64);
|
|
while (<>) { print md5_base64($_), "\n"; }')
|
|
mysql --host="$mysqlhost" --user="$mysqluser" \
|
|
--password="$mysqlpwd" <<eof
|
|
USE \`$mysqldb\`;
|
|
UPDATE borrowers
|
|
SET password = '$staffdigest'
|
|
WHERE borrowernumber = $ADMINUSER;
|
|
eof
|
|
#`
|
|
echo "staff user password is '$staffpass' but keep that secret"
|
|
|
|
# Upgrade the database schema, just in case the dump was from an
|
|
# old version.
|
|
koha-upgrade-schema "$name"
|
|
else
|
|
echo "Koha instance is empty, no staff user created."
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ "$op" = create ] || [ "$op" = populate ] || [ "$op" = use ]
|
|
then
|
|
# Reconfigure Apache.
|
|
if ! {
|
|
a2ensite "$name" > /dev/null 2>&1 ||
|
|
a2ensite "${name}.conf" > /dev/null 2>&1
|
|
}; then
|
|
echo "Warning: problem enabling $name in Apache" >&2
|
|
fi
|
|
service apache2 restart
|
|
|
|
# Start Zebra.
|
|
koha-zebra --start "$name"
|
|
|
|
# Start worker
|
|
koha-worker --start "$name"
|
|
|
|
if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
|
|
# Start Indexer daemon
|
|
koha-indexer --start "$name"
|
|
fi
|
|
|
|
if [ "$CLO_LETSENCRYPT" = "yes" ]; then
|
|
# Get letsencrypt certificates
|
|
letsencrypt_instance
|
|
fi
|
|
|
|
chown $username:$username /var/log/koha/$name/*.log
|
|
fi
|
|
|
|
|
|
if [ "$op" = request ]
|
|
then
|
|
koha-disable "$name"
|
|
fi
|
|
|
|
echo <<eoh
|
|
|
|
Email for this instance is disabled. When you're ready to enable it, use:
|
|
koha-email-enable $name
|
|
eoh
|