From 3e49abe2fbae626c61af73d163f6e74be54fed2b Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Wed, 30 Sep 2020 21:20:32 +0200 Subject: [PATCH 1007/1007] sysv: restore support for halt.local This patch basically reverts the following commits: - commit 44508946534eee032927c263b79464832656dd6e. "Drop support for /usr/sbin/halt.local" - commit c0d11245d2bdcf2a4333c3d49c973d83dfbe3791. "Drop no longer needed halt-local.service.in" The paths of the scripts in man/systemd-rc-local-generator.xml have been changed to match those used by SUSE. The use of halt.local is now deprecated and its usage is logged at notice level. --- docs/DISTRO_PORTING.md | 1 + man/custom-entities.ent.in | 1 + man/systemd-rc-local-generator.xml | 17 +++++++++++++--- meson.build | 2 ++ meson_options.txt | 2 ++ src/rc-local-generator/rc-local-generator.c | 8 ++++++++ units/halt-local.service.in | 22 +++++++++++++++++++++ units/meson.build | 1 + 8 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 units/halt-local.service.in diff --git a/docs/DISTRO_PORTING.md b/docs/DISTRO_PORTING.md index 2e4782f401..8c2af4f82f 100644 --- a/docs/DISTRO_PORTING.md +++ b/docs/DISTRO_PORTING.md @@ -17,6 +17,7 @@ distribution: * `-Dsysvinit-path=` * `-Dsysvrcnd-path=` * `-Drc-local=` + * `-Dhalt-local=` * `-Dloadkeys-path=` * `-Dsetfont-path=` * `-Dtty-gid=` diff --git a/man/custom-entities.ent.in b/man/custom-entities.ent.in index 0e9a1b84e3..8da038c991 100644 --- a/man/custom-entities.ent.in +++ b/man/custom-entities.ent.in @@ -11,6 +11,7 @@ + diff --git a/man/systemd-rc-local-generator.xml b/man/systemd-rc-local-generator.xml index f0e38ead47..39c1fc9340 100644 --- a/man/systemd-rc-local-generator.xml +++ b/man/systemd-rc-local-generator.xml @@ -20,7 +20,7 @@ systemd-rc-local-generator rc-local.service - Compatibility generator and service to start &RC_LOCAL_PATH; during boot + Compatibility generator and service to start &RC_LOCAL_PATH; and &RC_LOCAL_SCRIPT_PATH_STOP; during boot and shutdown @@ -53,11 +53,22 @@ Wants=network-online.target After=network-online.target - Support for &RC_LOCAL_PATH; is provided for compatibility with specific System - V systems only. However, it is strongly recommended to avoid making use of this script today, and instead + systemd-rc-local-generator also checks whether + &RC_LOCAL_SCRIPT_PATH_STOP; exists and is executable, and if it is pulls the + halt-local.service unit into the shutdown process. This unit is responsible for + running this script during later shutdown. + + Support for &RC_LOCAL_PATH; and + &RC_LOCAL_SCRIPT_PATH_STOP; is provided for compatibility with specific System V + systems only. However, it is strongly recommended to avoid making use of this script today, and instead provide proper unit files with appropriate dependencies for any scripts to run during the boot process. Note that the path to the script is set at compile time and varies between distributions. + Please note that the support for &RC_LOCAL_SCRIPT_PATH_STOP; will be removed in + the future. It is recommended to use the use the mechanism described in + systemd-shutdown8 + instead. + systemd-rc-local-generator implements systemd.generator7. diff --git a/meson.build b/meson.build index 511024f28e..09f90c8bcf 100644 --- a/meson.build +++ b/meson.build @@ -227,6 +227,7 @@ conf.set_quoted('PREFIX', prefixdir) conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed')) conf.set_quoted('RANDOM_SEED_DIR', randomseeddir) conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local')) +conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local')) conf.set_quoted('ROOTBINDIR', rootbindir) conf.set_quoted('ROOTLIBDIR', rootlibdir) conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir) @@ -3758,6 +3759,7 @@ status = [ 'bash completions directory: @0@'.format(bashcompletiondir), 'zsh completions directory: @0@'.format(zshcompletiondir), 'extra start script: @0@'.format(get_option('rc-local')), + 'extra stop script: @0@'.format(get_option('halt-local')), 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'), get_option('debug-tty')), 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'), diff --git a/meson_options.txt b/meson_options.txt index cbefe7aa83..88fb91d5ec 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -40,6 +40,8 @@ option('telinit-path', type : 'string', value : '/lib/sysvinit/telinit', description : 'path to telinit') option('rc-local', type : 'string', value : '/etc/rc.local') +option('halt-local', type : 'string', + value : '/usr/sbin/halt.local') option('initrd', type : 'boolean', description : 'install services for use when running systemd in initrd') option('compat-mutable-uid-boundaries', type : 'boolean', value : 'false', diff --git a/src/rc-local-generator/rc-local-generator.c b/src/rc-local-generator/rc-local-generator.c index 99cffee3ec..96ee56854c 100644 --- a/src/rc-local-generator/rc-local-generator.c +++ b/src/rc-local-generator/rc-local-generator.c @@ -65,6 +65,14 @@ static int run(const char *dest, const char *dest_early, const char *dest_late) r = add_symlink("rc-local.service", "multi-user.target"); } + if (check_executable(RC_LOCAL_SCRIPT_PATH_STOP) >= 0) { + log_debug("Automatically adding halt-local.service."); + log_notice("Use of %s is deprecated, see systemd-shutdown(8) man page for an alternative.", + RC_LOCAL_SCRIPT_PATH_STOP); + + k = add_symlink("halt-local.service", "final.target"); + } + return r < 0 ? r : k; } diff --git a/units/halt-local.service.in b/units/halt-local.service.in new file mode 100644 index 0000000000..5fc78b5580 --- /dev/null +++ b/units/halt-local.service.in @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1+ +# +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description={{RC_LOCAL_SCRIPT_PATH_STOP}} Compatibility +ConditionFileIsExecutable={{RC_LOCAL_SCRIPT_PATH_STOP}} +DefaultDependencies=no +After=shutdown.target +Before=final.target + +[Service] +Type=oneshot +ExecStart={{RC_LOCAL_SCRIPT_PATH_STOP}} +TimeoutSec=0 +StandardOutput=tty +RemainAfterExit=yes diff --git a/units/meson.build b/units/meson.build index 72d9a48a60..c2364da948 100644 --- a/units/meson.build +++ b/units/meson.build @@ -175,6 +175,7 @@ in_units = [ 'sysinit.target.wants/'], ['quotaon.service', 'ENABLE_QUOTACHECK'], ['rc-local.service', 'HAVE_SYSV_COMPAT'], + ['halt-local.service', 'HAVE_SYSV_COMPAT'], ['rescue.service', ''], ['serial-getty@.service', ''], ['systemd-backlight@.service', 'ENABLE_BACKLIGHT'], -- 2.31.1