Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP3:Update
sssd.12196
0014-MONITOR-Create-pidfile-after-responders-st...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0014-MONITOR-Create-pidfile-after-responders-started.patch of Package sssd.12196
From 024815a42b4a25702b11f65afa9dbc81275f1dec Mon Sep 17 00:00:00 2001 From: Victor Tapia <victor.tapia@canonical.com> Date: Mon, 3 Oct 2016 17:36:08 +0200 Subject: [PATCH 1/2] MONITOR: Create pidfile after responders started MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: https://fedorahosted.org/sssd/ticket/3080 Signed-off-by: Lukas Slebodnik <lslebodn@redhat.com> Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> (cherry picked from commit d4063e9a21a4e203bee7e0a0144fa8cabb14cc46) (cherry picked from commit 12c36167aff5227d1b1f53988a748283dbb292d9) (cherry picked from commit 0f7df9c3c7e2fa177da7ec59a261ac3d2e1fbcda) --- Makefile.am | 1 + src/monitor/monitor.c | 43 +++++++++++++++++++++++++++++--- src/sysv/sssd.in | 15 +++++++++++ src/sysv/systemd/sssd.service.in | 8 +++--- 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/Makefile.am b/Makefile.am index a9a9b1988..2150ee32d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1097,6 +1097,7 @@ sssd_LDADD = \ $(INOTIFY_LIBS) \ $(LIBNL_LIBS) \ $(KEYUTILS_LIBS) \ + $(SYSTEMD_DAEMON_LIBS) \ $(SSSD_INTERNAL_LTLIBS) sssd_nss_SOURCES = \ diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 89ac882d3..46e3de3ed 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -55,6 +55,10 @@ #include <keyutils.h> #endif +#ifdef HAVE_SYSTEMD +#include <systemd/sd-daemon.h> +#endif + /* ping time cannot be less then once every few seconds or the * monitor will get crazy hammering children with messages */ #define MONITOR_DEF_PING_TIME 10 @@ -170,6 +174,7 @@ struct mt_ctx { struct netlink_ctx *nlctx; const char *conf_path; struct sss_sigchild_ctx *sigchld_ctx; + bool pid_file_created; bool is_daemon; pid_t parent_pid; @@ -431,7 +436,30 @@ static int mark_service_as_started(struct mt_svc *svc) ctx->started_services++; } - if (ctx->started_services == ctx->num_services) { + /* create the pid file if all services are alive */ + if (!ctx->pid_file_created && ctx->started_services == ctx->num_services) { + DEBUG(SSSDBG_TRACE_FUNC, + "All services have successfully started, creating pid file\n"); + ret = pidfile(PID_PATH, MONITOR_NAME); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, + "Error creating pidfile: %s/%s.pid! (%d [%s])\n", + PID_PATH, MONITOR_NAME, ret, strerror(ret)); + kill(getpid(), SIGTERM); + } + + ctx->pid_file_created = true; + +#ifdef HAVE_SYSTEMD + DEBUG(SSSDBG_TRACE_FUNC, "Sending startup notification to systemd\n"); + ret = sd_notify(0, "READY=1"); + if (ret < 0) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Error sending notification to systemd %d: %s\n", + -ret, strerror(-ret)); + } +#endif + /* Initialization is complete, terminate parent process if in daemon * mode. Make sure we send the signal to the right process */ if (ctx->is_daemon) { @@ -1698,6 +1726,7 @@ errno_t load_configuration(TALLOC_CTX *mem_ctx, return ENOMEM; } + ctx->pid_file_created = false; talloc_set_destructor((TALLOC_CTX *)ctx, monitor_ctx_destructor); cdb_file = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE); @@ -2949,9 +2978,6 @@ int main(int argc, const char *argv[]) return 6; } - /* we want a pid file check */ - flags |= FLAGS_PID_FILE; - /* Open before server_setup() does to have logging * during configuration checking */ if (debug_to_file) { @@ -3016,6 +3042,15 @@ int main(int argc, const char *argv[]) } } + /* Check if the SSSD is already running */ + ret = check_file(SSSD_PIDFILE, 0, 0, S_IFREG|0600, 0, NULL, false); + if (ret == EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, + "pidfile exists at %s\n", SSSD_PIDFILE); + ERROR("SSSD is already running\n"); + return 2; + } + /* Parse config file, fail if cannot be done */ ret = load_configuration(tmp_ctx, config_file, &monitor); if (ret != EOK) { diff --git a/src/sysv/sssd.in b/src/sysv/sssd.in index 5109148ac..385785e02 100644 --- a/src/sysv/sssd.in +++ b/src/sysv/sssd.in @@ -40,6 +40,8 @@ SSSD=@sbindir@/sssd LOCK_FILE=@localstatedir@/lock/subsys/sssd PID_FILE=@localstatedir@/run/sssd.pid +TIMEOUT=15 + start() { [ -x $SSSD ] || exit 5 echo -n $"Starting $prog: " @@ -47,6 +49,19 @@ start() { RETVAL=$? echo [ "$RETVAL" = 0 ] && touch $LOCK_FILE + + # Wait for pidfile creation or timeout + sec=0 + [ "$RETVAL" = 0 ] && while [ $sec -lt $TIMEOUT -a ! -f $PID_FILE ] + do + sleep 1 + sec=$(($sec+1)) + done + + if [ "$sec" = "$TIMEOUT" ]; then + RETVAL=-1 + fi + return $RETVAL } diff --git a/src/sysv/systemd/sssd.service.in b/src/sysv/systemd/sssd.service.in index a4f9125b5..05cfd3705 100644 --- a/src/sysv/systemd/sssd.service.in +++ b/src/sysv/systemd/sssd.service.in @@ -6,11 +6,9 @@ Wants=nss-user-lookup.target [Service] EnvironmentFile=-@environment_file@ -ExecStart=@sbindir@/sssd -D -f -# These two should be used with traditional UNIX forking daemons -# consult systemd.service(5) for more details -Type=forking -PIDFile=@localstatedir@/run/sssd.pid +ExecStart=@sbindir@/sssd -i -f +Type=notify +NotifyAccess=main [Install] WantedBy=multi-user.target -- 2.20.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor