diff options
| author | Jakub Hrozek <jhrozek@redhat.com> | 2017-02-23 12:02:06 +0100 |
|---|---|---|
| committer | Lukas Slebodnik <lslebodn@redhat.com> | 2017-02-28 10:36:55 +0100 |
| commit | 5a660d3aa67403fba69a8047ecedfe8a4276fc30 (patch) | |
| tree | 760e14c8512cae327ba95c04308644801b294d28 /src | |
| parent | 13294bedc56faf1011f5ba7b1ed9a53b08e71c00 (diff) | |
CONFDB: Refactor reading the config file
This is in preparation for creating a fallback configuration
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/confdb/confdb_setup.c | 144 |
1 files changed, 84 insertions, 60 deletions
diff --git a/src/confdb/confdb_setup.c b/src/confdb/confdb_setup.c index a71d9dd12..c040bdf9e 100644 --- a/src/confdb/confdb_setup.c +++ b/src/confdb/confdb_setup.c @@ -126,69 +126,39 @@ static int confdb_create_base(struct confdb_ctx *cdb) return EOK; } -static int confdb_init_db(const char *config_file, const char *config_dir, - struct confdb_ctx *cdb) +static int confdb_ldif_from_ini_file(TALLOC_CTX *mem_ctx, + const char *config_file, + const char *config_dir, + struct sss_ini_initdata *init_data, + const char **_timestr, + const char **_ldif) { - TALLOC_CTX *tmp_ctx; - int ret; - int sret = EOK; - int version; + errno_t ret; char timestr[21]; - bool in_transaction = false; - const char *config_ldif; - const char *vals[2] = { timestr, NULL }; - struct ldb_ldif *ldif; - struct sss_ini_initdata *init_data; - - tmp_ctx = talloc_new(cdb); - if (tmp_ctx == NULL) { - DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory.\n"); - return ENOMEM; - } - - init_data = sss_ini_initdata_init(tmp_ctx); - if (!init_data) { - DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory.\n"); - ret = ENOMEM; - goto done; - } - - /* Open config file */ - ret = sss_ini_config_file_open(init_data, config_file); - if (ret != EOK) { - DEBUG(SSSDBG_TRACE_FUNC, - "sss_ini_config_file_open failed: %s [%d]\n", strerror(ret), - ret); - if (ret == ENOENT) { - /* sss specific error denoting missing configuration file */ - ret = ERR_MISSING_CONF; - } - goto done; - } + int version; ret = sss_ini_config_access_check(init_data); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Permission check on config file failed.\n"); - ret = EPERM; - goto done; + return EPERM; } ret = sss_ini_get_stat(init_data); if (ret != EOK) { + ret = errno; DEBUG(SSSDBG_FATAL_FAILURE, "Status check on config file failed.\n"); - ret = errno; - goto done; + return ret; } errno = 0; - ret = sss_ini_get_mtime(init_data, sizeof(timestr), timestr); if (ret <= 0 || ret >= (int)sizeof(timestr)) { DEBUG(SSSDBG_FATAL_FAILURE, "Failed to convert time_t to string ??\n"); ret = errno ? errno : EFAULT; + return ret; } /* FIXME: Determine if the conf file or any snippet has changed @@ -199,7 +169,7 @@ static int confdb_init_db(const char *config_file, const char *config_dir, ret = sss_ini_get_config(init_data, config_file, config_dir); if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, "Failed to load configuration\n"); - goto done; + return ret; } ret = sss_ini_call_validators(init_data, @@ -214,7 +184,7 @@ static int confdb_init_db(const char *config_file, const char *config_dir, if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, "Internal error determining config_file_version\n"); - goto done; + return ret; } ret = sss_ini_check_config_obj(init_data); @@ -230,21 +200,82 @@ static int confdb_init_db(const char *config_file, const char *config_dir, if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, "Config file version could not be determined\n"); - goto done; + return ret; } else if (version < CONFDB_VERSION_INT) { DEBUG(SSSDBG_FATAL_FAILURE, "Config file is an old version. " "Please run configuration upgrade script.\n"); - ret = EINVAL; - goto done; + return EINVAL; } else if (version > CONFDB_VERSION_INT) { DEBUG(SSSDBG_FATAL_FAILURE, "Config file version is newer than confdb\n"); - ret = EINVAL; - goto done; + return EINVAL; } } + ret = sss_confdb_create_ldif(mem_ctx, init_data, _ldif); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "Could not create LDIF for confdb\n"); + return ret; + } + + *_timestr = talloc_strdup(mem_ctx, timestr); + if (*_timestr == NULL) { + return ENOMEM; + } + + return EOK; +} + +static int confdb_init_db(const char *config_file, const char *config_dir, + struct confdb_ctx *cdb) +{ + TALLOC_CTX *tmp_ctx; + int ret; + int sret = EOK; + bool in_transaction = false; + const char *timestr = NULL; + const char *config_ldif; + const char *vals[2] = { NULL, NULL }; + struct ldb_ldif *ldif; + struct sss_ini_initdata *init_data; + + tmp_ctx = talloc_new(cdb); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory.\n"); + return ENOMEM; + } + + init_data = sss_ini_initdata_init(tmp_ctx); + if (!init_data) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory.\n"); + ret = ENOMEM; + goto done; + } + + /* Open config file */ + ret = sss_ini_config_file_open(init_data, config_file); + if (ret != EOK) { + DEBUG(SSSDBG_CONF_SETTINGS, + "sss_ini_config_file_open failed: %s [%d]\n", sss_strerror(ret), + ret); + goto done; + } + + ret = confdb_ldif_from_ini_file(tmp_ctx, + config_file, + config_dir, + init_data, + ×tr, + &config_ldif); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Cannot convert INI to LDIF [%d]: [%s]\n", + ret, sss_strerror(ret)); + goto done; + } + DEBUG(SSSDBG_CONF_SETTINGS, "LDIF file to import: \n%s\n", config_ldif); + /* Set up a transaction to replace the configuration */ ret = ldb_transaction_start(cdb->ldb); if (ret != LDB_SUCCESS) { @@ -264,20 +295,12 @@ static int confdb_init_db(const char *config_file, const char *config_dir, goto done; } - ret = sss_confdb_create_ldif(tmp_ctx, init_data, &config_ldif); - if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE, "Could not create LDIF for confdb\n"); - goto done; - } - - DEBUG(SSSDBG_TRACE_LIBS, "LDIF file to import: \n%s\n", config_ldif); - while ((ldif = ldb_ldif_read_string(cdb->ldb, &config_ldif))) { ret = ldb_add(cdb->ldb, ldif->msg); if (ret != LDB_SUCCESS) { DEBUG(SSSDBG_FATAL_FAILURE, - "Failed to initialize DB (%d,[%s]), aborting!\n", - ret, ldb_errstring(cdb->ldb)); + "Failed to initialize DB (%d,[%s]), aborting!\n", + ret, ldb_errstring(cdb->ldb)); ret = EIO; goto done; } @@ -287,10 +310,11 @@ static int confdb_init_db(const char *config_file, const char *config_dir, /* now store the lastUpdate time so that we do not re-init if nothing * changed on restart */ + vals[0] = timestr; ret = confdb_add_param(cdb, true, "config", "lastUpdate", vals); if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, - "Failed to set last update time on db!\n"); + "Failed to set last update time on db!\n"); goto done; } |
