From 0f0467e63b0e0688ae9edb1512c1a2637d62ddb4 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Wed, 27 May 2015 17:04:49 +0200 Subject: [PATCH] systemctl: drop hardcoded chkconfig invocation Introduce /usr/lib/systemd/systemd-sysv-install [--root=] 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. --- Makefile.am | 1 + NEWS | 11 +++++++ README | 11 +++++++ configure.ac | 20 ------------ src/systemctl/systemctl.c | 11 +++---- src/systemctl/systemd-sysv-install.SKELETON | 47 +++++++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 26 deletions(-) create mode 100755 src/systemctl/systemd-sysv-install.SKELETON diff --git a/Makefile.am b/Makefile.am index 98ceb77..e4a8616 100644 --- a/Makefile.am +++ b/Makefile.am @@ -627,6 +627,7 @@ systemgenerator_PROGRAMS += \ endif EXTRA_DIST += \ + src/systemctl/systemd-sysv-install.SKELETON \ units/rc-local.service.in \ units/halt-local.service.in diff --git a/NEWS b/NEWS index ee533b4..2e2d1ce 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,16 @@ 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: * The gudev library has been extracted into a separate repository diff --git a/README b/README index 2b8c68e..2be3972 100644 --- a/README +++ b/README @@ -222,6 +222,17 @@ NSS: 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: systemd will warn you during boot if /etc/mtab is not a symlink to /proc/mounts. Please ensure that /etc/mtab is a diff --git a/configure.ac b/configure.ac index 0818dd8..e46ca45 100644 --- a/configure.ac +++ b/configure.ac @@ -491,25 +491,6 @@ if test "x${have_ima}" != xno ; then 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 AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support])) if test "x$enable_selinux" != "xno"; then @@ -1541,7 +1522,6 @@ AC_MSG_RESULT([ GCRYPT: ${have_gcrypt} QRENCODE: ${have_qrencode} MICROHTTPD: ${have_microhttpd} - CHKCONFIG: ${have_chkconfig} GNUTLS: ${have_gnutls} libcurl: ${have_libcurl} libidn: ${have_libidn} diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index f8e10a4..f0ba83d 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -5098,7 +5098,7 @@ static int import_environment(sd_bus *bus, char **args) { static int enable_sysv_units(const char *verb, char **args) { int r = 0; -#if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG) +#if defined(HAVE_SYSV_COMPAT) unsigned f = 0; _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; bool found_native = false, found_sysv; 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; int j; pid_t pid; @@ -5161,15 +5161,13 @@ static int enable_sysv_units(const char *verb, char **args) { if (!found_sysv) 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)) argv[c++] = q = strappend("--root=", arg_root); + argv[c++] = verb; argv[c++] = basename(p); - argv[c++] = - streq(verb, "enable") ? "on" : - streq(verb, "disable") ? "off" : "--level=5"; argv[c] = NULL; l = strv_join((char**)argv, " "); @@ -5185,6 +5183,7 @@ static int enable_sysv_units(const char *verb, char **args) { /* Child */ execv(argv[0], (char**) argv); + log_error("Failed to execute %s: %m", argv[0]); _exit(EXIT_FAILURE); } diff --git a/src/systemctl/systemd-sysv-install.SKELETON b/src/systemctl/systemd-sysv-install.SKELETON new file mode 100755 index 0000000..a53a3e6 --- /dev/null +++ b/src/systemctl/systemd-sysv-install.SKELETON @@ -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 " >&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 -- 2.7.4