| /*****************************************************************************\ |
| * read_config.c - functions for reading slurmdbd.conf |
| ***************************************************************************** |
| * Copyright (C) 2003-2007 The Regents of the University of California. |
| * Copyright (C) 2008-2009 Lawrence Livermore National Security. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Morris Jette <jette1@llnl.gov> |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm 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 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm 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 Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| |
| #include "config.h" |
| |
| #include <limits.h> |
| #include <pwd.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| |
| #include "slurm/slurm_errno.h" |
| |
| #include "src/common/list.h" |
| #include "src/common/log.h" |
| #include "src/common/macros.h" |
| #include "src/common/parse_config.h" |
| #include "src/common/parse_time.h" |
| #include "src/common/read_config.h" |
| #include "src/common/slurmdb_defs.h" |
| #include "src/common/uid.h" |
| #include "src/common/xmalloc.h" |
| #include "src/common/xstring.h" |
| |
| #include "src/interfaces/accounting_storage.h" |
| |
| #include "src/slurmdbd/read_config.h" |
| |
| /* Global variables */ |
| pthread_mutex_t conf_mutex = PTHREAD_MUTEX_INITIALIZER; |
| |
| /* Local functions */ |
| static void _clear_slurmdbd_conf(void); |
| |
| static time_t boot_time; |
| |
| /* |
| * free_slurmdbd_conf - free storage associated with the global variable |
| * slurmdbd_conf |
| */ |
| extern void free_slurmdbd_conf(void) |
| { |
| slurm_mutex_lock(&conf_mutex); |
| _clear_slurmdbd_conf(); |
| xfree(slurmdbd_conf); |
| slurm_mutex_unlock(&conf_mutex); |
| } |
| |
| static void _clear_slurmdbd_conf(void) |
| { |
| init_slurm_conf(&slurm_conf); |
| |
| if (slurmdbd_conf) { |
| xfree(slurmdbd_conf->archive_dir); |
| xfree(slurmdbd_conf->archive_script); |
| slurmdbd_conf->commit_delay = 0; |
| xfree(slurmdbd_conf->dbd_addr); |
| xfree(slurmdbd_conf->dbd_backup); |
| xfree(slurmdbd_conf->dbd_host); |
| slurmdbd_conf->dbd_port = 0; |
| slurmdbd_conf->debug_level = LOG_LEVEL_INFO; |
| xfree(slurmdbd_conf->default_qos); |
| slurmdbd_conf->flags = 0; |
| xfree(slurmdbd_conf->log_file); |
| slurmdbd_conf->syslog_debug = LOG_LEVEL_END; |
| xfree(slurmdbd_conf->parameters); |
| xfree(slurmdbd_conf->pid_file); |
| slurmdbd_conf->purge_event = 0; |
| slurmdbd_conf->purge_job = 0; |
| slurmdbd_conf->purge_resv = 0; |
| slurmdbd_conf->purge_step = 0; |
| slurmdbd_conf->purge_suspend = 0; |
| slurmdbd_conf->purge_txn = 0; |
| slurmdbd_conf->purge_usage = 0; |
| xfree(slurmdbd_conf->storage_loc); |
| xfree(slurmdbd_conf->storage_user); |
| slurmdbd_conf->track_wckey = 0; |
| slurmdbd_conf->track_ctld = 0; |
| } |
| } |
| |
| /* |
| * read_slurmdbd_conf - load the SlurmDBD configuration from the slurmdbd.conf |
| * file. Store result into global variable slurmdbd_conf. |
| * This function can be called more than once. |
| * RET SLURM_SUCCESS if no error, otherwise an error code |
| */ |
| extern int read_slurmdbd_conf(void) |
| { |
| s_p_options_t options[] = { |
| {"AllowNoDefAcct", S_P_BOOLEAN}, |
| {"AllResourcesAbsolute", S_P_BOOLEAN}, |
| {"ArchiveDir", S_P_STRING}, |
| {"ArchiveEvents", S_P_BOOLEAN}, |
| {"ArchiveJobs", S_P_BOOLEAN}, |
| {"ArchiveResvs", S_P_BOOLEAN}, |
| {"ArchiveScript", S_P_STRING}, |
| {"ArchiveSteps", S_P_BOOLEAN}, |
| {"ArchiveSuspend", S_P_BOOLEAN}, |
| {"ArchiveTXN", S_P_BOOLEAN}, |
| {"ArchiveUsage", S_P_BOOLEAN}, |
| {"AuthAltTypes", S_P_STRING}, |
| {"AuthAltParameters", S_P_STRING}, |
| {"AuthInfo", S_P_STRING}, |
| {"AuthType", S_P_STRING}, |
| {"CommitDelay", S_P_UINT16}, |
| {"CommunicationParameters", S_P_STRING}, |
| {"DbdAddr", S_P_STRING}, |
| {"DbdBackupHost", S_P_STRING}, |
| {"DbdHost", S_P_STRING}, |
| {"DbdPort", S_P_UINT16}, |
| {"DebugFlags", S_P_STRING}, |
| {"DebugLevel", S_P_STRING}, |
| {"DebugLevelSyslog", S_P_STRING}, |
| {"DefaultQOS", S_P_STRING}, |
| {"DisableCoordDBD", S_P_BOOLEAN}, |
| {"HashPlugin", S_P_STRING}, |
| {"JobPurge", S_P_UINT32}, |
| {"LogFile", S_P_STRING}, |
| {"LogTimeFormat", S_P_STRING}, |
| {"MaxQueryTimeRange", S_P_STRING}, |
| {"MessageTimeout", S_P_UINT16}, |
| {"Parameters", S_P_STRING}, |
| {"PidFile", S_P_STRING}, |
| {"PluginDir", S_P_STRING}, |
| {"PrivateData", S_P_STRING}, |
| {"PurgeEventAfter", S_P_STRING}, |
| {"PurgeJobAfter", S_P_STRING}, |
| {"PurgeResvAfter", S_P_STRING}, |
| {"PurgeStepAfter", S_P_STRING}, |
| {"PurgeSuspendAfter", S_P_STRING}, |
| {"PurgeTXNAfter", S_P_STRING}, |
| {"PurgeUsageAfter", S_P_STRING}, |
| {"PurgeEventMonths", S_P_UINT32}, |
| {"PurgeJobMonths", S_P_UINT32}, |
| {"PurgeStepMonths", S_P_UINT32}, |
| {"PurgeSuspendMonths", S_P_UINT32}, |
| {"PurgeTXNMonths", S_P_UINT32}, |
| {"PurgeUsageMonths", S_P_UINT32}, |
| {"SlurmUser", S_P_STRING}, |
| {"StepPurge", S_P_UINT32}, |
| {"StorageBackupHost", S_P_STRING}, |
| {"StorageHost", S_P_STRING}, |
| {"StorageLoc", S_P_STRING}, |
| {"StorageParameters", S_P_STRING}, |
| {"StoragePass", S_P_STRING}, |
| {"StoragePort", S_P_UINT16}, |
| {"StorageType", S_P_STRING}, |
| {"StorageUser", S_P_STRING}, |
| {"TCPTimeout", S_P_UINT16}, |
| {"TLSParameters", S_P_STRING}, |
| {"TLSType", S_P_STRING}, |
| {"TrackWCKey", S_P_BOOLEAN}, |
| {"TrackSlurmctldDown", S_P_BOOLEAN}, |
| {NULL} }; |
| s_p_hashtbl_t *tbl = NULL; |
| char *conf_path = NULL; |
| char *temp_str = NULL; |
| struct stat buf; |
| |
| /* Set initial values */ |
| slurm_mutex_lock(&conf_mutex); |
| if (slurmdbd_conf == NULL) { |
| slurmdbd_conf = xmalloc(sizeof(*slurmdbd_conf)); |
| boot_time = time(NULL); |
| } |
| _clear_slurmdbd_conf(); |
| |
| /* set slurmdbd specific defaults */ |
| slurm_conf.keepalive_interval = DEFAULT_SLURMDBD_KEEPALIVE_INTERVAL; |
| slurm_conf.keepalive_probes = DEFAULT_SLURMDBD_KEEPALIVE_PROBES; |
| slurm_conf.keepalive_time = DEFAULT_SLURMDBD_KEEPALIVE_TIME; |
| |
| /* Get the slurmdbd.conf path and validate the file */ |
| conf_path = get_extra_conf_path("slurmdbd.conf"); |
| if ((conf_path == NULL) || (stat(conf_path, &buf) == -1)) { |
| info("No slurmdbd.conf file (%s)", conf_path); |
| } else { |
| bool a_events = false, a_jobs = false, a_resv = false; |
| bool a_steps = false, a_suspend = false, a_txn = false; |
| bool a_usage = false; |
| bool tmp_bool = false; |
| uint32_t parse_flags = 0; |
| uid_t conf_path_uid; |
| mode_t permission = buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); |
| debug3("Checking slurmdbd.conf file:%s access permissions", |
| conf_path); |
| if ((permission != 0600) && (permission != 0640)) |
| fatal("slurmdbd.conf file %s should be 600 or 640 but is %o", |
| conf_path, permission); |
| |
| debug("Reading slurmdbd.conf file %s", conf_path); |
| |
| tbl = s_p_hashtbl_create(options); |
| parse_flags |= PARSE_FLAGS_CHECK_PERMISSIONS; |
| if (s_p_parse_file(tbl, NULL, conf_path, parse_flags, NULL) |
| == SLURM_ERROR) { |
| fatal("Could not open/read/parse slurmdbd.conf file %s", |
| conf_path); |
| } |
| conf_path_uid = buf.st_uid; |
| |
| |
| if (!s_p_get_string(&slurmdbd_conf->archive_dir, "ArchiveDir", |
| tbl)) |
| slurmdbd_conf->archive_dir = |
| xstrdup(DEFAULT_SLURMDBD_ARCHIVE_DIR); |
| |
| tmp_bool = false; |
| s_p_get_boolean(&tmp_bool, "AllowNoDefAcct", tbl); |
| if (tmp_bool) |
| slurmdbd_conf->flags |= DBD_CONF_FLAG_ALLOW_NO_DEF_ACCT; |
| s_p_get_boolean(&tmp_bool, "AllResourcesAbsolute", tbl); |
| if (tmp_bool) |
| slurmdbd_conf->flags |= DBD_CONF_FLAG_ALL_RES_ABS; |
| |
| s_p_get_boolean(&a_events, "ArchiveEvents", tbl); |
| s_p_get_boolean(&a_jobs, "ArchiveJobs", tbl); |
| s_p_get_boolean(&a_resv, "ArchiveResvs", tbl); |
| s_p_get_string(&slurmdbd_conf->archive_script, "ArchiveScript", |
| tbl); |
| s_p_get_boolean(&a_steps, "ArchiveSteps", tbl); |
| s_p_get_boolean(&a_suspend, "ArchiveSuspend", tbl); |
| s_p_get_boolean(&a_txn, "ArchiveTXN", tbl); |
| s_p_get_boolean(&a_usage, "ArchiveUsage", tbl); |
| s_p_get_string(&slurm_conf.authalttypes, "AuthAltTypes", tbl); |
| s_p_get_string(&slurm_conf.authalt_params, "AuthAltParameters", |
| tbl); |
| s_p_get_string(&slurm_conf.authinfo, "AuthInfo", tbl); |
| s_p_get_string(&slurm_conf.authtype, "AuthType", tbl); |
| s_p_get_uint16(&slurmdbd_conf->commit_delay, |
| "CommitDelay", tbl); |
| s_p_get_string(&slurm_conf.comm_params, |
| "CommunicationParameters", tbl); |
| |
| /* |
| * IPv4 on by default, can be disabled. |
| * IPv6 off by default, can be turned on. |
| */ |
| slurm_conf.conf_flags |= CONF_FLAG_IPV4_ENABLED; |
| if (xstrcasestr(slurm_conf.comm_params, "EnableIPv6")) |
| slurm_conf.conf_flags |= CONF_FLAG_IPV6_ENABLED; |
| if (xstrcasestr(slurm_conf.comm_params, "DisableIPv4")) |
| slurm_conf.conf_flags &= ~CONF_FLAG_IPV4_ENABLED; |
| |
| if (!(slurm_conf.conf_flags & CONF_FLAG_IPV4_ENABLED) && |
| !(slurm_conf.conf_flags & CONF_FLAG_IPV6_ENABLED)) |
| fatal("Both IPv4 and IPv6 support disabled, cannot communicate"); |
| |
| if ((temp_str = xstrcasestr(slurm_conf.comm_params, |
| "keepaliveinterval="))) { |
| long tmp_val = strtol(temp_str + 18, NULL, 10); |
| if (tmp_val >= 0 && tmp_val <= INT_MAX) |
| slurm_conf.keepalive_interval = tmp_val; |
| else |
| error("CommunicationParameters option keepaliveinterval=%ld is invalid, ignored", |
| tmp_val); |
| } |
| |
| if ((temp_str = xstrcasestr(slurm_conf.comm_params, |
| "keepaliveprobes="))) { |
| long tmp_val = strtol(temp_str + 16, NULL, 10); |
| if (tmp_val >= 0 && tmp_val <= INT_MAX) |
| slurm_conf.keepalive_probes = tmp_val; |
| else |
| error("CommunicationParameters option keepaliveprobes=%ld is invalid, ignored", |
| tmp_val); |
| } |
| |
| if ((temp_str = xstrcasestr(slurm_conf.comm_params, |
| "keepalivetime="))) { |
| long tmp_val = strtol(temp_str + 14, NULL, 10); |
| if (tmp_val >= 0 && tmp_val <= INT_MAX) |
| slurm_conf.keepalive_time = tmp_val; |
| else |
| error("CommunicationParameters option keepalivetime=%ld is invalid, ignored", |
| tmp_val); |
| } |
| |
| s_p_get_string(&slurmdbd_conf->dbd_backup, |
| "DbdBackupHost", tbl); |
| s_p_get_string(&slurmdbd_conf->dbd_host, "DbdHost", tbl); |
| s_p_get_string(&slurmdbd_conf->dbd_addr, "DbdAddr", tbl); |
| s_p_get_uint16(&slurmdbd_conf->dbd_port, "DbdPort", tbl); |
| |
| if (s_p_get_string(&temp_str, "DebugFlags", tbl)) { |
| if (debug_str2flags(temp_str, &slurm_conf.debug_flags) |
| != SLURM_SUCCESS) |
| fatal("DebugFlags invalid: %s", temp_str); |
| xfree(temp_str); |
| } else /* Default: no DebugFlags */ |
| slurm_conf.debug_flags = 0; |
| |
| if (s_p_get_string(&temp_str, "DebugLevel", tbl)) { |
| slurmdbd_conf->debug_level = log_string2num(temp_str); |
| if (slurmdbd_conf->debug_level == NO_VAL16) |
| fatal("Invalid DebugLevel %s", temp_str); |
| xfree(temp_str); |
| } |
| |
| s_p_get_string(&slurmdbd_conf->default_qos, "DefaultQOS", tbl); |
| if (s_p_get_uint32(&slurmdbd_conf->purge_job, |
| "JobPurge", tbl)) { |
| if (!slurmdbd_conf->purge_job) |
| slurmdbd_conf->purge_job = NO_VAL; |
| else |
| slurmdbd_conf->purge_job |= |
| SLURMDB_PURGE_MONTHS; |
| } |
| |
| s_p_get_boolean(&tmp_bool, "DisableCoordDBD", tbl); |
| if (tmp_bool) |
| slurmdbd_conf->flags |= |
| DBD_CONF_FLAG_DISABLE_COORD_DBD; |
| |
| if (!s_p_get_string(&slurm_conf.hash_plugin, "HashPlugin", tbl)) |
| slurm_conf.hash_plugin = xstrdup(DEFAULT_HASH_PLUGIN); |
| |
| s_p_get_string(&slurmdbd_conf->log_file, "LogFile", tbl); |
| |
| if (s_p_get_string(&temp_str, "DebugLevelSyslog", tbl)) { |
| slurmdbd_conf->syslog_debug = log_string2num(temp_str); |
| if (slurmdbd_conf->syslog_debug == NO_VAL16) |
| fatal("Invalid DebugLevelSyslog %s", temp_str); |
| xfree(temp_str); |
| } |
| |
| /* Default log time format */ |
| slurm_conf.log_fmt = LOG_FMT_ISO8601_MS; |
| if (s_p_get_string(&temp_str, "LogTimeFormat", tbl)) { |
| if (xstrcasestr(temp_str, "iso8601_ms")) |
| slurm_conf.log_fmt = LOG_FMT_ISO8601_MS; |
| else if (xstrcasestr(temp_str, "iso8601")) |
| slurm_conf.log_fmt = LOG_FMT_ISO8601; |
| else if (xstrcasestr(temp_str, "rfc5424_ms")) |
| slurm_conf.log_fmt = LOG_FMT_RFC5424_MS; |
| else if (xstrcasestr(temp_str, "rfc5424")) |
| slurm_conf.log_fmt = LOG_FMT_RFC5424; |
| else if (xstrcasestr(temp_str, "rfc3339")) |
| slurm_conf.log_fmt = LOG_FMT_RFC3339; |
| else if (xstrcasestr(temp_str, "clock")) |
| slurm_conf.log_fmt = LOG_FMT_CLOCK; |
| else if (xstrcasestr(temp_str, "short")) |
| slurm_conf.log_fmt = LOG_FMT_SHORT; |
| else if (xstrcasestr(temp_str, "thread_id")) |
| slurm_conf.log_fmt = LOG_FMT_THREAD_ID; |
| xfree(temp_str); |
| } |
| |
| if (s_p_get_string(&temp_str, "MaxQueryTimeRange", tbl)) { |
| slurmdbd_conf->max_time_range = time_str2secs(temp_str); |
| xfree(temp_str); |
| } else { |
| slurmdbd_conf->max_time_range = INFINITE; |
| } |
| |
| if (!s_p_get_uint16(&slurm_conf.msg_timeout, "MessageTimeout", |
| tbl)) |
| slurm_conf.msg_timeout = DEFAULT_MSG_TIMEOUT; |
| else if (slurm_conf.msg_timeout > 100) |
| warning("MessageTimeout is too high for effective fault-tolerance"); |
| |
| s_p_get_string(&slurmdbd_conf->parameters, "Parameters", tbl); |
| if (slurmdbd_conf->parameters) { |
| if (xstrcasestr(slurmdbd_conf->parameters, |
| "PreserveCaseUser")) |
| slurmdbd_conf->persist_conn_rc_flags |= |
| PERSIST_FLAG_P_USER_CASE; |
| } |
| |
| s_p_get_string(&slurmdbd_conf->pid_file, "PidFile", tbl); |
| s_p_get_string(&slurm_conf.plugindir, "PluginDir", tbl); |
| |
| slurm_conf.private_data = 0; /* default visible to all */ |
| if (s_p_get_string(&temp_str, "PrivateData", tbl)) { |
| if (xstrcasestr(temp_str, "account")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_ACCOUNTS; |
| if (xstrcasestr(temp_str, "job")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_JOBS; |
| if (xstrcasestr(temp_str, "event")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_EVENTS; |
| if (xstrcasestr(temp_str, "node")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_NODES; |
| if (xstrcasestr(temp_str, "partition")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_PARTITIONS; |
| if (xstrcasestr(temp_str, "reservation")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_RESERVATIONS; |
| if (xstrcasestr(temp_str, "usage")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_USAGE; |
| if (xstrcasestr(temp_str, "user")) |
| slurm_conf.private_data |
| |= PRIVATE_DATA_USERS; |
| if (xstrcasestr(temp_str, "all")) |
| slurm_conf.private_data = 0xffff; |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeEventAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_event = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeEventAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeJobAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_job = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeJobAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeResvAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_resv = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeResvAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeStepAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_step = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeStepAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeSuspendAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_suspend = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeSuspendAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeTXNAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_txn = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeTXNAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_string(&temp_str, "PurgeUsageAfter", tbl)) { |
| /* slurmdb_parse_purge will set SLURMDB_PURGE_FLAGS */ |
| if ((slurmdbd_conf->purge_usage = |
| slurmdb_parse_purge(temp_str)) == NO_VAL) { |
| fatal("Bad value \"%s\" for PurgeUsageAfter", |
| temp_str); |
| } |
| xfree(temp_str); |
| } |
| if (s_p_get_uint32(&slurmdbd_conf->purge_event, |
| "PurgeEventMonths", tbl)) { |
| if (!slurmdbd_conf->purge_event) |
| slurmdbd_conf->purge_event = NO_VAL; |
| else |
| slurmdbd_conf->purge_event |= |
| SLURMDB_PURGE_MONTHS; |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_job, |
| "PurgeJobMonths", tbl)) { |
| if (!slurmdbd_conf->purge_job) |
| slurmdbd_conf->purge_job = NO_VAL; |
| else |
| slurmdbd_conf->purge_job |= |
| SLURMDB_PURGE_MONTHS; |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_step, |
| "PurgeStepMonths", tbl)) { |
| if (!slurmdbd_conf->purge_step) |
| slurmdbd_conf->purge_step = NO_VAL; |
| else |
| slurmdbd_conf->purge_step |= |
| SLURMDB_PURGE_MONTHS; |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_suspend, |
| "PurgeSuspendMonths", tbl)) { |
| if (!slurmdbd_conf->purge_suspend) |
| slurmdbd_conf->purge_suspend = NO_VAL; |
| else |
| slurmdbd_conf->purge_suspend |
| |= SLURMDB_PURGE_MONTHS; |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_txn, |
| "PurgeTXNMonths", tbl)) { |
| if (!slurmdbd_conf->purge_txn) |
| slurmdbd_conf->purge_txn = NO_VAL; |
| else |
| slurmdbd_conf->purge_txn |
| |= SLURMDB_PURGE_MONTHS; |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_usage, |
| "PurgeUsageMonths", tbl)) { |
| if (!slurmdbd_conf->purge_usage) |
| slurmdbd_conf->purge_usage = NO_VAL; |
| else |
| slurmdbd_conf->purge_usage |
| |= SLURMDB_PURGE_MONTHS; |
| } |
| |
| s_p_get_string(&slurm_conf.slurm_user_name, "SlurmUser", tbl); |
| |
| if (slurm_conf.slurm_user_name) { |
| uid_t uid; |
| |
| if (uid_from_string(slurm_conf.slurm_user_name, &uid) != |
| SLURM_SUCCESS) |
| fatal("failed to look up SlurmUser uid"); |
| |
| if (conf_path_uid != uid) |
| fatal("slurmdbd.conf owned by %u not SlurmUser(%u)", |
| conf_path_uid, uid); |
| } |
| |
| if (s_p_get_uint32(&slurmdbd_conf->purge_step, |
| "StepPurge", tbl)) { |
| if (!slurmdbd_conf->purge_step) |
| slurmdbd_conf->purge_step = NO_VAL; |
| else |
| slurmdbd_conf->purge_step |= |
| SLURMDB_PURGE_MONTHS; |
| } |
| |
| s_p_get_string(&slurm_conf.accounting_storage_backup_host, |
| "StorageBackupHost", tbl); |
| s_p_get_string(&slurm_conf.accounting_storage_host, |
| "StorageHost", tbl); |
| s_p_get_string(&slurmdbd_conf->storage_loc, |
| "StorageLoc", tbl); |
| s_p_get_string(&slurm_conf.accounting_storage_params, |
| "StorageParameters", tbl); |
| s_p_get_string(&slurm_conf.accounting_storage_pass, |
| "StoragePass", tbl); |
| s_p_get_uint16(&slurm_conf.accounting_storage_port, |
| "StoragePort", tbl); |
| s_p_get_string(&slurm_conf.accounting_storage_type, |
| "StorageType", tbl); |
| s_p_get_string(&slurmdbd_conf->storage_user, "StorageUser", tbl); |
| |
| if (!s_p_get_uint16(&slurm_conf.tcp_timeout, "TCPTimeout", tbl)) |
| slurm_conf.tcp_timeout = DEFAULT_TCP_TIMEOUT; |
| |
| s_p_get_string(&slurm_conf.tls_params, "TLSParameters", tbl); |
| if (!s_p_get_string(&slurm_conf.tls_type, "TLSType", tbl)) |
| slurm_conf.tls_type = xstrdup(DEFAULT_TLS_TYPE); |
| |
| if (!s_p_get_boolean((bool *)&slurmdbd_conf->track_wckey, |
| "TrackWCKey", tbl)) |
| slurmdbd_conf->track_wckey = false; |
| |
| if (!s_p_get_boolean((bool *)&slurmdbd_conf->track_ctld, |
| "TrackSlurmctldDown", tbl)) |
| slurmdbd_conf->track_ctld = false; |
| |
| if (a_events && slurmdbd_conf->purge_event) |
| slurmdbd_conf->purge_event |= SLURMDB_PURGE_ARCHIVE; |
| if (a_jobs && slurmdbd_conf->purge_job) |
| slurmdbd_conf->purge_job |= SLURMDB_PURGE_ARCHIVE; |
| if (a_resv && slurmdbd_conf->purge_resv) |
| slurmdbd_conf->purge_resv |= SLURMDB_PURGE_ARCHIVE; |
| if (a_steps && slurmdbd_conf->purge_step) |
| slurmdbd_conf->purge_step |= SLURMDB_PURGE_ARCHIVE; |
| if (a_suspend && slurmdbd_conf->purge_suspend) |
| slurmdbd_conf->purge_suspend |= SLURMDB_PURGE_ARCHIVE; |
| if (a_txn && slurmdbd_conf->purge_txn) |
| slurmdbd_conf->purge_txn |= SLURMDB_PURGE_ARCHIVE; |
| if (a_usage && slurmdbd_conf->purge_usage) |
| slurmdbd_conf->purge_usage |= SLURMDB_PURGE_ARCHIVE; |
| |
| s_p_hashtbl_destroy(tbl); |
| } |
| |
| xfree(conf_path); |
| if (!slurm_conf.authtype) |
| slurm_conf.authtype = xstrdup(DEFAULT_SLURMDBD_AUTHTYPE); |
| if (slurmdbd_conf->dbd_host == NULL) { |
| error("slurmdbd.conf lacks DbdHost parameter, " |
| "using 'localhost'"); |
| slurmdbd_conf->dbd_host = xstrdup("localhost"); |
| } |
| if (slurmdbd_conf->dbd_addr == NULL) |
| slurmdbd_conf->dbd_addr = xstrdup(slurmdbd_conf->dbd_host); |
| if (slurmdbd_conf->pid_file == NULL) |
| slurmdbd_conf->pid_file = xstrdup(DEFAULT_SLURMDBD_PIDFILE); |
| if (slurmdbd_conf->dbd_port == 0) |
| slurmdbd_conf->dbd_port = SLURMDBD_PORT; |
| if (!slurm_conf.plugindir) |
| slurm_conf.plugindir = xstrdup(default_plugin_path); |
| if (slurm_conf.slurm_user_name) { |
| if (uid_from_string(slurm_conf.slurm_user_name, |
| &slurm_conf.slurm_user_id) != SLURM_SUCCESS) |
| fatal("Invalid user for SlurmUser %s, ignored", |
| slurm_conf.slurm_user_name); |
| } else { |
| slurm_conf.slurm_user_name = xstrdup("root"); |
| slurm_conf.slurm_user_id = 0; |
| } |
| |
| if (!slurm_conf.accounting_storage_type) |
| fatal("StorageType must be specified"); |
| if (!xstrcmp(slurm_conf.accounting_storage_type, |
| "accounting_storage/slurmdbd")) { |
| fatal("StorageType=%s is invalid in slurmdbd.conf", |
| slurm_conf.accounting_storage_type); |
| } |
| |
| if (!slurm_conf.accounting_storage_host) |
| slurm_conf.accounting_storage_host = |
| xstrdup(DEFAULT_STORAGE_HOST); |
| |
| if (!slurmdbd_conf->storage_user) |
| slurmdbd_conf->storage_user = xstrdup(getlogin()); |
| |
| if (!xstrcmp(slurm_conf.accounting_storage_type, |
| "accounting_storage/mysql")) { |
| if (!slurm_conf.accounting_storage_port) |
| slurm_conf.accounting_storage_port = |
| DEFAULT_MYSQL_PORT; |
| if (!slurmdbd_conf->storage_loc) |
| slurmdbd_conf->storage_loc = |
| xstrdup(DEFAULT_ACCOUNTING_DB); |
| } else { |
| if (!slurm_conf.accounting_storage_port) |
| slurm_conf.accounting_storage_port = |
| DEFAULT_STORAGE_PORT; |
| if (!slurmdbd_conf->storage_loc) |
| slurmdbd_conf->storage_loc = |
| xstrdup(DEFAULT_STORAGE_LOC); |
| } |
| |
| if (slurmdbd_conf->archive_dir) { |
| if (stat(slurmdbd_conf->archive_dir, &buf) < 0) |
| fatal("Failed to stat the archive directory %s: %m", |
| slurmdbd_conf->archive_dir); |
| if (!(buf.st_mode & S_IFDIR)) |
| fatal("archive directory %s isn't a directory", |
| slurmdbd_conf->archive_dir); |
| |
| if (access(slurmdbd_conf->archive_dir, W_OK) < 0) |
| fatal("archive directory %s is not writable", |
| slurmdbd_conf->archive_dir); |
| } |
| |
| if (slurmdbd_conf->archive_script) { |
| if (stat(slurmdbd_conf->archive_script, &buf) < 0) |
| fatal("Failed to stat the archive script %s: %m", |
| slurmdbd_conf->archive_dir); |
| |
| if (!(buf.st_mode & S_IFREG)) |
| fatal("archive script %s isn't a regular file", |
| slurmdbd_conf->archive_script); |
| |
| if (access(slurmdbd_conf->archive_script, X_OK) < 0) |
| fatal("archive script %s is not executable", |
| slurmdbd_conf->archive_script); |
| } |
| |
| if (!slurmdbd_conf->purge_event) |
| slurmdbd_conf->purge_event = NO_VAL; |
| if (!slurmdbd_conf->purge_job) |
| slurmdbd_conf->purge_job = NO_VAL; |
| if (!slurmdbd_conf->purge_resv) |
| slurmdbd_conf->purge_resv = NO_VAL; |
| if (!slurmdbd_conf->purge_step) |
| slurmdbd_conf->purge_step = NO_VAL; |
| if (!slurmdbd_conf->purge_suspend) |
| slurmdbd_conf->purge_suspend = NO_VAL; |
| if (!slurmdbd_conf->purge_txn) |
| slurmdbd_conf->purge_txn = NO_VAL; |
| if (!slurmdbd_conf->purge_usage) |
| slurmdbd_conf->purge_usage = NO_VAL; |
| |
| slurm_conf.last_update = time(NULL); |
| slurm_mutex_unlock(&conf_mutex); |
| return SLURM_SUCCESS; |
| } |
| |
| /* Log the current configuration using verbose() */ |
| extern void log_config(void) |
| { |
| list_t *dbd_config_list; |
| config_key_pair_t *key_pair; |
| list_itr_t *itr; |
| |
| if (slurmdbd_conf->debug_level < LOG_LEVEL_DEBUG2) |
| return; |
| |
| dbd_config_list = dump_config(); |
| |
| itr = list_iterator_create(dbd_config_list); |
| while ((key_pair = list_next(itr))) |
| debug2("%-22s = %s", key_pair->name, key_pair->value); |
| list_iterator_destroy(itr); |
| |
| FREE_NULL_LIST(dbd_config_list); |
| } |
| |
| /* |
| * Dump the configuration in name,value pairs for output to |
| * "sacctmgr show config", caller must call list_destroy() |
| */ |
| extern list_t *dump_config(void) |
| { |
| char time_str[32]; |
| char *tmp_ptr = NULL; |
| list_t *my_list = list_create(destroy_config_key_pair); |
| |
| add_key_pair_bool(my_list, "AllowNoDefAcct", |
| (slurmdbd_conf->flags & DBD_CONF_FLAG_ALLOW_NO_DEF_ACCT)); |
| |
| add_key_pair(my_list, "ArchiveDir", "%s", slurmdbd_conf->archive_dir); |
| |
| add_key_pair_bool(my_list, "ArchiveEvents", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_event)); |
| |
| add_key_pair_bool(my_list, "ArchiveJobs", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_job)); |
| |
| add_key_pair_bool(my_list, "ArchiveResvs", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_resv)); |
| |
| add_key_pair(my_list, "ArchiveScript", "%s", |
| slurmdbd_conf->archive_script); |
| |
| add_key_pair_bool(my_list, "ArchiveSteps", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_step)); |
| |
| add_key_pair_bool(my_list, "ArchiveSuspend", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_suspend)); |
| |
| add_key_pair_bool(my_list, "ArchiveTXN", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_txn)); |
| |
| add_key_pair_bool(my_list, "ArchiveUsage", |
| SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_usage)); |
| |
| add_key_pair(my_list, "AuthAltTypes", "%s", slurm_conf.authalttypes); |
| |
| add_key_pair(my_list, "AuthAltParameters", "%s", |
| slurm_conf.authalt_params); |
| |
| add_key_pair(my_list, "AuthInfo", "%s", slurm_conf.authinfo); |
| |
| add_key_pair(my_list, "AuthType", "%s", slurm_conf.authtype); |
| |
| tmp_ptr = xmalloc(256); |
| slurm_make_time_str((time_t *)&boot_time, tmp_ptr, 256); |
| add_key_pair(my_list, "BOOT_TIME", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| add_key_pair_bool(my_list, "CommitDelay", slurmdbd_conf->commit_delay); |
| |
| add_key_pair(my_list, "CommunicationParameters", "%s", |
| slurm_conf.comm_params); |
| |
| add_key_pair(my_list, "DbdAddr", "%s", slurmdbd_conf->dbd_addr); |
| |
| add_key_pair(my_list, "DbdBackupHost", "%s", slurmdbd_conf->dbd_backup); |
| |
| add_key_pair(my_list, "DbdHost", "%s", slurmdbd_conf->dbd_host); |
| |
| add_key_pair(my_list, "DbdPort", "%u", slurmdbd_conf->dbd_port); |
| |
| add_key_pair_own(my_list, "DebugFlags", |
| debug_flags2str(slurm_conf.debug_flags)); |
| |
| add_key_pair(my_list, "DebugLevel", "%s", |
| log_num2string(slurmdbd_conf->debug_level)); |
| |
| add_key_pair(my_list, "DebugLevelSyslog", "%s", |
| log_num2string(slurmdbd_conf->syslog_debug)); |
| |
| add_key_pair(my_list, "DefaultQOS", "%s", slurmdbd_conf->default_qos); |
| |
| add_key_pair_bool(my_list, "DisableCoordDBD", |
| (slurmdbd_conf->flags & |
| DBD_CONF_FLAG_DISABLE_COORD_DBD)); |
| |
| add_key_pair(my_list, "HashPlugin", "%s", slurm_conf.hash_plugin); |
| |
| add_key_pair(my_list, "LogFile", "%s", slurmdbd_conf->log_file); |
| |
| secs2time_str(slurmdbd_conf->max_time_range, time_str, |
| sizeof(time_str)); |
| add_key_pair(my_list, "MaxQueryTimeRange", "%s", time_str); |
| |
| add_key_pair(my_list, "MessageTimeout", "%u secs", |
| slurm_conf.msg_timeout); |
| |
| add_key_pair(my_list, "Parameters", "%s", slurmdbd_conf->parameters); |
| |
| add_key_pair(my_list, "PidFile", "%s", slurmdbd_conf->pid_file); |
| |
| add_key_pair(my_list, "PluginDir", "%s", slurm_conf.plugindir); |
| |
| tmp_ptr = xmalloc(128); |
| private_data_string(slurm_conf.private_data, tmp_ptr, 128); |
| add_key_pair(my_list, "PrivateData", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_event != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_event, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeEventAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_job != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_job, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeJobAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_resv != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_resv, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeResvAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_step != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_step, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeStepAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_suspend != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_suspend, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeSuspendAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_txn != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_txn, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeTXNAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| if (slurmdbd_conf->purge_usage != NO_VAL) { |
| tmp_ptr = xmalloc(32); |
| slurmdb_purge_string(slurmdbd_conf->purge_usage, |
| tmp_ptr, 32 , 1); |
| } else |
| tmp_ptr = xstrdup("NONE"); |
| |
| add_key_pair(my_list, "PurgeUsageAfter", "%s", tmp_ptr); |
| xfree(tmp_ptr); |
| |
| add_key_pair_own(my_list, "SLURMDBD_CONF", |
| get_extra_conf_path("slurmdbd.conf")); |
| |
| add_key_pair(my_list, "SLURMDBD_VERSION", "%s", SLURM_VERSION_STRING); |
| |
| add_key_pair(my_list, "SlurmUser", "%s(%u)", slurm_conf.slurm_user_name, |
| slurm_conf.slurm_user_id); |
| |
| add_key_pair(my_list, "StorageBackupHost", "%s", |
| slurm_conf.accounting_storage_backup_host); |
| |
| add_key_pair(my_list, "StorageHost", "%s", |
| slurm_conf.accounting_storage_host); |
| |
| add_key_pair(my_list, "StorageLoc", "%s", slurmdbd_conf->storage_loc); |
| |
| add_key_pair(my_list, "StorageParameters", "%s", |
| slurm_conf.accounting_storage_params); |
| |
| /* StoragePass should NOT be passed due to security reasons */ |
| |
| add_key_pair(my_list, "StoragePort", "%u", |
| slurm_conf.accounting_storage_port); |
| |
| add_key_pair(my_list, "StorageType", "%s", |
| slurm_conf.accounting_storage_type); |
| |
| add_key_pair(my_list, "StorageUser", "%s", slurmdbd_conf->storage_user); |
| |
| add_key_pair(my_list, "TCPTimeout", "%u secs", slurm_conf.tcp_timeout); |
| |
| add_key_pair(my_list, "TLSParameters", "%s", slurm_conf.tls_params); |
| |
| add_key_pair(my_list, "TLSType", "%s", slurm_conf.tls_type); |
| |
| add_key_pair_bool(my_list, "TrackWCKey", |
| slurmdbd_conf->track_wckey); |
| |
| add_key_pair_bool(my_list, "TrackSlurmctldDown", |
| slurmdbd_conf->track_ctld); |
| |
| return my_list; |
| } |