From 0a81e1173a509c17670dcc86f00b870c182c02c1 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Thu, 23 Jun 2016 11:06:10 +0200 Subject: [PATCH 27/27] SQ: Detect if /sbin/service is available --- configure.ac | 5 +++++ src/tools/sssctl/sssctl.c | 53 +++++++++++++++++++++++++++++++++++++++++------ src/tools/sssctl/sssctl.h | 6 ++++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 964ea8058b771bf5e35cd8246e85f28f797534b6..0d3573c849b508cba00bb12cfae4f496ae5ed6d7 100644 --- a/configure.ac +++ b/configure.ac @@ -212,6 +212,11 @@ WITH_INITSCRIPT if test x$initscript = xsystemd; then WITH_SYSTEMD_UNIT_DIR WITH_SYSTEMD_CONF_DIR +else + AC_CHECK_PROG(HAVE_SERVICE, service, yes, no) + AS_IF([test x$HAVE_SERVICE = xyes], + [AC_DEFINE(HAVE_SERVICE, 1, + [Whether the service command is available])]) fi PKG_CHECK_MODULES([DBUS],[dbus-1]) diff --git a/src/tools/sssctl/sssctl.c b/src/tools/sssctl/sssctl.c index d0faef0c6fe920c21d936ab8d75c56b49c60ad43..218ebf06ab3460fb6b381c6f42fc5e62cb677732 100644 --- a/src/tools/sssctl/sssctl.c +++ b/src/tools/sssctl/sssctl.c @@ -123,6 +123,22 @@ errno_t sssctl_run_command(const char *command) return EOK; } +errno_t sssctl_svc_mgmg(enum sss_svc_acct svc_acct) +{ +#if defined(HAVE_SYSTEMD_LOGIN) || defined(HAVE_SERVICE) + switch (svc_acct) { + case SSS_SVC_START: + return sssctl_run_command(SSSD_SVC_CMD("start")); + case SSS_SVC_STOP: + return sssctl_run_command(SSSD_SVC_CMD("stop")); + case SSS_SVC_RESTART: + return sssctl_run_command(SSSD_SVC_CMD("restart")); + } +#endif + + return ENOSYS; +} + bool sssctl_start_sssd(bool force) { enum sssctl_prompt_result prompt; @@ -145,8 +161,16 @@ bool sssctl_start_sssd(bool force) } } - ret = sssctl_run_command(SSSD_SVC_CMD("start")); - if (ret != EOK) { + ret = sssctl_svc_mgmg(SSS_SVC_START); + switch(ret) { + case EOK: + return true; + case ENOSYS: + fprintf(stderr, "Starting SSSD automatically is not supported " + "on this platform, please start the service " + "manually\n"); + return false; + default: fprintf(stderr, "Unable to start SSSD!\n"); return false; } @@ -176,12 +200,21 @@ bool sssctl_stop_sssd(bool force) } } - ret = sssctl_run_command(SSSD_SVC_CMD("stop")); - if (ret != EOK) { + ret = sssctl_svc_mgmg(SSS_SVC_STOP); + switch(ret) { + case EOK: + return true; + case ENOSYS: + fprintf(stderr, "Stopping SSSD automatically is not supported " + "on this platform, please stop the service " + "manually\n"); + return false; + default: fprintf(stderr, "Unable to stop SSSD!\n"); return false; } + return true; } @@ -203,8 +236,16 @@ bool sssctl_restart_sssd(bool force) } } - ret = sssctl_run_command(SSSD_SVC_CMD("restart")); - if (ret != EOK) { + ret = sssctl_svc_mgmg(SSS_SVC_RESTART); + switch(ret) { + case EOK: + return true; + case ENOSYS: + fprintf(stderr, "Restarting SSSD automatically is not supported " + "on this platform, please restart the service " + "manually\n"); + return false; + default: fprintf(stderr, "Unable to restart SSSD!\n"); return false; } diff --git a/src/tools/sssctl/sssctl.h b/src/tools/sssctl/sssctl.h index 5c7b8380a3986eb85895bbb80c1ba00504764381..2aae2b6e9e41453dac07321bb6fb55bbc4d4e905 100644 --- a/src/tools/sssctl/sssctl.h +++ b/src/tools/sssctl/sssctl.h @@ -31,6 +31,12 @@ enum sssctl_prompt_result { SSSCTL_PROMPT_ERROR }; +enum sss_svc_acct { + SSS_SVC_START, + SSS_SVC_STOP, + SSS_SVC_RESTART, +}; + enum sssctl_prompt_result sssctl_prompt(const char *message, enum sssctl_prompt_result defval); -- 2.4.11