summaryrefslogtreecommitdiffstats
path: root/src/sssd/sssd_components.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sssd/sssd_components.c')
-rw-r--r--src/sssd/sssd_components.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/src/sssd/sssd_components.c b/src/sssd/sssd_components.c
new file mode 100644
index 0000000..0cee595
--- /dev/null
+++ b/src/sssd/sssd_components.c
@@ -0,0 +1,360 @@
+/*
+ Authors:
+ Pavel Březina <pbrezina@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 <stdint.h>
+#include <dbus/dbus.h>
+#include <sss_dbus.h>
+#include <konkret/konkret.h>
+#include "sssd_components.h"
+#include "utils.h"
+
+static sss_dbus_error
+sssd_component_find(sss_dbus_ctx *dbus_ctx,
+ const char *name,
+ sssd_component_type type,
+ char **_path)
+{
+ sss_dbus_error error;
+
+ switch (type) {
+ case SSSD_COMPONENT_MONITOR:
+ error = sss_dbus_invoke_find(dbus_ctx, SSSD_DBUS_FIND_MONITOR, _path,
+ DBUS_TYPE_INVALID);
+ break;
+ case SSSD_COMPONENT_RESPONDER:
+ error = sss_dbus_invoke_find(dbus_ctx, SSSD_DBUS_FIND_RESPONDER, _path,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_INVALID);
+ break;
+ case SSSD_COMPONENT_BACKEND:
+ error = sss_dbus_invoke_find(dbus_ctx, SSSD_DBUS_FIND_BACKEND, _path,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_INVALID);
+ break;
+ }
+
+ return error;
+}
+
+static sssd_method_error
+sssd_component_send_message(sss_dbus_ctx *dbus_ctx,
+ DBusMessage *message)
+{
+ sss_dbus_error error;
+
+ error = sss_dbus_send_message(dbus_ctx, message, NULL);
+ if (error == SSS_DBUS_IO_ERROR) {
+ if (strcmp(sss_dbus_get_last_io_error_name(dbus_ctx),
+ DBUS_ERROR_NOT_SUPPORTED) == 0) {
+ return SSSD_METHOD_ERROR_NOT_SUPPORTED;
+ }
+
+ return SSSD_METHOD_ERROR_IO;
+ } else if (error != SSS_DBUS_OK) {
+ return SSSD_METHOD_ERROR_FAILED;
+ }
+
+ return SSSD_METHOD_ERROR_OK;
+}
+
+static KUint32
+sssd_component_set_debug_level(const char *method,
+ const char *name,
+ sssd_component_type type,
+ const KUint16* debug_level,
+ CMPIStatus* _status)
+{
+ KUint32 result = KUINT32_INIT;
+ DBusMessage *msg = NULL;
+ sss_dbus_ctx *dbus_ctx = NULL;
+ sss_dbus_error error;
+ dbus_bool_t dbret;
+ sssd_method_error ret;
+ char *path = NULL;
+ uint32_t level;
+
+ KSetStatus(_status, OK);
+
+ error = sss_dbus_init(&dbus_ctx);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ error = sssd_component_find(dbus_ctx, name, type, &path);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ if (!debug_level->exists || debug_level->null) {
+ KSetStatus(_status, ERR_INVALID_PARAMETER);
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ level = debug_level->value;
+
+ msg = sss_dbus_create_message(path, SSS_DBUS_IFACE_COMPONENTS, method);
+ if (msg == NULL) {
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ dbret = dbus_message_append_args(msg, DBUS_TYPE_UINT32, &level,
+ DBUS_TYPE_INVALID);
+ if (!dbret) {
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ ret = sssd_component_send_message(dbus_ctx, msg);
+
+done:
+ if (msg != NULL) {
+ dbus_message_unref(msg);
+ }
+
+ sss_dbus_free_string(dbus_ctx, &path);
+ sss_dbus_free(&dbus_ctx);
+
+ KUint32_Set(&result, ret);
+ return result;
+}
+
+static KUint32
+sssd_component_set_state(const char *method,
+ const char *name,
+ sssd_component_type type,
+ CMPIStatus* _status)
+{
+ KUint32 result = KUINT32_INIT;
+ DBusMessage *msg = NULL;
+ sss_dbus_ctx *dbus_ctx = NULL;
+ sss_dbus_error error;
+ sssd_method_error ret;
+ char *path = NULL;
+
+ error = sss_dbus_init(&dbus_ctx);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ error = sssd_component_find(dbus_ctx, name, type, &path);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ msg = sss_dbus_create_message(path, SSS_DBUS_IFACE_COMPONENTS, method);
+ if (msg == NULL) {
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ ret = sssd_component_send_message(dbus_ctx, msg);
+
+done:
+ if (msg != NULL) {
+ dbus_message_unref(msg);
+ }
+
+ sss_dbus_free_string(dbus_ctx, &path);
+ sss_dbus_free(&dbus_ctx);
+
+ KSetStatus(_status, OK);
+ KUint32_Set(&result, ret);
+ return result;
+}
+
+KUint32
+sssd_component_set_debug_permanently(const char *name,
+ sssd_component_type type,
+ const KUint16* debug_level,
+ CMPIStatus* _status)
+{
+ return sssd_component_set_debug_level("ChangeDebugLevel",
+ name, type, debug_level, _status);
+}
+
+KUint32
+sssd_component_set_debug_temporarily(const char *name,
+ sssd_component_type type,
+ const KUint16* debug_level,
+ CMPIStatus* _status)
+{
+ return sssd_component_set_debug_level("ChangeDebugLevelTemporarily",
+ name, type, debug_level, _status);
+}
+
+KUint32 sssd_component_enable(const char *name,
+ sssd_component_type type,
+ CMPIStatus* _status)
+{
+ return sssd_component_set_state("Enable", name, type, _status);
+}
+
+KUint32 sssd_component_disable(const char *name,
+ sssd_component_type type,
+ CMPIStatus* _status)
+{
+ return sssd_component_set_state("Disable", name, type, _status);
+}
+
+struct sssd_component_attrs {
+ const char *name;
+ sss_dbus_bool enabled;
+ uint32_t debug;
+};
+
+static sssd_method_error
+sssd_component_get_attrs(sss_dbus_attr **attrs,
+ const char *path,
+ struct sssd_component_attrs *out)
+{
+ sss_dbus_error error;
+ sssd_method_error ret;
+
+ error = sss_dbus_find_attr_as_string(attrs, "name", &out->name);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_bool(attrs, "enabled", &out->enabled);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_uint32(attrs, "debug_level", &out->debug);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ return ret;
+}
+
+sssd_method_error
+sssd_monitor_set_instance(sss_dbus_ctx *dbus_ctx,
+ const char *path,
+ const CMPIBroker* cb,
+ const char *namespace,
+ LMI_SSSDMonitor *instance)
+{
+ sss_dbus_attr **attrs = NULL;
+ sss_dbus_error error;
+ struct sssd_component_attrs values;
+ sssd_method_error ret;
+
+ error = sss_dbus_fetch_all_attrs(dbus_ctx, path,
+ SSS_DBUS_IFACE_COMPONENTS, &attrs);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ ret = sssd_component_get_attrs(attrs, path, &values);
+ if (ret != SSSD_METHOD_ERROR_OK) {
+ goto done;
+ }
+
+ LMI_SSSDMonitor_Init(instance, cb, namespace);
+
+ /* CIM_ManagedElement */
+ LMI_SSSDMonitor_Set_Caption(instance, "SSSD Monitor Component");
+ LMI_SSSDMonitor_Set_Description(instance, "SSSD Monitor Component");
+ LMI_SSSDMonitor_Set_ElementName(instance, values.name);
+
+ /* LMI_SSSDMonitor */
+ LMI_SSSDMonitor_Set_Name(instance, values.name);
+ LMI_SSSDMonitor_Set_Type(instance, SSSD_COMPONENT_MONITOR);
+ LMI_SSSDMonitor_Set_IsEnabled(instance, values.enabled);
+ LMI_SSSDMonitor_Set_DebugLevel(instance, values.debug);
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ return ret;
+}
+
+sssd_method_error
+sssd_responder_set_instance(sss_dbus_ctx *dbus_ctx,
+ const char *path,
+ const CMPIBroker* cb,
+ const char *namespace,
+ LMI_SSSDResponder *instance)
+{
+ sss_dbus_attr **attrs = NULL;
+ sss_dbus_error error;
+ struct sssd_component_attrs values;
+ sssd_method_error ret;
+
+ error = sss_dbus_fetch_all_attrs(dbus_ctx, path,
+ SSS_DBUS_IFACE_COMPONENTS, &attrs);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ ret = sssd_component_get_attrs(attrs, path, &values);
+ if (ret != SSSD_METHOD_ERROR_OK) {
+ goto done;
+ }
+
+ LMI_SSSDResponder_Init(instance, cb, namespace);
+
+ /* CIM_ManagedElement */
+ LMI_SSSDResponder_Set_Caption(instance, "SSSD Responder Component");
+ LMI_SSSDResponder_Set_Description(instance, "SSSD Responder Component");
+ LMI_SSSDResponder_Set_ElementName(instance, values.name);
+
+ /* LMI_SSSDResponder */
+ LMI_SSSDResponder_Set_Name(instance, values.name);
+ LMI_SSSDResponder_Set_Type(instance, SSSD_COMPONENT_RESPONDER);
+ LMI_SSSDResponder_Set_IsEnabled(instance, values.enabled);
+ LMI_SSSDResponder_Set_DebugLevel(instance, values.debug);
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ return ret;
+}
+
+sssd_method_error
+sssd_backend_set_instance(sss_dbus_ctx *dbus_ctx,
+ const char *path,
+ const CMPIBroker* cb,
+ const char *namespace,
+ LMI_SSSDBackend *instance)
+{
+ sss_dbus_attr **attrs = NULL;
+ sss_dbus_error error;
+ struct sssd_component_attrs values;
+ sssd_method_error ret;
+
+ error = sss_dbus_fetch_all_attrs(dbus_ctx, path,
+ SSS_DBUS_IFACE_COMPONENTS, &attrs);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ ret = sssd_component_get_attrs(attrs, path, &values);
+ if (ret != SSSD_METHOD_ERROR_OK) {
+ goto done;
+ }
+
+ LMI_SSSDBackend_Init(instance, cb, namespace);
+
+ /* CIM_ManagedElement */
+ LMI_SSSDBackend_Set_Caption(instance, "SSSD Responder Component");
+ LMI_SSSDBackend_Set_Description(instance, "SSSD Responder Component");
+ LMI_SSSDBackend_Set_ElementName(instance, values.name);
+
+ /* LMI_SSSDBackend */
+ LMI_SSSDBackend_Set_Name(instance, values.name);
+ LMI_SSSDBackend_Set_Type(instance, SSSD_COMPONENT_RESPONDER);
+ LMI_SSSDBackend_Set_IsEnabled(instance, values.enabled);
+ LMI_SSSDBackend_Set_DebugLevel(instance, values.debug);
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ return ret;
+}