[SSSD] [PATCH] Retry system bus connection once messagebus is up

Jakub Hrozek jhrozek at redhat.com
Mon Jul 14 09:54:31 UTC 2014


On Tue, Jul 08, 2014 at 08:42:43PM +0200, Jakub Hrozek wrote:
> The 1.11 version will be sent out separately.

Here are the 1.11 patches. There are no functional differences, just
some minor rebasing.
-------------- next part --------------
>From 9a7d6addc4d735113f03fb508776d9e0e83ca828 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 24 Jun 2014 13:54:36 +0200
Subject: [PATCH 1/7] BUILD: dbusintrospectdir is not used anymore

We fprintf the introspection data on demand rather than printing an XML
file. The directory specification can be removed.
---
 Makefile.am | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 4fcbd52f3e5d68994167f4f063fefbb1dc250501..4da28f2929601bc7121da4e7f8af2236228a6d84 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -36,7 +36,6 @@ endif
 sssdconfdir = $(sysconfdir)/sssd
 sssddatadir = $(datadir)/sssd
 sssdapiplugindir = $(sssddatadir)/sssd.api.d
-dbusintrospectdir = $(datarootdir)/sssd/introspect
 dbuspolicydir = $(sysconfdir)/dbus-1/system.d
 localedir = @localedir@
 nsslibdir = @nsslibdir@
@@ -312,7 +311,6 @@ AM_CPPFLAGS = \
     -DVARDIR=\"$(localstatedir)\" \
     -DSHLIBEXT=\"$(SHLIBEXT)\" \
     -DSSSD_LIBEXEC_PATH=\"$(sssdlibexecdir)\" \
-    -DSSSD_INTROSPECT_PATH=\"$(dbusintrospectdir)\" \
     -DSSSD_CONF_DIR=\"$(sssdconfdir)\" \
     -DSSS_NSS_MCACHE_DIR=\"$(mcpath)\" \
     -DSSS_NSS_SOCKET_NAME=\"$(pipepath)/nss\" \
@@ -2245,7 +2243,6 @@ installsssddirs::
     $(DESTDIR)$(mandir) \
     $(DESTDIR)$(pluginpath) \
     $(DESTDIR)$(libdir)/ldb \
-    $(DESTDIR)$(dbusintrospectdir) \
     $(DESTDIR)$(dbuspolicydir) \
     $(DESTDIR)$(pipepath)/private \
     $(DESTDIR)$(sssdlibdir) \
-- 
1.9.3

-------------- next part --------------
>From a24899da1391ecc5e61e95daf63e4476b6b5525c Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 24 Jun 2014 14:24:42 +0200
Subject: [PATCH 2/7] IFP: Fix DEBUG messages

The DEBUG messages in the IFP responder predated Nikolai's mass-patches
and were not converted correctly.
---
 src/responder/ifp/ifpsrv.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index b221ced7047115fcf4439f85cc02793a3d01f274..35bcc910ed4f76d8456bb2f1c370e6dae55fa5d3 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -132,7 +132,8 @@ sysbus_init(TALLOC_CTX *mem_ctx,
     conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error);
     if (conn == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE,
-              ("Failed to connect to D-BUS system bus.\n"));
+              "Failed to connect to D-BUS system bus: [%s]\n",
+              dbus_error.message);
         ret = EIO;
         goto fail;
     }
@@ -145,7 +146,8 @@ sysbus_init(TALLOC_CTX *mem_ctx,
     if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
         /* We were unable to register on the system bus */
         DEBUG(SSSDBG_CRIT_FAILURE,
-              ("Unable to request name on the system bus.\n"));
+              "Unable to request name on the system bus: [%s]\n",
+              dbus_error.message);
         ret = EIO;
         goto fail;
     }
