>From 254399d4941b67e4caa433209248b021f75e7c5e Mon Sep 17 00:00:00 2001 From: Jakub Hrozek 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 | 36 +++++++++++++++++++++++++++++++++++ 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, 57 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 @@ + + + + diff --git a/src/monitor/monitor_iface_generated.c b/src/monitor/monitor_iface_generated.c index ee59242c1bc3b7b30fb5e086a142aedd6be71319..0eee10caefdf137e442e7c658436813d01025035 100644 --- a/src/monitor/monitor_iface_generated.c +++ b/src/monitor/monitor_iface_generated.c @@ -117,6 +117,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 1982b93153637dfbe311c438230f3aa07466c289..dbd48b20d5e730df87884c325d312e95d3061de4 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 9014c3e8565d9f591e0805b2792c13c9ed6790ad..de2212744e3cf6eda156edc6c8499c2ccbd200a6 100644 --- a/src/responder/ifp/ifpsrv.c +++ b/src/responder/ifp/ifpsrv.c @@ -44,6 +44,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, @@ -52,6 +54,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 = { @@ -257,6 +260,39 @@ 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) { + DEBUG(SSSDBG_TRACE_LIBS, "Already connected to sysbus\n"); + goto done; + } + + /* Connect to the D-BUS system bus and set up methods */ + ret = sysbus_init(ifp_ctx, ifp_ctx->rctx->ev, + INFOPIPE_IFACE, + ifp_ifaces, + 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 1f762cca83083c911e2619263c7d89e267a34d61..84a6b7fedd096a7d4159b7ac6670820c1d8fd941 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 bff15058a2092677441812c73117387afd125600..47a9d1a68fbf1615277af41cef297b4955e7f7c3 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 2823f01a0c15c5c468c5b1177c1c3b2844c25e4c..c0841d2bdbe1a5aa6c5f35ef77c441c5d6103fb1 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