summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2016-11-02 17:18:07 +0100
committerJakub Hrozek <jhrozek@redhat.com>2017-02-15 14:51:11 +0100
commitb3ee4be9e1794fa823696d70d4958f3b0269939c (patch)
tree861def55882be1f8edbdc53b10374c0565116178
parent205a0b9e9234327730fa808be95b2e1db7ffee95 (diff)
downloadsssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.tar.gz
sssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.tar.xz
sssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.zip
DP: Add internal DP interface to set domain state
Adds functions to the interface Data Provider publishes towards back ends that allows the back ends to notify responders that a domain has been enabled or disabled. Reviewed-by: Pavel Březina <pbrezina@redhat.com>
-rw-r--r--Makefile.am1
-rw-r--r--src/providers/data_provider/dp.h5
-rw-r--r--src/providers/data_provider/dp_resp_client.c93
3 files changed, 99 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index aa28a27f9..5cf496002 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1464,6 +1464,7 @@ sssd_be_SOURCES = \
src/providers/data_provider/dp_iface_backend.c \
src/providers/data_provider/dp_iface_failover.c \
src/providers/data_provider/dp_client.c \
+ src/providers/data_provider/dp_resp_client.c \
src/providers/data_provider/dp_iface_generated.c \
src/providers/data_provider/dp_request.c \
src/providers/data_provider/dp_request_reply.c \
diff --git a/src/providers/data_provider/dp.h b/src/providers/data_provider/dp.h
index 5b36baf34..68db75521 100644
--- a/src/providers/data_provider/dp.h
+++ b/src/providers/data_provider/dp.h
@@ -161,4 +161,9 @@ bool dp_method_enabled(struct data_provider *provider,
void dp_terminate_domain_requests(struct data_provider *provider,
const char *domain);
+void dp_sbus_domain_active(struct data_provider *provider,
+ struct sss_domain_info *dom);
+void dp_sbus_domain_inconsistent(struct data_provider *provider,
+ struct sss_domain_info *dom);
+
#endif /* _DP_H_ */
diff --git a/src/providers/data_provider/dp_resp_client.c b/src/providers/data_provider/dp_resp_client.c
new file mode 100644
index 000000000..3d386eac1
--- /dev/null
+++ b/src/providers/data_provider/dp_resp_client.c
@@ -0,0 +1,93 @@
+/*
+ SSSD
+
+ Data Provider Responder client - DP calls responder interface
+
+ 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 "config.h"
+#include <talloc.h>
+#include <tevent.h>
+
+#include "confdb/confdb.h"
+#include "sbus/sssd_dbus.h"
+#include "providers/data_provider.h"
+#include "providers/data_provider/dp_private.h"
+#include "responder/common/iface/responder_iface.h"
+#include "src/responder/nss/nss_iface.h"
+
+static void send_msg_to_all_clients(struct data_provider *provider,
+ struct DBusMessage *msg)
+{
+ struct dp_client *cli;
+ int i;
+
+ for (i = 0; provider->clients[i] != NULL; i++) {
+ cli = provider->clients[i];
+ if (cli != NULL) {
+ sbus_conn_send_reply(dp_client_conn(cli), msg);
+ }
+ }
+}
+
+static void dp_sbus_set_domain_state(struct data_provider *provider,
+ struct sss_domain_info *dom,
+ enum sss_domain_state state)
+{
+ DBusMessage *msg;
+ const char *method = NULL;
+
+ switch (state) {
+ case DOM_ACTIVE:
+ DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to enable domain %s\n",
+ dom->name);
+ method = IFACE_RESPONDER_DOMAIN_SETACTIVE;
+ break;
+ case DOM_INCONSISTENT:
+ DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to disable domain %s\n",
+ dom->name);
+ method = IFACE_RESPONDER_DOMAIN_SETINCONSISTENT;
+ break;
+ default:
+ /* No other methods provided at the moment */
+ return;
+ }
+
+ sss_domain_set_state(dom, state);
+
+ msg = sbus_create_message(NULL, NULL, RESPONDER_PATH,
+ IFACE_RESPONDER_DOMAIN, method,
+ DBUS_TYPE_STRING, &dom->name);
+ if (msg == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
+ return;
+ }
+
+ send_msg_to_all_clients(provider, msg);
+ dbus_message_unref(msg);
+ return;
+}
+
+void dp_sbus_domain_active(struct data_provider *provider,
+ struct sss_domain_info *dom)
+{
+ return dp_sbus_set_domain_state(provider, dom, DOM_ACTIVE);
+}
+
+void dp_sbus_domain_inconsistent(struct data_provider *provider,
+ struct sss_domain_info *dom)
+{
+ return dp_sbus_set_domain_state(provider, dom, DOM_INCONSISTENT);
+}