mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-18 06:03:42 +03:00
systemctl: drop hardcoded chkconfig invocation
Introduce /usr/lib/systemd/systemd-sysv-install [--root=] <action> <name> abstraction, replacing the direct calling of chkconfig. This allows distributions to call their specific tools like update-rc.d without patching systemd. Ship systemd-sysv-install.SKELETON as an example for packagers how to implement this. Drop the --enable-chkconfig configure option. Document this in README and point to it in NEWS.
This commit is contained in:
parent
d31dd62ba2
commit
0f0467e63b
@ -627,6 +627,7 @@ systemgenerator_PROGRAMS += \
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
|
src/systemctl/systemd-sysv-install.SKELETON \
|
||||||
units/rc-local.service.in \
|
units/rc-local.service.in \
|
||||||
units/halt-local.service.in
|
units/halt-local.service.in
|
||||||
|
|
||||||
|
11
NEWS
11
NEWS
@ -1,5 +1,16 @@
|
|||||||
systemd System and Service Manager
|
systemd System and Service Manager
|
||||||
|
|
||||||
|
CHANGES WITH 221:
|
||||||
|
|
||||||
|
* Support for chkconfig (--enable-chkconfig) was removed in favour of
|
||||||
|
calling an abstraction /lib/systemd/systemd-sysv-install. This needs
|
||||||
|
to be implemented for your distribution. See "SYSV INIT.D SCRIPTS" in
|
||||||
|
README for details.
|
||||||
|
|
||||||
|
Contributions from: ...
|
||||||
|
|
||||||
|
-- Berlin, UNRELEASED
|
||||||
|
|
||||||
CHANGES WITH 220:
|
CHANGES WITH 220:
|
||||||
|
|
||||||
* The gudev library has been extracted into a separate repository
|
* The gudev library has been extracted into a separate repository
|
||||||
|
11
README
11
README
@ -222,6 +222,17 @@ NSS:
|
|||||||
|
|
||||||
hosts: files mymachines resolve myhostname
|
hosts: files mymachines resolve myhostname
|
||||||
|
|
||||||
|
SYSV INIT.D SCRIPTS:
|
||||||
|
When calling "systemctl enable/disable/is-enabled" on a unit which is a
|
||||||
|
SysV init.d script, it calls /usr/lib/systemd/systemd-sysv-install;
|
||||||
|
this needs to translate the action into the distribution specific
|
||||||
|
mechanism such as chkconfig or update-rc.d. Packagers need to provide
|
||||||
|
this script if you need this functionality (you don't if you disabled
|
||||||
|
SysV init support).
|
||||||
|
|
||||||
|
Please see src/systemctl/systemd-sysv-install.SKELETON for how this
|
||||||
|
needs to look like, and provide an implementation at the marked places.
|
||||||
|
|
||||||
WARNINGS:
|
WARNINGS:
|
||||||
systemd will warn you during boot if /etc/mtab is not a
|
systemd will warn you during boot if /etc/mtab is not a
|
||||||
symlink to /proc/mounts. Please ensure that /etc/mtab is a
|
symlink to /proc/mounts. Please ensure that /etc/mtab is a
|
||||||
|
20
configure.ac
20
configure.ac
@ -490,25 +490,6 @@ if test "x${have_ima}" != xno ; then
|
|||||||
AC_DEFINE(HAVE_IMA, 1, [Define if IMA is available])
|
AC_DEFINE(HAVE_IMA, 1, [Define if IMA is available])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
have_chkconfig=yes
|
|
||||||
AC_ARG_ENABLE([chkconfig], AS_HELP_STRING([--disable-chkconfig],[Disable optional chkconfig support]),
|
|
||||||
[case "${enableval}" in
|
|
||||||
yes) have_chkconfig=yes ;;
|
|
||||||
no) have_chkconfig=no ;;
|
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --disable-chkconfig) ;;
|
|
||||||
esac],
|
|
||||||
[AC_PATH_PROG(CHKCONFIG, chkconfig)
|
|
||||||
if test -z "$CHKCONFIG"; then
|
|
||||||
have_chkconfig=no
|
|
||||||
else
|
|
||||||
have_chkconfig=yes
|
|
||||||
fi])
|
|
||||||
|
|
||||||
if test "x${have_chkconfig}" != xno ; then
|
|
||||||
AC_DEFINE(HAVE_CHKCONFIG, 1, [Define if CHKCONFIG is available])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
have_selinux=no
|
have_selinux=no
|
||||||
AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support]))
|
AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support]))
|
||||||
@ -1541,7 +1522,6 @@ AC_MSG_RESULT([
|
|||||||
GCRYPT: ${have_gcrypt}
|
GCRYPT: ${have_gcrypt}
|
||||||
QRENCODE: ${have_qrencode}
|
QRENCODE: ${have_qrencode}
|
||||||
MICROHTTPD: ${have_microhttpd}
|
MICROHTTPD: ${have_microhttpd}
|
||||||
CHKCONFIG: ${have_chkconfig}
|
|
||||||
GNUTLS: ${have_gnutls}
|
GNUTLS: ${have_gnutls}
|
||||||
libcurl: ${have_libcurl}
|
libcurl: ${have_libcurl}
|
||||||
libidn: ${have_libidn}
|
libidn: ${have_libidn}
|
||||||
|
@ -5098,7 +5098,7 @@ static int import_environment(sd_bus *bus, char **args) {
|
|||||||
static int enable_sysv_units(const char *verb, char **args) {
|
static int enable_sysv_units(const char *verb, char **args) {
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
#if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG)
|
#if defined(HAVE_SYSV_COMPAT)
|
||||||
unsigned f = 0;
|
unsigned f = 0;
|
||||||
_cleanup_lookup_paths_free_ LookupPaths paths = {};
|
_cleanup_lookup_paths_free_ LookupPaths paths = {};
|
||||||
|
|
||||||
@ -5123,7 +5123,7 @@ static int enable_sysv_units(const char *verb, char **args) {
|
|||||||
_cleanup_free_ char *p = NULL, *q = NULL, *l = NULL;
|
_cleanup_free_ char *p = NULL, *q = NULL, *l = NULL;
|
||||||
bool found_native = false, found_sysv;
|
bool found_native = false, found_sysv;
|
||||||
unsigned c = 1;
|
unsigned c = 1;
|
||||||
const char *argv[6] = { "/sbin/chkconfig", NULL, NULL, NULL, NULL };
|
const char *argv[6] = { ROOTLIBEXECDIR "/systemd-sysv-install", NULL, NULL, NULL, NULL };
|
||||||
char **k;
|
char **k;
|
||||||
int j;
|
int j;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@ -5161,15 +5161,13 @@ static int enable_sysv_units(const char *verb, char **args) {
|
|||||||
if (!found_sysv)
|
if (!found_sysv)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
log_info("%s is not a native service, redirecting to /sbin/chkconfig.", name);
|
log_info("%s is not a native service, redirecting to systemd-sysv-install", name);
|
||||||
|
|
||||||
if (!isempty(arg_root))
|
if (!isempty(arg_root))
|
||||||
argv[c++] = q = strappend("--root=", arg_root);
|
argv[c++] = q = strappend("--root=", arg_root);
|
||||||
|
|
||||||
|
argv[c++] = verb;
|
||||||
argv[c++] = basename(p);
|
argv[c++] = basename(p);
|
||||||
argv[c++] =
|
|
||||||
streq(verb, "enable") ? "on" :
|
|
||||||
streq(verb, "disable") ? "off" : "--level=5";
|
|
||||||
argv[c] = NULL;
|
argv[c] = NULL;
|
||||||
|
|
||||||
l = strv_join((char**)argv, " ");
|
l = strv_join((char**)argv, " ");
|
||||||
@ -5185,6 +5183,7 @@ static int enable_sysv_units(const char *verb, char **args) {
|
|||||||
/* Child */
|
/* Child */
|
||||||
|
|
||||||
execv(argv[0], (char**) argv);
|
execv(argv[0], (char**) argv);
|
||||||
|
log_error("Failed to execute %s: %m", argv[0]);
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
47
src/systemctl/systemd-sysv-install.SKELETON
Executable file
47
src/systemctl/systemd-sysv-install.SKELETON
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# This script is called by "systemctl enable/disable" when the given unit is a
|
||||||
|
# SysV init.d script. It needs to call the distribution's mechanism for
|
||||||
|
# enabling/disabling those, such as chkconfig, update-rc.d, or similar. This
|
||||||
|
# can optionally take a --root argument for enabling a SysV init script
|
||||||
|
# in a chroot or similar.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [--root=path] enable|disable|is-enabled <sysv script name>" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse options
|
||||||
|
eval set -- "$(getopt -o r: --long root: -- "$@")"
|
||||||
|
while true; do
|
||||||
|
case "$1" in
|
||||||
|
-r|--root)
|
||||||
|
ROOT="$2"
|
||||||
|
shift 2 ;;
|
||||||
|
--) shift ; break ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
NAME="$2"
|
||||||
|
[ -n "$NAME" ] || usage
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
enable)
|
||||||
|
# call the command to enable SysV init script $NAME here
|
||||||
|
# (consider optional $ROOT)
|
||||||
|
echo "IMPLEMENT ME: enabling SysV init.d script $NAME"
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
# call the command to disable SysV init script $NAME here
|
||||||
|
# (consider optional $ROOT)
|
||||||
|
echo "IMPLEMENT ME: disabling SysV init.d script $NAME"
|
||||||
|
;;
|
||||||
|
is-enabled)
|
||||||
|
# exit with 0 if $NAME is enabled, non-zero if it is disabled
|
||||||
|
# (consider optional $ROOT)
|
||||||
|
echo "IMPLEMENT ME: checking SysV init.d script $NAME"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage ;;
|
||||||
|
esac
|
Loading…
x
Reference in New Issue
Block a user