[systemd-devel] [PATCH v3] systemctl: drop hardcoded chkconfig invocation

Lennart Poettering lennart at poettering.net
Thu May 28 10:22:51 PDT 2015


On Thu, 28.05.15 15:02, Martin Pitt (martin.pitt at ubuntu.com) wrote:

> Lennart Poettering [2015-05-28 13:05 +0200]:
> > Nah, please remove this part. We should not ship that upstream. THis
> > is something that Fedora's initscripts.rpm should provide eventually,
> > and should be neither shipped with systemd upstream nor systemd.rpm in
> > Fedora.
> 
> OK, done. I changed it to be an example .SKELETON script in the
> source/tarball now, but it's not installed. (Makes it easier for
> packagers to adjust).
> 
> Also added README/NEWS now.

Looks good. Please push!

> 
> Martin
> 
> -- 
> Martin Pitt                        | http://www.piware.de
> Ubuntu Developer (www.ubuntu.com)  | Debian Developer  (www.debian.org)

> From a23a4b6c0e2b156b8902b56eab65eb87c239a073 Mon Sep 17 00:00:00 2001
> From: Martin Pitt <martin.pitt at ubuntu.com>
> Date: Wed, 27 May 2015 17:04:49 +0200
> Subject: [PATCH] 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.
> ---
>  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 d6010c5..b7d0add 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
> -- 
> 2.1.4
> 




> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel



Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list