Bug 40901: Restructure packages - koha-common becomes metapackage

This patch restructures the Koha packaging to support both systemd and
SysV init systems through a clean separation of concerns.

Package hierarchy:
- koha-core: Core application files (no init system)
- koha-systemd: Native systemd units (Provides: koha-init)
- koha-sysv: SysV init scripts (Provides: koha-init, Conflicts: koha-systemd)
- koha-common: Metapackage (Depends: koha-core, koha-systemd | koha-sysv)

Changes:
- koha-core: Removed 'daemon' dependency, updated description to clarify
  it provides core files without init system
- koha-systemd: Now depends on koha-core instead of koha-common, provides
  koha-init virtual package
- koha-sysv: Now depends on koha-core instead of koha-common, provides
  koha-init virtual package
- koha-common: Converted to metapackage that depends on koha-core and
  prefers koha-systemd on systemd-based systems
- Removed koha-common.install (files now installed by koha-core)
- Simplified koha-common.postinst (metapackage has minimal logic)

Benefits:
- Clean separation between core application and init system
- Users can explicitly choose their init system
- KTD can use koha-sysv without systemd
- Modern systems get native systemd by default
- Conflicts prevent both init systems being active simultaneously

Test plan:
1. Build packages
2. Install koha-common on a systemd system, verify koha-systemd is pulled in
3. Try installing both koha-systemd and koha-sysv, verify conflict
4. Install koha-core + koha-sysv explicitly, verify it works

Signed-off-by: Tomás Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Pedro Amorim <pedro.amorim@openfifth.co.uk>
This commit is contained in:
Tomás Cohen Arazi 2026-03-10 15:21:31 -03:00 committed by Pedro Amorim
parent 34ad12360f
commit be89db235c
No known key found for this signature in database
GPG Key ID: 06B75BA7F3894D55
3 changed files with 16 additions and 359 deletions

40
debian/control.in vendored
View File

@ -16,26 +16,14 @@ Build-Depends:__AUTODEPENDS__,
Package: koha-common
Architecture: all
Depends: ${misc:Depends}, ${koha:Depends},
Depends: ${misc:Depends},
koha-core,
koha-systemd | koha-sysv,
apache2,
apache2-mpm-itk | libapache2-mpm-itk,
at,
cron-daemon,
daemon,
debconf,
idzebra-2.0,
koha-l10n,
memcached,
mysql-client | virtual-mysql-client,
perl-doc,
pwgen,
rabbitmq-server,
sudo,
fonts-dejavu | ttf-dejavu,
unzip,
weasyprint,
xmlstarlet,
yaz
rabbitmq-server
Suggests: mysql-server | virtual-mysql-server,
letsencrypt,
Homepage: http://koha-community.org/
@ -43,8 +31,9 @@ Description: integrated (physical) library management system
Koha is an Integrated Library Management system for real-world libraries
(the kinds with books).
.
This package contains everything needed to run Koha, except the site
specific configuration files. See the package koha for the rest.
This metapackage installs the complete Koha system with all dependencies.
On systemd-based systems, it will use native systemd units (koha-systemd).
On other systems or containers, it will use SysV init scripts (koha-sysv).
Package: koha
Architecture: all
@ -108,14 +97,15 @@ Description: integrated (physical) library management system
Koha is an Integrated Library Management system for real-world libraries
(the kinds with books).
.
This package provides a version of Koha identical to that of koha-full,
but without third-party systems such as MariaDB, RabbitMQ, et cetera.
This package provides the core Koha application files, scripts, and
configuration without any init system. It requires either koha-sysv or
koha-systemd to manage services.
.
This package is EXPERIMENTAL and not recommended for production use.
Most users should install koha-common instead, which will automatically
select the appropriate init system.
Depends: ${misc:Depends}, ${koha:Depends},
at,
cron-daemon,
daemon,
debconf,
koha-l10n,
mysql-client | virtual-mysql-client,
@ -150,7 +140,9 @@ Description: integrated (physical) library management system
Package: koha-systemd
Architecture: all
Depends: ${misc:Depends}, systemd, koha-common
Depends: ${misc:Depends}, systemd, koha-core
Provides: koha-init
Conflicts: koha-sysv
Description: systemd units for Koha ILS
Koha is an Integrated Library Management system for real-world libraries
(the kinds with books).
@ -165,7 +157,7 @@ Description: systemd units for Koha ILS
Package: koha-sysv
Architecture: all
Depends: ${misc:Depends}, daemon, koha-common
Depends: ${misc:Depends}, daemon, koha-core
Provides: koha-init
Conflicts: koha-systemd
Description: SysV init scripts for Koha ILS