@@ -246,7 +248,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
                             CONFDB_IFP_CONF_ENTRY, CONFDB_SERVICE_ALLOWED_UIDS,
                             DEFAULT_ALLOWED_UIDS, &uid_str);
     if (ret != EOK) {
-        DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to get allowed UIDs.\n"));
+        DEBUG(SSSDBG_FATAL_FAILURE, "Failed to get allowed UIDs.\n");
         goto fail;
     }
 
@@ -255,7 +257,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
                                   &ifp_ctx->rctx->allowed_uids);
     talloc_free(uid_str);
     if (ret != EOK) {
-        DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to set allowed UIDs.\n"));
+        DEBUG(SSSDBG_FATAL_FAILURE, "Failed to set allowed UIDs.\n");
         goto fail;
     }
 
@@ -269,7 +271,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
 
     ret = sss_ncache_init(rctx, &ifp_ctx->ncache);
     if (ret != EOK) {
-        DEBUG(SSSDBG_CRIT_FAILURE, ("fatal error initializing negcache\n"));
+        DEBUG(SSSDBG_CRIT_FAILURE, "fatal error initializing negcache\n");
         goto fail;
     }
 
@@ -277,7 +279,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
                             CONFDB_IFP_CONF_ENTRY, CONFDB_IFP_USER_ATTR_LIST,
                             NULL, &attr_list_str);
     if (ret != EOK) {
-        DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to get allowed UIDs.\n"));
+        DEBUG(SSSDBG_FATAL_FAILURE, "Failed to get allowed UIDs.\n");
         goto fail;
     }
 
@@ -285,7 +287,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
     talloc_free(attr_list_str);
     if (ifp_ctx->user_whitelist == NULL) {
         DEBUG(SSSDBG_FATAL_FAILURE,
-              ("Failed to parse the allowed attribute list\n"));
+              "Failed to parse the allowed attribute list\n");
         goto fail;
     }
 
-- 
1.9.3

-------------- next part --------------
>From 1b9a90133656d88809d877902091fa2321167eff Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 24 Jun 2014 14:28:51 +0200
Subject: [PATCH 3/7] IFP: Return a specific value on failure connecting to the
 system bus

We need to treat the failure to connect to the system bus as non-fatal.
In this commit, we introduce a special error code and only print a DEBUG
message when this error code is returned from the startup function.
---
 src/responder/ifp/ifpsrv.c | 8 ++++++--
 src/util/util_errors.c     | 1 +
 src/util/util_errors.h     | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index 35bcc910ed4f76d8456bb2f1c370e6dae55fa5d3..0815d6cc0e0cff3b64fbff8af936594ef29493aa 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -134,7 +134,7 @@ sysbus_init(TALLOC_CTX *mem_ctx,
         DEBUG(SSSDBG_CRIT_FAILURE,
               "Failed to connect to D-BUS system bus: [%s]\n",
               dbus_error.message);
-        ret = EIO;
+        ret = ERR_NO_SYSBUS;
         goto fail;
     }
     dbus_connection_set_exit_on_disconnect(conn, FALSE);
@@ -313,7 +313,11 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
                       INFOPIPE_PATH,
                       &ifp_iface.vtable,
                       ifp_ctx, &ifp_ctx->sysbus);
-    if (ret != EOK) {
+    if (ret == ERR_NO_SYSBUS) {
+        DEBUG(SSSDBG_MINOR_FAILURE,
+              "The system bus is not available..\n");
+        /* Explicitly ignore, the D-Bus daemon will start us */
+    } else if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE,
               "Failed to connect to the system message bus\n");
         talloc_free(ifp_ctx);
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
index 90faa3e4217876a5174193f9e407bf87aef3bce2..0306be35d0b5fbf9ab69ce534522bb4f9a516794 100644
--- a/src/util/util_errors.c
+++ b/src/util/util_errors.c
@@ -58,6 +58,7 @@ struct err_string error_to_str[] = {
     { "Malformed extra attribute" }, /* ERR_INVALID_EXTRA_ATTR */
     { "Cannot get bus message sender" }, /* ERR_SBUS_GET_SENDER_ERROR */
     { "Bus message has no sender" }, /* ERR_SBUS_NO_SENDER */
+    { "Cannot connect to system bus" }, /* ERR_NO_SYSBUS */
 };
 
 
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
index 4d9f16c0aaea9128b8405048cb32a6d57850e1fc..7014092405b5a085f44c81b0d7c30f28cc70561c 100644
--- a/src/util/util_errors.h
+++ b/src/util/util_errors.h
@@ -80,6 +80,7 @@ enum sssd_errors {
     ERR_INVALID_EXTRA_ATTR,
     ERR_SBUS_GET_SENDER_ERROR,
     ERR_SBUS_NO_SENDER,
+    ERR_NO_SYSBUS,
     ERR_LAST            /* ALWAYS LAST */
 };
 
-- 
1.9.3

-------------- next part --------------
>From 998243a85105225e057a51af022e380ee342a056 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Wed, 25 Jun 2014 12:33:03 +0200
Subject: [PATCH 4/7] IFP: Provide a SBUS method to reconnect to sysbus

Introduces a new method implemented only by the IFP responder. When this
method is received, the responder attempts to reconnect to the system
bus, if not connected already.
---
 src/monitor/monitor_iface.xml         |  4 ++++
 src/monitor/monitor_iface_generated.c |  7 +++++++
 src/monitor/monitor_iface_generated.h |  2 ++
 src/providers/data_provider_be.c      |  1 +
 src/responder/autofs/autofssrv.c      |  1 +
 src/responder/ifp/ifpsrv.c            | 37 +++++++++++++++++++++++++++++++++++
 src/responder/nss/nsssrv.c            |  3 ++-
 src/responder/pac/pacsrv.c            |  1 +
 src/responder/pam/pamsrv.c            |  1 +
 src/responder/ssh/sshsrv.c            |  1 +
 src/responder/sudo/sudosrv.c          |  1 +
 11 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/src/monitor/monitor_iface.xml b/src/monitor/monitor_iface.xml
index 1f61de5b72f92cd335f6c05a9cdbdb315314c640..3d0e67f7147f4f824b6cb367564c756a21256a34 100644
--- a/src/monitor/monitor_iface.xml
+++ b/src/monitor/monitor_iface.xml
@@ -47,5 +47,9 @@
             <!-- no arguments, raw handler -->
             <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
         </method>
+        <method name="sysbusReconnect">
+            <!-- no arguments, raw handler -->
+            <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
+        </method>
     </interface>
 </node>
diff --git a/src/monitor/monitor_iface_generated.c b/src/monitor/monitor_iface_generated.c
index e9c3c1d52468ac6969498e79491a1d62dc75cc71..8856767973028d043716cd1722ee297ad535430b 100644
--- a/src/monitor/monitor_iface_generated.c
+++ b/src/monitor/monitor_iface_generated.c
@@ -90,6 +90,13 @@ const struct sbus_method_meta mon_cli_iface__methods[] = {
         offsetof(struct mon_cli_iface, clearEnumCache),
         NULL, /* no invoker */
     },
+    {
+        "sysbusReconnect", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, sysbusReconnect),
+        NULL, /* no invoker */
+    },
     { NULL, }
 };
 
diff --git a/src/monitor/monitor_iface_generated.h b/src/monitor/monitor_iface_generated.h
index 37e4d480b6be4433bc591b6e43195e9278fe3e04..f93f11731043898142cc05ff904a18cbeddc63fd 100644
--- a/src/monitor/monitor_iface_generated.h
+++ b/src/monitor/monitor_iface_generated.h
@@ -26,6 +26,7 @@
 #define MON_CLI_IFACE_ROTATELOGS "rotateLogs"
 #define MON_CLI_IFACE_CLEARMEMCACHE "clearMemcache"
 #define MON_CLI_IFACE_CLEARENUMCACHE "clearEnumCache"
