diff options
Diffstat (limited to 'ctdb/server/ctdb_config.c')
-rw-r--r-- | ctdb/server/ctdb_config.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/ctdb/server/ctdb_config.c b/ctdb/server/ctdb_config.c new file mode 100644 index 0000000..7283027 --- /dev/null +++ b/ctdb/server/ctdb_config.c @@ -0,0 +1,183 @@ +/* + CTDB daemon config handling + + Copyright (C) Martin Schwenke 2018 + + 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 "replace.h" + +#include "lib/util/debug.h" + +#include "common/conf.h" +#include "common/logging_conf.h" +#include "common/path.h" + +#include "cluster/cluster_conf.h" +#include "database/database_conf.h" +#include "event/event_conf.h" +#include "failover/failover_conf.h" +#include "legacy_conf.h" + +#include "ctdb_config.h" + +struct ctdb_config ctdb_config; + +static void setup_config_pointers(struct conf_context *conf) +{ + /* + * Cluster + */ + + conf_assign_string_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_TRANSPORT, + &ctdb_config.transport); + conf_assign_string_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_NODE_ADDRESS, + &ctdb_config.node_address); + conf_assign_string_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_CLUSTER_LOCK, + &ctdb_config.cluster_lock); + conf_assign_string_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_RECOVERY_LOCK, + &ctdb_config.recovery_lock); + conf_assign_integer_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_LEADER_TIMEOUT, + &ctdb_config.leader_timeout); + conf_assign_boolean_pointer(conf, + CLUSTER_CONF_SECTION, + CLUSTER_CONF_LEADER_CAPABILITY, + &ctdb_config.leader_capability); + + /* + * Database + */ + + conf_assign_string_pointer(conf, + DATABASE_CONF_SECTION, + DATABASE_CONF_VOLATILE_DB_DIR, + &ctdb_config.dbdir_volatile); + conf_assign_string_pointer(conf, + DATABASE_CONF_SECTION, + DATABASE_CONF_PERSISTENT_DB_DIR, + &ctdb_config.dbdir_persistent); + conf_assign_string_pointer(conf, + DATABASE_CONF_SECTION, + DATABASE_CONF_STATE_DB_DIR, + &ctdb_config.dbdir_state); + conf_assign_string_pointer(conf, + DATABASE_CONF_SECTION, + DATABASE_CONF_LOCK_DEBUG_SCRIPT, + &ctdb_config.lock_debug_script); + conf_assign_boolean_pointer(conf, + DATABASE_CONF_SECTION, + DATABASE_CONF_TDB_MUTEXES, + &ctdb_config.tdb_mutexes); + + /* + * Event + */ + conf_assign_string_pointer(conf, + EVENT_CONF_SECTION, + EVENT_CONF_DEBUG_SCRIPT, + &ctdb_config.event_debug_script); + + /* + * Failover + */ + conf_assign_boolean_pointer(conf, + FAILOVER_CONF_SECTION, + FAILOVER_CONF_DISABLED, + &ctdb_config.failover_disabled); + + /* + * Legacy + */ + + conf_assign_boolean_pointer(conf, + LEGACY_CONF_SECTION, + LEGACY_CONF_REALTIME_SCHEDULING, + &ctdb_config.realtime_scheduling); + conf_assign_boolean_pointer(conf, + LEGACY_CONF_SECTION, + LEGACY_CONF_LMASTER_CAPABILITY, + &ctdb_config.lmaster_capability); + conf_assign_boolean_pointer(conf, + LEGACY_CONF_SECTION, + LEGACY_CONF_START_AS_STOPPED, + &ctdb_config.start_as_stopped); + conf_assign_boolean_pointer(conf, + LEGACY_CONF_SECTION, + LEGACY_CONF_START_AS_DISABLED, + &ctdb_config.start_as_disabled); + conf_assign_string_pointer(conf, + LEGACY_CONF_SECTION, + LEGACY_CONF_SCRIPT_LOG_LEVEL, + &ctdb_config.script_log_level); +} + +int ctdbd_config_load(TALLOC_CTX *mem_ctx, + struct conf_context **result) +{ + struct conf_context *conf = NULL; + int ret = 0; + char *conf_file = NULL; + + ret = conf_init(mem_ctx, &conf); + if (ret != 0) { + return ret; + } + + logging_conf_init(conf, "NOTICE"); + cluster_conf_init(conf); + database_conf_init(conf); + event_conf_init(conf); + failover_conf_init(conf); + legacy_conf_init(conf); + + setup_config_pointers(conf); + + if (! conf_valid(conf)) { + ret = EINVAL; + goto fail; + } + + conf_file = path_config(conf); + if (conf_file == NULL) { + D_ERR("Memory allocation error\n"); + ret = ENOMEM; + goto fail; + } + ret = conf_load(conf, conf_file, true); + /* Configuration file does not need to exist */ + if (ret != 0 && ret != ENOENT) { + D_ERR("Failed to load configuration file %s\n", conf_file); + goto fail; + } + + talloc_free(conf_file); + *result = conf; + + return 0; + +fail: + talloc_free(conf); + return ret; +} |