diff options
author | Pavel Březina <pbrezina@redhat.com> | 2016-06-15 15:41:34 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2016-06-27 16:34:58 +0200 |
commit | d2d8f342cd5e90bb9fd947c448492225f959aa86 (patch) | |
tree | d641f74b47ab7ee90ed77bc064e658d2cab8ed3d | |
parent | aea1d5c0ca9bb1470759b024c8b97b6c1f577193 (diff) | |
download | sssd-d2d8f342cd5e90bb9fd947c448492225f959aa86.tar.gz sssd-d2d8f342cd5e90bb9fd947c448492225f959aa86.tar.xz sssd-d2d8f342cd5e90bb9fd947c448492225f959aa86.zip |
sss_tools: create confdb if not exist
So tools (especially sssctl) may be run even when databases where
removed.
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | src/confdb/confdb_setup.c | 80 | ||||
-rw-r--r-- | src/confdb/confdb_setup.h | 7 | ||||
-rw-r--r-- | src/monitor/monitor.c | 48 | ||||
-rw-r--r-- | src/tests/sysdb-tests.c | 1 | ||||
-rw-r--r-- | src/tests/sysdb_ssh-tests.c | 1 | ||||
-rw-r--r-- | src/tools/common/sss_tools.c | 9 |
7 files changed, 93 insertions, 58 deletions
diff --git a/Makefile.am b/Makefile.am index 3b2ebbb37..5a2672b1c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -492,6 +492,7 @@ SSSD_TOOLS_OBJ = \ src/tools/selinux.c \ src/tools/common/sss_tools.c \ src/tools/common/sss_process.c \ + src/confdb/confdb_setup.c \ src/util/nscd.c \ $(NULL) @@ -1202,7 +1203,9 @@ sssd_SOURCES = \ src/monitor/monitor_netlink.c \ src/confdb/confdb_setup.c \ src/monitor/monitor_iface_generated.c \ - $(SSSD_TOOLS_OBJ) \ + src/util/nscd.c \ + src/tools/files.c \ + src/tools/selinux.c \ $(NULL) sssd_LDADD = \ $(SSSD_LIBS) \ diff --git a/src/confdb/confdb_setup.c b/src/confdb/confdb_setup.c index dfdcae566..3443d68d3 100644 --- a/src/confdb/confdb_setup.c +++ b/src/confdb/confdb_setup.c @@ -31,7 +31,7 @@ #include "tools/tools_util.h" -int confdb_test(struct confdb_ctx *cdb) +static int confdb_test(struct confdb_ctx *cdb) { char **values; int ret; @@ -106,7 +106,7 @@ done: return ret; } -int confdb_create_base(struct confdb_ctx *cdb) +static int confdb_create_base(struct confdb_ctx *cdb) { int ret; struct ldb_ldif *ldif; @@ -127,7 +127,7 @@ int confdb_create_base(struct confdb_ctx *cdb) return EOK; } -int confdb_init_db(const char *config_file, struct confdb_ctx *cdb) +static int confdb_init_db(const char *config_file, struct confdb_ctx *cdb) { TALLOC_CTX *tmp_ctx; int ret; @@ -354,3 +354,77 @@ done: talloc_zfree(tmp_ctx); return ret; } + +errno_t confdb_setup(TALLOC_CTX *mem_ctx, + const char *cdb_file, + const char *config_file, + struct confdb_ctx **_cdb) +{ + TALLOC_CTX *tmp_ctx; + struct confdb_ctx *cdb; + errno_t ret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n"); + return ENOMEM; + } + + ret = confdb_init(tmp_ctx, &cdb, cdb_file); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "The confdb initialization failed " + "[%d]: %s\n", ret, sss_strerror(ret)); + goto done; + } + + /* Initialize the CDB from the configuration file */ + ret = confdb_test(cdb); + if (ret == ENOENT) { + /* First-time setup */ + + /* Purge any existing confdb in case an old + * misconfiguration gets in the way + */ + talloc_zfree(cdb); + ret = unlink(cdb_file); + if (ret != EOK && errno != ENOENT) { + ret = errno; + DEBUG(SSSDBG_MINOR_FAILURE, + "Purging existing confdb failed: %d [%s].\n", + ret, sss_strerror(ret)); + goto done; + } + + ret = confdb_init(tmp_ctx, &cdb, cdb_file); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "The confdb initialization failed " + "[%d]: %s\n", ret, sss_strerror(ret)); + } + + /* Load special entries */ + ret = confdb_create_base(cdb); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, + "Unable to load special entries into confdb\n"); + goto done; + } + } else if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "Fatal error initializing confdb\n"); + goto done; + } + + ret = confdb_init_db(config_file, cdb); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "ConfDB initialization has failed " + "[%d]: %s\n", ret, sss_strerror(ret)); + goto done; + } + + *_cdb = talloc_steal(mem_ctx, cdb); + + ret = EOK; + +done: + talloc_free(tmp_ctx); + return ret; +} diff --git a/src/confdb/confdb_setup.h b/src/confdb/confdb_setup.h index 2b8802f6f..197673d29 100644 --- a/src/confdb/confdb_setup.h +++ b/src/confdb/confdb_setup.h @@ -45,8 +45,9 @@ "version: "CONFDB_VERSION"\n" \ "\n" -int confdb_create_base(struct confdb_ctx *cdb); -int confdb_test(struct confdb_ctx *cdb); -int confdb_init_db(const char *config_file, struct confdb_ctx *cdb); +errno_t confdb_setup(TALLOC_CTX *mem_ctx, + const char *cdb_file, + const char *config_file, + struct confdb_ctx **_cdb); #endif /* CONFDB_SETUP_H_ */ diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 6b2cb55d6..3f7ae7a38 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -1892,52 +1892,10 @@ errno_t load_configuration(TALLOC_CTX *mem_ctx, goto done; } - ret = confdb_init(ctx, &ctx->cdb, cdb_file); + ret = confdb_setup(ctx, cdb_file, config_file, &ctx->cdb); if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE,"The confdb initialization failed\n"); - goto done; - } - - /* Initialize the CDB from the configuration file */ - ret = confdb_test(ctx->cdb); - if (ret == ENOENT) { - /* First-time setup */ - - /* Purge any existing confdb in case an old - * misconfiguration gets in the way - */ - talloc_zfree(ctx->cdb); - ret = unlink(cdb_file); - if (ret != EOK && errno != ENOENT) { - ret = errno; - DEBUG(SSSDBG_MINOR_FAILURE, - "Purging existing confdb failed: %d [%s].\n", - ret, sss_strerror(ret)); - goto done; - } - - ret = confdb_init(ctx, &ctx->cdb, cdb_file); - if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE,"The confdb initialization failed\n"); - goto done; - } - - /* Load special entries */ - ret = confdb_create_base(ctx->cdb); - if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE, - "Unable to load special entries into confdb\n"); - goto done; - } - } else if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE, "Fatal error initializing confdb\n"); - goto done; - } - - ret = confdb_init_db(config_file, ctx->cdb); - if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE, "ConfDB initialization has failed [%s]\n", - sss_strerror(ret)); + DEBUG(SSSDBG_FATAL_FAILURE, "Unable to setup ConfDB [%d]: %s\n", + ret, sss_strerror(ret)); goto done; } diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c index 3c3e30a64..05017e4c0 100644 --- a/src/tests/sysdb-tests.c +++ b/src/tests/sysdb-tests.c @@ -28,7 +28,6 @@ #include <sys/types.h> #include "util/util.h" #include "util/crypto/sss_crypto.h" -#include "confdb/confdb_setup.h" #include "db/sysdb_private.h" #include "db/sysdb_services.h" #include "db/sysdb_autofs.h" diff --git a/src/tests/sysdb_ssh-tests.c b/src/tests/sysdb_ssh-tests.c index bb93672e0..d23f4df31 100644 --- a/src/tests/sysdb_ssh-tests.c +++ b/src/tests/sysdb_ssh-tests.c @@ -29,7 +29,6 @@ #include "tests/common.h" #include "util/util.h" #include "confdb/confdb.h" -#include "confdb/confdb_setup.h" #include "db/sysdb.h" #include "db/sysdb_services.h" #include "db/sysdb_ssh.h" diff --git a/src/tools/common/sss_tools.c b/src/tools/common/sss_tools.c index d0d28cf0e..0323c3ce2 100644 --- a/src/tools/common/sss_tools.c +++ b/src/tools/common/sss_tools.c @@ -26,6 +26,7 @@ #include "config.h" #include "util/util.h" #include "confdb/confdb.h" +#include "confdb/confdb_setup.h" #include "db/sysdb.h" #include "tools/common/sss_tools.h" @@ -102,11 +103,11 @@ static errno_t sss_tool_confdb_init(TALLOC_CTX *mem_ctx, return ENOMEM; } - ret = confdb_init(mem_ctx, &confdb, path); + ret = confdb_setup(mem_ctx, path, SSSD_CONFIG_FILE, &confdb); + talloc_zfree(path); if (ret != EOK) { - DEBUG(SSSDBG_CRIT_FAILURE, - "Could not initialize connection to the confdb\n"); - talloc_free(path); + DEBUG(SSSDBG_FATAL_FAILURE, "Unable to setup ConfDB [%d]: %s\n", + ret, sss_strerror(ret)); return ret; } |