From d2d8f342cd5e90bb9fd947c448492225f959aa86 Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Wed, 15 Jun 2016 15:41:34 +0200 Subject: sss_tools: create confdb if not exist So tools (especially sssctl) may be run even when databases where removed. Reviewed-by: Jakub Hrozek --- src/confdb/confdb_setup.c | 80 +++++++++++++++++++++++++++++++++++++++++++++-- src/confdb/confdb_setup.h | 7 +++-- 2 files changed, 81 insertions(+), 6 deletions(-) (limited to 'src/confdb') 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_ */ -- cgit