-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 04/22/2014 05:21 AM, Lukas Slebodnik wrote: > On (22/04/14 10:29), Pavel Březina wrote: >> Hi, I'm sending some patches that I'll use for OpenLMI provider. >> It supports few modifications of sssd.conf through augeas. >> >> For the moment, I think we should not bound to any particular API >> so even though I made it a separate object, I don't have any >> intentions to make it publicly usable library. >> >> This code will be used from D-Bus responder. I may extend the API >> if needed. >> >> Unit tests are attached. > >> From 29b998ed4b98b43a815023f32413442c01ecf92a Mon Sep 17 00:00:00 >> 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= >> <pbrez...@redhat.com> Date: Fri, 18 Apr 2014 17:23:16 +0200 >> Subject: [PATCH 1/3] sss_config: the code >> >> --- src/util/sss_config.c | 507 >> ++++++++++++++++++++++++++++++++++++++++++++++++++ >> src/util/sss_config.h | 71 +++++++ 2 files changed, 578 >> insertions(+) create mode 100644 src/util/sss_config.c create >> mode 100644 src/util/sss_config.h >> >> diff --git a/src/util/sss_config.c b/src/util/sss_config.c new >> file mode 100644 index >> 0000000000000000000000000000000000000000..6a6216da1b90adc2628cbdae692228121162fb3e >> >> - --- /dev/null >> +++ b/src/util/sss_config.c @@ -0,0 +1,507 @@ +/* + Authors: + >> Pavel Březina <pbrez...@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 <augeas.h> >> +#include <talloc.h> +#include <string.h> +#include >> "util/sss_config.h" + +#define PATH_SECTION "/files/%s/target[. = >> \"%s\"]" +#define PATH_OPTION PATH_SECTION "/%s" + +#define >> build_section_path(mem_ctx, config_ctx, section) \ + >> talloc_asprintf(mem_ctx, PATH_SECTION, config_ctx->file, >> section) + +#define build_option_path(mem_ctx, config_ctx, >> section, option) \ + talloc_asprintf(mem_ctx, PATH_OPTION, >> config_ctx->file, section, option) + +struct sss_config_ctx +{ + >> augeas *auges_ctx; + const char *file; +}; + +static errno_t >> +sss_config_set_option(struct sss_config_ctx *ctx, + >> const char *section, + const char *option, + >> const char *value) +{ + TALLOC_CTX *tmp_ctx = NULL; + char >> *target_path = NULL; + char *option_path = NULL; + errno_t >> ret; + int aug_ret; + + tmp_ctx = talloc_new(NULL); + if >> (tmp_ctx == NULL) { + return ENOMEM; + } + + >> target_path = build_section_path(tmp_ctx, ctx, section); + if >> (target_path == NULL) { + ret = ENOMEM; + goto >> done; + } + + option_path = build_option_path(tmp_ctx, ctx, >> section, option); + if (option_path == NULL) { + ret = >> ENOMEM; + goto done; + } + + /* Set configuration >> option: + * + * # make sure the section exists + * >> set /files/$file/target[. = "$section"] $section + * + * >> # set value + * set /files/$file/target[. = >> "$section"]/$option $value + */ + + aug_ret = >> aug_set(ctx->auges_ctx, target_path, section); + if (aug_ret >> != 0) { + ret = EIO; + goto done; + } + + >> aug_ret = aug_set(ctx->auges_ctx, option_path, value); + if >> (aug_ret != 0) { + ret = EIO; + goto done; + } >> + + ret = EOK; + +done: + talloc_free(tmp_ctx); + return >> ret; +} + +static errno_t +sss_config_rm_option(struct >> sss_config_ctx *ctx, + const char *section, >> + const char *option) +{ + TALLOC_CTX >> *tmp_ctx = NULL; + char *option_path = NULL; + errno_t >> ret; + int aug_ret; + + tmp_ctx = talloc_new(NULL); + if >> (tmp_ctx == NULL) { + return ENOMEM; + } + + >> option_path = build_option_path(tmp_ctx, ctx, section, option); + >> if (option_path == NULL) { + ret = ENOMEM; + goto >> done; + } + + /* Remove configuration option: + * + >> * rm /files/$file/target[. = "$section"]/$option + */ + + >> aug_ret = aug_rm(ctx->auges_ctx, option_path); + if (aug_ret >> != 1) { + ret = EIO; + goto done; + } + + ret >> = EOK; + +done: + talloc_free(tmp_ctx); + return ret; +} + >> +static errno_t +sss_config_set_list(struct sss_config_ctx *ctx, >> + const char *section, + >> const char *option, + char **list) +{ + >> TALLOC_CTX *tmp_ctx = NULL; + char *value = NULL; + errno_t >> ret; + int i; + + if (list == NULL) { + return EOK; >> + } + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == >> NULL) { + return ENOMEM; + } + + if (list[0] == >> NULL) { + ret = sss_config_rm_option(ctx, section, >> option); + goto done; + } + + value = >> talloc_strdup(tmp_ctx, list[0]); + if (value == NULL) { + >> ret = ENOMEM; + goto done; + } + + for (i = 1; >> list[i] != NULL; i++) { + value = >> talloc_asprintf_append(value, ", %s", list[i]); + if >> (value == NULL) { + ret = ENOMEM; + goto >> done; + } + } + + ret = sss_config_set_option(ctx, >> section, option, value); + +done: + talloc_free(tmp_ctx); + >> return ret; +} + +static errno_t +sss_config_get_list(TALLOC_CTX >> *mem_ctx, + struct sss_config_ctx *ctx, + >> const char *section, + const char *option, + >> char ***_list) +{ + TALLOC_CTX *tmp_ctx = NULL; + char >> *option_path = NULL; + const char *value = NULL; + char >> **list = NULL; + errno_t ret; + int aug_ret; + + tmp_ctx >> = talloc_new(NULL); + if (tmp_ctx == NULL) { + return >> ENOMEM; + } + + option_path = build_option_path(tmp_ctx, >> ctx, section, option); + if (option_path == NULL) { > ret = EINVAL??? > > src/util/sss_config.c:203:9: error: variable 'ret' is used > uninitialized whenever 'if' condition is true > [-Werror,-Wsometimes-uninitialized] if (option_path == NULL) { > ^~~~~~~~~~~~~~~~~~~ src/util/sss_config.c:233:12: note: > uninitialized use occurs here return ret; ^~~ >> + goto done; + } + + aug_ret = >> aug_get(ctx->auges_ctx, option_path, &value); + if (aug_ret == >> 0 || (aug_ret == 1 && (value == NULL || *value == '\0'))) { + >> /* option is not present, return empty list */ + list = >> talloc_zero_array(tmp_ctx, char*, 1); + if (list == NULL) >> { + ret = ENOMEM; + } + + ret = EOK; + >> goto done; + } else if (aug_ret != 1) { + /* error: >> more than one value found */ + ret = EINVAL; + goto >> done; + } + + ret = split_on_separator(tmp_ctx, value, ',', >> true, true, &list, NULL); + if (ret != EOK) { + goto >> done; + } + + *_list = talloc_steal(mem_ctx, list); + >> ret = EOK; + +done: + talloc_free(tmp_ctx); + return ret; >> +} + +static errno_t +sss_config_is_in_list(struct sss_config_ctx >> *ctx, + const char *section, + >> const char *option, + const char *value, + >> bool *_result) +{ + char **list = NULL; + errno_t ret; + + >> ret = sss_config_get_list(ctx, ctx, section, option, &list); + >> if (ret != EOK) { + goto done; + } + + *_result = >> string_in_list(value, list, true); + +done: + >> talloc_free(list); + return ret; +} + +static errno_t >> +sss_config_add_to_list(struct sss_config_ctx *ctx, + >> const char *section, + const char *option, >> + const char *value) +{ + TALLOC_CTX >> *tmp_ctx = NULL; + char **list = NULL; + errno_t ret; + >> bool result = false; + + tmp_ctx = talloc_new(NULL); + if >> (tmp_ctx == NULL) { + return ENOMEM; + } + + ret = >> sss_config_get_list(tmp_ctx, ctx, section, option, &list); + >> if (ret != EOK) { + goto done; + } + + result = >> string_in_list(value, list, true); + if (result == true) { + >> ret = EOK; + goto done; + } + + ret = >> add_string_to_list(tmp_ctx, value, &list); + if (ret != EOK) >> { + goto done; + } + + ret = >> sss_config_set_list(ctx, section, option, list); + +done: + >> talloc_free(tmp_ctx); + return ret; +} + +static errno_t >> +sss_config_del_from_list(struct sss_config_ctx *ctx, + >> const char *section, + const char >> *option, + const char *value) +{ + >> TALLOC_CTX *tmp_ctx = NULL; + char **list = NULL; + errno_t >> ret; + bool found; + int i; + + tmp_ctx = >> talloc_new(NULL); + if (tmp_ctx == NULL) { + return >> ENOMEM; + } + + ret = sss_config_get_list(tmp_ctx, ctx, >> section, option, &list); + if (ret != EOK) { + goto >> done; + } + + if (list == NULL) { + goto done; + >> } + + found = false; + for (i = 0; list[i] != NULL; i++) { >> + if (strcmp(list[i], value) == 0) { + found = >> true; + } + + if (found) { + list[i] = >> list[i + 1]; + } + } + + ret = >> sss_config_set_list(ctx, section, option, list); + +done: + >> talloc_free(tmp_ctx); + return ret; +} + +static int >> sss_config_ctx_destructor(struct sss_config_ctx *ctx) +{ + if >> (ctx->auges_ctx != NULL) { + aug_close(ctx->auges_ctx); + >> ctx->auges_ctx = NULL; + } + + return 0; +} + +struct >> sss_config_ctx * +sss_config_open(TALLOC_CTX *mem_ctx, + >> const char *root, + const char *file) +{ + >> struct sss_config_ctx *ctx = NULL; + errno_t ret; + int >> aug_ret; + + ctx = talloc_zero(mem_ctx, struct >> sss_config_ctx); + if (ctx == NULL) { + return NULL; + >> } + + talloc_set_destructor(ctx, sss_config_ctx_destructor); >> + + ctx->auges_ctx = aug_init(root, NULL, AUG_NO_LOAD | >> AUG_NO_MODL_AUTOLOAD + | >> AUG_SAVE_BACKUP); + if (ctx->auges_ctx == NULL) { + ret >> = ENOMEM; + goto done; + } + + ctx->file = >> talloc_strdup(ctx, file); + if (ctx->file == NULL) { + >> ret = ENOMEM; + goto done; + } + + /* Load >> configuration file + * + * set /augeas/load/sssd/lens >> sssd.lns + * set /augeas/load/sssd/incl $file + * load + >> */ + + aug_ret = aug_set(ctx->auges_ctx, >> "/augeas/load/sssd/lens", "sssd.lns"); + if (aug_ret != 0) { + >> ret = EIO; + goto done; + } + + aug_ret = >> aug_set(ctx->auges_ctx, "/augeas/load/sssd/incl", ctx->file); + >> if (aug_ret != 0) { + ret = EIO; + goto done; + >> } + + aug_ret = aug_load(ctx->auges_ctx); + if (aug_ret != >> 0) { + ret = EIO; + goto done; + } + + ret = >> EOK; + +done: + if (ret != EOK) { + talloc_free(ctx); + >> } + + return ctx; +} + +errno_t +sss_config_save(struct >> sss_config_ctx *ctx) +{ + int aug_ret; + + aug_ret = >> aug_save(ctx->auges_ctx); + if (aug_ret != 0) { + >> return EIO; + } + + return EOK; +} + +void >> +sss_config_close(struct sss_config_ctx **_ctx) +{ + if (_ctx >> == NULL || *_ctx == NULL) { + return; + } + + >> talloc_free(*_ctx); + *_ctx = NULL; +} + +errno_t >> +sss_config_set_debug_level(struct sss_config_ctx *ctx, + >> const char *section, + uint32_t level) >> +{ + char *level_str = NULL; + errno_t ret; + + >> level_str = talloc_asprintf(ctx, "%#.4x", level); + if >> (level_str == NULL) { + return ENOMEM; + } + + ret = >> sss_config_set_option(ctx, section, CONFDB_SERVICE_DEBUG_LEVEL, + >> level_str); + + talloc_free(level_str); + return ret; +} + >> +errno_t +sss_config_service_is_enabled(struct sss_config_ctx >> *ctx, + const char *service, + >> bool *_result) +{ + return sss_config_is_in_list(ctx, "sssd", >> CONFDB_MONITOR_ACTIVE_SERVICES, + >> service, _result); +} + +errno_t >> +sss_config_service_enable(struct sss_config_ctx *ctx, + >> const char *service) +{ + return sss_config_add_to_list(ctx, >> "sssd", CONFDB_MONITOR_ACTIVE_SERVICES, + >> service); +} + +errno_t +sss_config_service_disable(struct >> sss_config_ctx *ctx, + const char >> *service) +{ + return sss_config_del_from_list(ctx, "sssd", >> CONFDB_MONITOR_ACTIVE_SERVICES, + >> service); +} + +errno_t +sss_config_domain_is_enabled(struct >> sss_config_ctx *ctx, + const char >> *domain, + bool *_result) +{ + >> return sss_config_is_in_list(ctx, "sssd", >> CONFDB_MONITOR_ACTIVE_DOMAINS, + >> domain, _result); +} + +errno_t +sss_config_domain_enable(struct >> sss_config_ctx *ctx, + const char >> *domain) +{ + return sss_config_add_to_list(ctx, "sssd", >> CONFDB_MONITOR_ACTIVE_DOMAINS, + >> domain); +} + +errno_t +sss_config_domain_disable(struct >> sss_config_ctx *ctx, + const char >> *domain) +{ + return sss_config_del_from_list(ctx, "sssd", >> CONFDB_MONITOR_ACTIVE_DOMAINS, + >> domain); +} diff --git a/src/util/sss_config.h >> b/src/util/sss_config.h new file mode 100644 index >> 0000000000000000000000000000000000000000..b59f5fcf0e23e7a6c8543346c52fa06ae6041a3d >> >> - --- /dev/null >> +++ b/src/util/sss_config.h @@ -0,0 +1,71 @@ +/* + Authors: + >> Pavel Březina <pbrez...@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/>. +*/ + +#ifndef SSS_CONFIG_H_ >> +#define SSS_CONFIG_H_ + +#include <talloc.h> +#include >> "util/util.h" + +struct sss_config_ctx; + +struct sss_config_ctx >> * +sss_config_open(TALLOC_CTX *mem_ctx, + const >> char *root, + const char *file); + +errno_t >> +sss_config_save(struct sss_config_ctx *ctx); + +void >> +sss_config_close(struct sss_config_ctx **_ctx); + +errno_t >> +sss_config_set_debug_level(struct sss_config_ctx *ctx, + >> const char *section, + uint32_t >> level); + +errno_t +sss_config_service_is_enabled(struct >> sss_config_ctx *ctx, + const char >> *service, + bool *_result); + >> +errno_t +sss_config_service_enable(struct sss_config_ctx *ctx, + >> const char *service); + +errno_t >> +sss_config_service_disable(struct sss_config_ctx *ctx, + >> const char *service); + +errno_t >> +sss_config_domain_is_enabled(struct sss_config_ctx *ctx, + >> const char *domain, + bool >> *_result); + +errno_t +sss_config_domain_enable(struct >> sss_config_ctx *ctx, + const char >> *domain); + +errno_t +sss_config_domain_disable(struct >> sss_config_ctx *ctx, + const char >> *domain); + +#endif /* SSS_CONFIG_H_ */ -- 1.7.11.7 >> > >> From 38a199b55608cf42ff3879a9aaa168ef619a42d1 Mon Sep 17 00:00:00 >> 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= >> <pbrez...@redhat.com> Date: Mon, 21 Apr 2014 12:17:53 +0200 >> Subject: [PATCH 2/3] sss_config: build >> >> --- Makefile.am | 12 ++++++++++++ configure.ac >> | 1 + src/external/libaugeas.m4 | 10 ++++++++++ 3 files changed, >> 23 insertions(+) create mode 100644 src/external/libaugeas.m4 >> >> diff --git a/Makefile.am b/Makefile.am index >> 0ce377a03f0b606f18b4e1524de375744096eb09..58b4159b0d1a47ef98a2b88dd751f75f5dc54e18 >> 100644 --- a/Makefile.am +++ b/Makefile.am @@ -435,6 +435,7 @@ >> dist_noinst_HEADERS = \ src/util/sss_ssh.h \ src/util/sss_ini.h >> \ src/util/sss_format.h \ + src/util/sss_config.h \ >> src/util/refcount.h \ src/util/find_uid.h \ >> src/util/user_info_msg.h \ @@ -577,6 +578,17 @@ >> pkglib_LTLIBRARIES += libsss_child.la libsss_child_la_SOURCES = >> src/util/child_common.c libsss_child_la_LDFLAGS = -avoid-version >> > ^^^^ trailing spaces. > > sh$ git am ~/000* Applying: sss_config: the code Applying: > sss_config: build /dev/shm/sssd/.git/rebase-apply/patch:65: new > blank line at EOF. + warning: 1 line adds whitespace errors. > Applying: sss_config: unit tests > /dev/shm/sssd/.git/rebase-apply/patch:25: trailing whitespace. > > warning: 1 line adds whitespace errors. > >> +pkglib_LTLIBRARIES += libsss_config.la > ^^^^^^ libsss_config.so will be installed in private directory > /usr/lib64/sssd If augeas opens this library with dlopen it should > be installed in different directory. > >> +libsss_config_la_SOURCES = \ + src/util/sss_config.c >> +libsss_config_la_CFLAGS = \ + $(AM_CFLAGS) \ > ^^^^ '\t' instead of spaces. > >> + $(AUGEAS_CFLAGS) +libsss_config_la_LIBADD = \ + >> $(AUGEAS_LIBS) > > ./.libs/libsss_config.so: undefined reference to `string_in_list' > ./.libs/libsss_config.so: undefined reference to > `split_on_separator' ./.libs/libsss_config.so: undefined reference > to `add_string_to_list' > > add $(SSSD_INTERNAL_LTLIBS) to LIBADD > >> +libsss_config_la_LDFLAGS = \ + -avoid-version + >> pkglib_LTLIBRARIES += libsss_util.la libsss_util_la_SOURCES = \ >> src/confdb/confdb.c \ diff --git a/configure.ac b/configure.ac >> index >> 41fa6496553336c73338459eaff639f10fde74f1..11bb0874bdf913070fc2f7509523a3f0b3982c42 >> 100644 --- a/configure.ac +++ b/configure.ac @@ -129,6 +129,7 @@ >> WITH_CRYPTO WITH_SYSLOG >> >> m4_include([src/external/pkg.m4]) >> +m4_include([src/external/libaugeas.m4]) >> m4_include([src/external/libpopt.m4]) >> m4_include([src/external/libtalloc.m4]) >> m4_include([src/external/libtdb.m4]) diff --git >> a/src/external/libaugeas.m4 b/src/external/libaugeas.m4 new file >> mode 100644 index >> 0000000000000000000000000000000000000000..813d1067804f45b2b6f593f3bb2c3bc32112bb24 >> >> - --- /dev/null >> +++ b/src/external/libaugeas.m4 @@ -0,0 +1,10 @@ >> +AC_SUBST(AUGEAS_OBJ) +AC_SUBST(AUGEAS_CFLAGS) >> +AC_SUBST(AUGEAS_LIBS) + +PKG_CHECK_MODULES(AUGEAS, + augeas >> >= 1.0.0, + , + AC_MSG_ERROR("Please install >> augeas-devel") + ) + -- 1.7.11.7 >> > You added new build time dependency, but spec file was not change.
The spec file needs the new BuildRequires and also the new %files for the internal shared library. We also need to ask ourselves whether we need to make this library multiarch. > > Could be this optional dependency like a cifs-idmap-plugin? > src/external/cifsidmap.m4 > > You created new dynamic library(module) but it was not added into > dlopen tests. > > LS _______________________________________________ sssd-devel > mailing list sssd-devel@lists.fedorahosted.org > https://lists.fedorahosted.org/mailman/listinfo/sssd-devel > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iEYEARECAAYFAlNWZ80ACgkQeiVVYja6o6PKjgCgj62nAm6fnOIFv8pN5XOFlXT6 uMIAnju9WAhGHBHTAN3FNJoxkxL6daIV =bwtM -----END PGP SIGNATURE----- _______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/sssd-devel