summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2017-02-23 12:02:06 +0100
committerLukas Slebodnik <lslebodn@redhat.com>2017-02-28 10:36:55 +0100
commit5a660d3aa67403fba69a8047ecedfe8a4276fc30 (patch)
tree760e14c8512cae327ba95c04308644801b294d28 /src
parent13294bedc56faf1011f5ba7b1ed9a53b08e71c00 (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.c144
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,
+ &timestr,
+ &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;
}