[systemd-commits] 2 commits - configure.ac Makefile.am NEWS README src/systemctl

Martin Pitt martin at kemper.freedesktop.org
Thu May 28 10:43:03 PDT 2015


 Makefile.am                                 |    1 
 NEWS                                        |   11 ++++++
 README                                      |   11 ++++++
 configure.ac                                |   20 -----------
 src/systemctl/systemctl.c                   |   22 ++++++++-----
 src/systemctl/systemd-sysv-install.SKELETON |   47 ++++++++++++++++++++++++++++
 6 files changed, 85 insertions(+), 27 deletions(-)

New commits:
commit 355ff449007df8be192ac316ab314599f56b2241
Author: Martin Pitt <martin.pitt at ubuntu.com>
Date:   Wed May 27 14:52:17 2015 +0200

    systemctl: Don't skip SysV init.d scripts when enabling/disabling units
    
    If there is both a SysV init.d script and a systemd unit for a given name, we
    want to do the same enable/disable operation for both, instead of just on the
    systemd unit. This keeps the enablement status in sync so that switching init
    systems behaves as expected.

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index f0ba83d..897248a 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -5149,7 +5149,10 @@ static int enable_sysv_units(const char *verb, char **args) {
                                 break;
                 }
 
-                if (found_native)
+                /* If we have both a native unit and a SysV script,
+                 * enable/disable them both (below); for is-enabled, prefer the
+                 * native unit */
+                if (found_native && streq(verb, "is-enabled"))
                         continue;
 
                 p = path_join(arg_root, SYSTEM_SYSVINIT_PATH, name);
@@ -5161,7 +5164,10 @@ static int enable_sysv_units(const char *verb, char **args) {
                 if (!found_sysv)
                         continue;
 
-                log_info("%s is not a native service, redirecting to systemd-sysv-install", name);
+                if (found_native)
+                        log_info("Synchronizing state of %s with SysV init with %s...", name, argv[0]);
+                else
+                        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);
@@ -5209,6 +5215,9 @@ static int enable_sysv_units(const char *verb, char **args) {
                 } else
                         return -EPROTO;
 
+                if (found_native)
+                        continue;
+
                 /* Remove this entry, so that we don't try enabling it as native unit */
                 assert(f > 0);
                 f--;

commit 0f0467e63b0e0688ae9edb1512c1a2637d62ddb4
Author: Martin Pitt <martin.pitt at ubuntu.com>
Date:   Wed May 27 17:04:49 2015 +0200

    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.

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 <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



More information about the systemd-commits mailing list