+#define MON_CLI_IFACE_SYSBUSRECONNECT "sysbusReconnect"
 
 /* ------------------------------------------------------------------------
  * DBus handlers
@@ -63,6 +64,7 @@ struct mon_cli_iface {
     sbus_msg_handler_fn rotateLogs;
     sbus_msg_handler_fn clearMemcache;
     sbus_msg_handler_fn clearEnumCache;
+    sbus_msg_handler_fn sysbusReconnect;
 };
 
 /* ------------------------------------------------------------------------
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 240f60318c2c3b3fd10f1cf91f43071f37c38b6d..72cf20f80cb1182c98e7829aa2b9f83080d1675f 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -69,6 +69,7 @@ struct mon_cli_iface monitor_be_methods = {
     .rotateLogs = data_provider_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = NULL,
+    .sysbusReconnect = NULL,
 };
 
 static int client_registration(struct sbus_request *dbus_req, void *data);
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index 9b5aa02dd53772a569da71a79e600dfa2ba5f1ef..bd5aa135a3fb64a020e74a9dd39fa1b67dc76533 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -41,6 +41,7 @@ struct mon_cli_iface monitor_autofs_methods = {
     .rotateLogs = responder_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = autofs_clean_hash_table,
+    .sysbusReconnect = NULL,
 };
 
 static struct data_provider_iface autofs_dp_methods = {
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index 0815d6cc0e0cff3b64fbff8af936594ef29493aa..efd0d7480457b32d724fefe62c67190ce1ce1039 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -42,6 +42,8 @@
 
 #define DEFAULT_ALLOWED_UIDS "0"
 
+static int ifp_sysbus_reconnect(struct sbus_request *dbus_req, void *data);
+
 struct mon_cli_iface monitor_ifp_methods = {
     { &mon_cli_iface_meta, 0 },
     .ping = monitor_common_pong,
@@ -50,6 +52,7 @@ struct mon_cli_iface monitor_ifp_methods = {
     .goOffline = NULL,
     .resetOffline = NULL,
     .rotateLogs = responder_logrotate,
+    .sysbusReconnect = ifp_sysbus_reconnect,
 };
 
 static struct data_provider_iface ifp_dp_methods = {
@@ -197,6 +200,40 @@ fail:
     return ret;
 }
 
+static int ifp_sysbus_reconnect(struct sbus_request *dbus_req, void *data)
+{
+    struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
+    struct ifp_ctx *ifp_ctx = (struct ifp_ctx*) rctx->pvt_ctx;
+    errno_t ret;
+
+    DEBUG(SSSDBG_TRACE_FUNC, "Attempting to reconnect to the system bus\n");
+
+    if (ifp_ctx->sysbus) {
+        goto done;
+    }
+
+    /* Connect to the D-BUS system bus and set up methods */
+    ret = sysbus_init(ifp_ctx, ifp_ctx->rctx->ev,
+                      INFOPIPE_IFACE,
+                      INFOPIPE_PATH,
+                      &ifp_iface.vtable,
+                      ifp_ctx, &ifp_ctx->sysbus);
+    if (ret == ERR_NO_SYSBUS) {
+        DEBUG(SSSDBG_MINOR_FAILURE,
+              "The system bus is not available..\n");
+        goto done;
+    } else if (ret != EOK) {
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              "Failed to connect to the system message bus\n");
+        return ret;
+    }
+
+    DEBUG(SSSDBG_TRACE_LIBS, "Reconnected to the system bus!\n");
+
+done:
+    return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID);
+}
+
 int ifp_process_init(TALLOC_CTX *mem_ctx,
                      struct tevent_context *ev,
                      struct confdb_ctx *cdb)
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index d74558b621eb65b4bb6a4546685fc709a0a0e241..dba412a641a720d68bff997c0f0a70247c395233 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -67,7 +67,8 @@ struct mon_cli_iface monitor_nss_methods = {
     .resetOffline = NULL,
     .rotateLogs = responder_logrotate,
     .clearMemcache = nss_clear_memcache,
-    .clearEnumCache = nss_clear_netgroup_hash_table
+    .clearEnumCache = nss_clear_netgroup_hash_table,
+    .sysbusReconnect = NULL,
 };
 
 static int nss_clear_memcache(struct sbus_request *dbus_req, void *data)
diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c
index ed51cb86974308213c330c0a7a85699ad8b157ee..50c5ea4687bfc8713ab0f7198d97ccf3119f5c30 100644
--- a/src/responder/pac/pacsrv.c
+++ b/src/responder/pac/pacsrv.c
@@ -58,6 +58,7 @@ struct mon_cli_iface monitor_pac_methods = {
     .rotateLogs = responder_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = NULL,
+    .sysbusReconnect = NULL,
 };
 
 static struct data_provider_iface pac_dp_methods = {
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index 0fbb8d3f38c34900d6c6bebaeebee4c4688f45e2..445fc6f0eb72be58f31166fcae7d81ab91cad92d 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -57,6 +57,7 @@ struct mon_cli_iface monitor_pam_methods = {
     .rotateLogs = responder_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = NULL,
+    .sysbusReconnect = NULL,
 };
 
 static struct data_provider_iface pam_dp_methods = {
diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c
index 30142ae0d8f57f86c76dd85f25020b599d90bbdf..8aa603d79dddb327606f02d9e7ddf2b18a98e700 100644
--- a/src/responder/ssh/sshsrv.c
+++ b/src/responder/ssh/sshsrv.c
@@ -38,6 +38,7 @@ struct mon_cli_iface monitor_ssh_methods = {
     .rotateLogs = responder_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = NULL,
+    .sysbusReconnect = NULL,
 };
 
 static struct data_provider_iface ssh_dp_methods = {
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
index a70d944a9e06a3236c85aff56c06c39b6888dac0..cafe9da53f0f1833ff2b1abee0801f6197267342 100644
--- a/src/responder/sudo/sudosrv.c
+++ b/src/responder/sudo/sudosrv.c
@@ -38,6 +38,7 @@ struct mon_cli_iface monitor_sudo_methods = {
     .rotateLogs = responder_logrotate,
     .clearMemcache = NULL,
     .clearEnumCache = NULL,
+    .sysbusReconnect = NULL,
 };
 
 static struct data_provider_iface sudo_dp_methods = {
-- 
1.9.3

-------------- next part --------------
>From 489fb67c2cfc2103739556e0791ae5a63608d43f Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Wed, 25 Jun 2014 12:42:30 +0200
Subject: [PATCH 5/7] MONITOR: Signal InfoPipe to reconnect on SIGUSR2

When the monitor receives SIGUSR2, it also signals the IFP responder to
attempt to reconnect to the system bus using the sysbusReconnect SBUS
method. No action is taken by other responders.
---
 src/monitor/monitor.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 4c6ab517edc94c94ce6efbca82c1512a3e55c6a4..37155b9ef45cc217882d649cb6e2f3736f2e29f7 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -740,6 +740,10 @@ static int service_signal_clear_enum_cache(struct mt_svc *svc)
 {
     return service_signal(svc, MON_CLI_IFACE_CLEARENUMCACHE);
 }
+static int service_signal_sysbus_reconnect(struct mt_svc *svc)
+{
+    return service_signal(svc, MON_CLI_IFACE_SYSBUSRECONNECT);
+}
 
 static int check_domain_ranges(struct sss_domain_info *domains)
 {
@@ -1333,6 +1337,7 @@ static void monitor_hup(struct tevent_context *ev,
         if (!strcmp(SSS_AUTOFS_SBUS_SERVICE_NAME, cur_svc->name)) {
             service_signal_clear_enum_cache(cur_svc);
         }
+
     }
 
 }
@@ -1521,6 +1526,10 @@ static void signal_offline_reset(struct tevent_context *ev,
         if (cur_svc->provider) {
             service_signal_reset_offline(cur_svc);
         }
+
+        if (strcmp(SSS_IFP_SBUS_SERVICE_NAME, cur_svc->name) == 0) {
+            service_signal_sysbus_reconnect(cur_svc);
+        }
     }
     signal_res_init(monitor);
 }
-- 
1.9.3

-------------- next part --------------
>From 9f73110a498fc98fa644532f90b96b39cf9ef597 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Fri, 27 Jun 2014 17:24:16 +0200
Subject: [PATCH 6/7] TOOLS: New helper tool sss_signal

A minimal tool whose only purpose is to signal the monitor with
SIGUSR2. The tool will be executed by the system bus in order to provide
system activation, so it's packaged in libexec.
---
 Makefile.am            | 13 ++++++++++++-
 contrib/sssd.spec.in   |  1 +
 src/tools/sss_signal.c | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 src/tools/sss_signal.c

diff --git a/Makefile.am b/Makefile.am
index 4da28f2929601bc7121da4e7f8af2236228a6d84..a27f83de9dfef61fbc5c81187bdeec80295f8268 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -98,7 +98,9 @@ sssdlibexec_PROGRAMS = \
     sssd_be \
     krb5_child \
     ldap_child \
-    proxy_child
+    proxy_child \
+    sss_signal \
+    $(NULL)
 if BUILD_SUDO
 sssdlibexec_PROGRAMS += sssd_sudo
 endif
@@ -933,6 +935,15 @@ sss_seed_LDADD = \
     $(TOOLS_LIBS) \
     $(SSSD_INTERNAL_LTLIBS)
 
+sss_signal_SOURCES = \
+    src/tools/sss_signal.c \
+    $(SSSD_TOOLS_OBJ) \
+    $(NULL)
+sss_signal_LDADD = \
+    $(TOOLS_LIBS) \
+    $(SSSD_INTERNAL_LTLIBS) \
+    $(NULL)
+
 if BUILD_SUDO
 sss_sudo_cli_SOURCES = \
     src/sss_client/common.c \
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index 120704021e3763dd00e5c62d5805e39335736df9..fb06c807ce184d474147c8812d5fdaccdad33ccd 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -567,6 +567,7 @@ rm -rf $RPM_BUILD_ROOT
 %{_bindir}/sss_ssh_authorizedkeys
 %{_bindir}/sss_ssh_knownhostsproxy
 %{_sbindir}/sss_cache
+%{_libexecdir}/%{servicename}/sss_signal
 
 %dir %{sssdstatedir}
 %dir %{_localstatedir}/cache/krb5rcache
diff --git a/src/tools/sss_signal.c b/src/tools/sss_signal.c
new file mode 100644
index 0000000000000000000000000000000000000000..efddcce3d12bbe270f30ea15af8ab899f4b03dca
--- /dev/null
+++ b/src/tools/sss_signal.c
@@ -0,0 +1,37 @@
+/*
+    Authors:
+        Jakub Hrozek <jhrozek at redhat.com>
+
+    Copyright (C) 2014 Red Hat
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+
+#include "config.h"
+#include "tools/tools_util.h"
+
+int main(int argc, const char **argv)
+{
+    int ret;
+
+    ret = signal_sssd(SIGUSR2);
+    if (ret != EOK) {
+        ERROR("Could not signal SSSD. Is SSSD running?\n");
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
-- 
1.9.3

-------------- next part --------------
>From 6cbd995992a91efb947ee6b62e67e19b8804bb06 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 24 Jun 2014 17:03:28 +0200
Subject: [PATCH 7/7] BUILD: Add the DBus service activation

The system bus has the ability to start services on demant. This patch
adds the sysbus service activation file that, currently, only calls the
sss_signal tool to signal the monitor.
---
 Makefile.am                                                | 5 +++++
 configure.ac                                               | 1 +
 contrib/sssd.spec.in                                       | 1 +
 src/responder/ifp/org.freedesktop.sssd.infopipe.service.in | 4 ++++
 4 files changed, 11 insertions(+)
 create mode 100644 src/responder/ifp/org.freedesktop.sssd.infopipe.service.in

diff --git a/Makefile.am b/Makefile.am
index a27f83de9dfef61fbc5c81187bdeec80295f8268..cf0385d8db29bf3adb372d1bcfb05e53bf82b42f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -37,6 +37,7 @@ sssdconfdir = $(sysconfdir)/sssd
 sssddatadir = $(datadir)/sssd
 sssdapiplugindir = $(sssddatadir)/sssd.api.d
 dbuspolicydir = $(sysconfdir)/dbus-1/system.d
+dbusservicedir = $(datadir)/dbus-1/system-services
 localedir = @localedir@
 nsslibdir = @nsslibdir@
 pamlibdir = @pammoddir@
@@ -808,6 +809,9 @@ sssd_ifp_LDADD = \
     $(SSSD_INTERNAL_LTLIBS)
 dist_dbuspolicy_DATA = \
     src/responder/ifp/org.freedesktop.sssd.infopipe.conf
+dist_dbusservice_DATA = \
+    src/responder/ifp/org.freedesktop.sssd.infopipe.service
+
 endif
 
 sssd_be_SOURCES = \
@@ -2255,6 +2259,7 @@ installsssddirs::
     $(DESTDIR)$(pluginpath) \
     $(DESTDIR)$(libdir)/ldb \
     $(DESTDIR)$(dbuspolicydir) \
+    $(DESTDIR)$(dbusservicedir) \
     $(DESTDIR)$(pipepath)/private \
     $(DESTDIR)$(sssdlibdir) \
     $(DESTDIR)$(pkglibdir) \
diff --git a/configure.ac b/configure.ac
index 019a46edc726dc807f8f667e265c2659484a5c61..2acef71ad819aea456d99da18dddb2d4a225e71f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -309,5 +309,6 @@ AC_CONFIG_FILES([Makefile contrib/sssd.spec src/examples/rwtab src/doxy.config
                  src/sss_client/idmap/sss_nss_idmap.pc
                  src/sss_client/idmap/sss_nss_idmap.doxy
                  src/config/setup.py
+                 src/responder/ifp/org.freedesktop.sssd.infopipe.service
                  src/config/SSSDConfig/__init__.py])
 AC_OUTPUT
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index fb06c807ce184d474147c8812d5fdaccdad33ccd..4a3c402c35ddffaadaa6cff3b9ad2600bc6dd0f1 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -650,6 +650,7 @@ rm -rf $RPM_BUILD_ROOT
 %{_mandir}/man5/sssd-ifp.5*
 # InfoPipe DBus plumbing
 %{_sysconfdir}/dbus-1/system.d/org.freedesktop.sssd.infopipe.conf
+%{_datadir}/dbus-1/system-services/org.freedesktop.sssd.infopipe.service
 
 %files client -f sssd_client.lang
 %defattr(-,root,root,-)
diff --git a/src/responder/ifp/org.freedesktop.sssd.infopipe.service.in b/src/responder/ifp/org.freedesktop.sssd.infopipe.service.in
new file mode 100644
index 0000000000000000000000000000000000000000..78208661e3946c8c271c587c8ca5c48752bd109b
--- /dev/null
+++ b/src/responder/ifp/org.freedesktop.sssd.infopipe.service.in
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=org.freedesktop.sssd.infopipe
+Exec=@libexecdir@/sssd/sss_signal
+User=root
-- 
1.9.3



More information about the sssd-devel mailing list