View File

@ -1,40 +0,0 @@
debian/tmp/usr/* usr
debian/tmp/etc/koha/zebradb/[!z]*
debian/tmp/etc/koha/z3950
debian/templates/* etc/koha
debian/koha-post-install-setup usr/sbin
debian/unavailable.html usr/share/koha/intranet/htdocs
debian/unavailable.html usr/share/koha/opac/htdocs
debian/templates/* etc/koha
debian/scripts/koha-functions.sh usr/share/koha/bin
debian/scripts/koha-create usr/sbin
debian/scripts/koha-create-dirs usr/sbin
debian/scripts/koha-disable usr/sbin
debian/scripts/koha-dump usr/sbin
debian/scripts/koha-dump-defaults usr/sbin
debian/scripts/koha-elasticsearch usr/sbin
debian/scripts/koha-email-disable usr/sbin
debian/scripts/koha-email-enable usr/sbin
debian/scripts/koha-enable usr/sbin
debian/scripts/koha-es-indexer usr/sbin
debian/scripts/koha-foreach usr/sbin
debian/scripts/koha-indexer usr/sbin
debian/scripts/koha-list usr/sbin
debian/scripts/koha-mysql usr/sbin
debian/scripts/koha-passwd usr/sbin
debian/scripts/koha-plack usr/sbin
debian/scripts/koha-rebuild-zebra usr/sbin
debian/scripts/koha-remove usr/sbin
debian/scripts/koha-reset-passwd usr/sbin
debian/scripts/koha-restore usr/sbin
debian/scripts/koha-run-backups usr/sbin
debian/scripts/koha-shell usr/sbin
debian/scripts/koha-sip usr/sbin
debian/scripts/koha-sitemap usr/sbin
debian/scripts/koha-translate usr/sbin
debian/scripts/koha-upgrade-schema usr/sbin
debian/scripts/koha-upgrade-to-3.4 usr/sbin
debian/scripts/koha-worker usr/sbin
debian/scripts/koha-z3950-responder usr/sbin
debian/scripts/koha-zebra usr/sbin
debian/tmp_docbook/*.8 usr/share/man/man8

View File

@ -2,301 +2,6 @@
set -e
# Default to "yes"
AUTOMATIC_TRANSLATIONS_UPDATE="yes"
. /usr/share/debconf/confmodule
# Read configuration variable file if it is present
CONFIG=/etc/koha/koha-common.conf
if [ -r $CONFIG ]; then
. $CONFIG
fi
conf=/etc/mysql/koha-common.cnf
if [ ! -e "$conf" ] && [ ! -L "$conf" ]; then
ln -s debian.cnf "$conf"
fi
#DEBHELPER#
koha-upgrade-schema $(koha-list)
# Generate a config file if one doesn't exist already
if [ ! -e $CONFIG ]; then
cat <<EOF >$CONFIG
## Automatic template translation update
#
# This variable controls whether template translations should
# be updated automatically on koha-common package upgrades.
# Options: 'yes' (default)
# 'no'
# Note: if you choose 'no' then you will have to issue
# $ koha-translate --update <lang_code>
#
AUTOMATIC_TRANSLATIONS_UPDATE="yes"
EOF
fi
# Substitute the values from debconf into the file.
db_get koha-common/automatically-update-translations
UPDATE="$RET"
if [ "$UPDATE" = "false" ]; then
UPDATE="no"
else
UPDATE="yes"
fi
# In case they were removed/commented out, we add it in.
grep -Eq '^ *AUTOMATIC_TRANSLATIONS_UPDATE=' $CONFIG ||
echo "AUTOMATIC_TRANSLATIONS_UPDATE=" >>$CONFIG
sed -e "s/^ *AUTOMATIC_TRANSLATIONS_UPDATE=.*/AUTOMATIC_TRANSLATIONS_UPDATE=\"$UPDATE\"/" <$CONFIG >$CONFIG.tmp
mv -f $CONFIG.tmp $CONFIG
if [ "$AUTOMATIC_TRANSLATIONS_UPDATE" = "yes" ]; then
for lang in $(koha-translate --list | grep -v -x "en"); do
if koha-translate --update $lang; then
echo "Updated the $lang translations."
else
cat <<EOF >&2
ERROR: an error was found when updating '$lang' translations. Please manually
run 'koha-translate --update $lang'. Run man koha-translate for more options.
EOF
fi
done
else
# no auto-update, check update needed and warn if needed
if koha-translate --list | grep -v -q -x "en"; then
# translations installed, update needed
cat <<EOF >&2
Warning: template translations are not set to be automatically updated.
Please manually run 'koha-translate --update lang_code' to update them.
You can run 'koha-translate --list' to get a list of the installed translations codes.
EOF
fi
fi
# Check if we need to rename the Apache vhost files
RENAME_APACHE_FILES="no"
for vhost in $(koha-list); do
if [ -f "/etc/apache2/sites-available/$vhost" ] &&
[ ! -f "/etc/apache2/sites-available/$vhost.conf" ]; then
RENAME_APACHE_FILES="yes"
break # at least one, trigger renaming
fi
done
if [ "$RENAME_APACHE_FILES" = "yes" ]; then
# If the user agreed we now rename their Apache files
db_get koha-common/rename-apache-vhost-files
if [ "$RET" = "false" ]; then
# We're not renaming the files, just print a warning
cat <<EOF >&2
Warning: you have chosen not to migrate your Apache virtual hosts files to the
Apache 2.4 naming schema. You can do it manually by running this for each
Koha instance:
$ sudo a2dissite instance
$ sudo mv /etc/apache2/sites-available/instance \
/etc/apache2/sites-available/instance.conf
$ sudo a2ensite instance
EOF
else
# We have to rename the Apache files
for site in $(koha-list); do
ENABLE_VHOST="yes"
if [ -f "/etc/apache2/sites-available/$site" ] &&
[ ! -f "/etc/apache2/sites-available/$site.conf" ]; then
if [ ! -f "/etc/apache2/sites-enabled/$site" ]; then
ENABLE_VHOST="no"
fi
a2dissite $site >/dev/null 2>&1 || true
rm -f "/etc/apache2/sites-enabled/$site"
# Rename the vhost definition files
mv "/etc/apache2/sites-available/$site" \
"/etc/apache2/sites-available/$site.conf"
if [ "$ENABLE_VHOST" = "yes" ]; then
if ! {
a2ensite "$site" >/dev/null 2>&1 ||
a2ensite "${site}.conf" >/dev/null 2>&1
}; then
echo "Warning: problem enabling $site in Apache" >&2
fi
fi
fi
done
fi
fi
log4perl_component() {
local config=$1
local component=$2
if grep -q "log4perl.logger.$component" $config; then
return 0
else
return 1
fi
}
# Take care of the instance's log4perl.conf file
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "z3950"; then
cat <<EOF >>$log4perl_config
log4perl.logger.z3950 = WARN, Z3950
log4perl.appender.Z3950=Log::Log4perl::Appender::File
log4perl.appender.Z3950.filename=/var/log/koha/$site/z3950-error.log
log4perl.appender.Z3950.mode=append
log4perl.appender.Z3950.layout=PatternLayout
log4perl.appender.Z3950.layout.ConversionPattern=[%d] [%p] %m %l%n
log4perl.appender.Z3950.utf8=1
EOF
fi
if ! log4perl_component $log4perl_config "api"; then
cat <<EOF >>$log4perl_config
log4perl.logger.api = WARN, API
log4perl.appender.API=Log::Log4perl::Appender::File
log4perl.appender.API.filename=/var/log/koha/$site/api-error.log
log4perl.appender.API.mode=append
log4perl.appender.API.layout=PatternLayout
log4perl.appender.API.layout.ConversionPattern=[%d] [%p] %m %l%n
log4perl.appender.API.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "sip"; then
cat <<EOF >>$log4perl_config
log4perl.logger.sip = DEBUG, SIP
log4perl.appender.SIP=Log::Log4perl::Appender::File
log4perl.appender.SIP.filename=/var/log/koha/$site/sip-output.log
log4perl.appender.SIP.mode=append
log4perl.appender.SIP.layout=PatternLayout
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %X{accountid}@%X{peeraddr}: %m %l%n
log4perl.appender.SIP.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "plack-opac"; then
cat <<EOF >>$log4perl_config
log4perl.logger.plack-opac = WARN, PLACKOPAC
log4perl.appender.PLACKOPAC=Log::Log4perl::Appender::File
log4perl.appender.PLACKOPAC.filename=/var/log/koha/$site/plack-opac-error.log
log4perl.appender.PLACKOPAC.mode=append
log4perl.appender.PLACKOPAC.layout=PatternLayout
log4perl.appender.PLACKOPAC.layout.ConversionPattern=[%d] [%p] %m%n
log4perl.appender.PLACKOPAC.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "plack-api"; then
cat <<EOF >>$log4perl_config
log4perl.logger.plack-api = WARN, PLACKAPI
log4perl.appender.PLACKAPI=Log::Log4perl::Appender::File
log4perl.appender.PLACKAPI.filename=/var/log/koha/$site/plack-api-error.log
log4perl.appender.PLACKAPI.mode=append
log4perl.appender.PLACKAPI.layout=PatternLayout
log4perl.appender.PLACKAPI.layout.ConversionPattern=[%d] [%p] %m%n
log4perl.appender.PLACKAPI.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "plack-intranet"; then
cat <<EOF >>$log4perl_config
log4perl.logger.plack-intranet = WARN, PLACKINTRANET
log4perl.appender.PLACKINTRANET=Log::Log4perl::Appender::File
log4perl.appender.PLACKINTRANET.filename=/var/log/koha/$site/plack-intranet-error.log
log4perl.appender.PLACKINTRANET.mode=append
log4perl.appender.PLACKINTRANET.layout=PatternLayout
log4perl.appender.PLACKINTRANET.layout.ConversionPattern=[%d] [%p] %m%n
log4perl.appender.PLACKINTRANET.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "worker"; then
cat <<EOF >>$log4perl_config
log4perl.logger.worker = WARN, WORKER
log4perl.appender.WORKER=Log::Log4perl::Appender::Screen
log4perl.appender.WORKER.stderr=1
log4perl.appender.WORKER.layout=PatternLayout
log4perl.appender.WORKER.layout.ConversionPattern=[%d] [%p] %m %l%n
log4perl.appender.WORKER.utf8=1
EOF
fi
done
for site in $(koha-list); do
log4perl_config="/etc/koha/sites/$site/log4perl.conf"
if ! log4perl_component $log4perl_config "edi"; then
cat <<EOF >>$log4perl_config
log4perl.logger.edi = TRACE, EDI
log4perl.appender.EDI=Log::Log4perl::Appender::File
log4perl.appender.EDI.filename=/var/log/koha/$site/editrace.log
log4perl.appender.EDI.mode=append
log4perl.appender.EDI.layout=PatternLayout
log4perl.appender.EDI.layout.ConversionPattern=[%d] [%P] [%p] %X{accountid}@%X{peeraddr}: %m %l%n
log4perl.appender.EDI.utf8=1
EOF
fi
done
for site in $(koha-list); do
kohaconfig="/etc/koha/sites/$site/koha-conf.xml"
logdir="$(xmlstarlet sel -t -v 'yazgfs/config/logdir' $kohaconfig)"
if [ "$logdir" != "" ] && [ "$logdir" != "0" ]; then
chown -R $site-koha:$site-koha $logdir
else
chown -R $site-koha:$site-koha /var/log/koha/$site
fi
done
# Bug 14106 - fix the modulePath of existing koha instances so that it'll
# continue to work. This will only patch the files if the exact original string
# that we're fixing them from is there, so we just run it every time. Maybe
# in many years time we can get rid of this, when no one will be running
# Koha < 3.20.
for zfile in $(find /etc/koha/sites -name zebra-authorities-dom.cfg -or -name zebra-biblios-dom.cfg); do
perl -p -i -e 's{^modulePath: /usr/lib/idzebra-2.0/modules$}{modulePath: /usr/lib/idzebra-2.0/modules:/usr/lib/x86_64-linux-gnu/idzebra-2.0/modules:/usr/lib/i386-linux-gnu/idzebra-2.0/modules:/usr/lib/aarch64-linux-gnu/idzebra-2.0/modules:/usr/lib/arm-linux-gnueabi/idzebra-2.0/modules:/usr/lib/arm-linux-gnueabihf/idzebra-2.0/modules:/usr/lib/mips-linux-gnu/idzebra-2.0/modules:/usr/lib/mipsel-linux-gnu/idzebra-2.0/modules:/usr/lib/powerpc-linux-gnu/idzebra-2.0/modules:/usr/lib/powerpc64le-linux-gnu/idzebra-2.0/modules:/usr/lib/s390x-linux-gnu/idzebra-2.0/modules}' $zfile
done
db_stop
rabbitmq-plugins enable rabbitmq_stomp
service rabbitmq-server restart
# Bug 35242: Force memcache restart after koha install/upgrade
service memcached restart
# Bug 18250: Correct startup order of koha-common and memcached
# Since the init script has been updated, we can force the order in rc.d
# by disabling and enabling again.
update-rc.d koha-common disable
update-rc.d koha-common enable
exit 0