blob: 99e31599177a898cfecbcc70df93fde89429da11 [file] [log] [blame] [edit]
/****************************************************************************\
* config_info.c - get/print the system configuration information of slurm
*****************************************************************************
* Copyright (C) 2002-2007 The Regents of the University of California.
* Copyright (C) 2008-2010 Lawrence Livermore National Security.
* Portions Copyright (C) 2010 SchedMD <https://www.schedmd.com>.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Morris Jette <jette1@llnl.gov> and Kevin Tew <tew1@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 <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include "slurm/slurm.h"
#include "src/common/cpu_frequency.h"
#include "src/common/list.h"
#include "src/common/parse_time.h"
#include "src/common/read_config.h"
#include "src/common/slurm_auth.h"
#include "src/common/slurm_protocol_api.h"
#include "src/common/slurm_resource_info.h"
#include "src/common/slurm_selecttype_info.h"
#include "src/common/xmalloc.h"
#include "src/common/xstring.h"
/* Local functions */
static void _write_group_header(FILE* out, char * header);
static void _write_key_pairs(FILE* out, void *key_pairs);
static void _print_config_plugin_params_list(FILE* out, List l, char *title);
/*
* slurm_api_version - Return a single number reflecting the Slurm API's
* version number. Use the macros SLURM_VERSION_NUM, SLURM_VERSION_MAJOR,
* SLURM_VERSION_MINOR, and SLURM_VERSION_MICRO to work with this value
* RET API's version number
*/
extern long slurm_api_version (void)
{
return (long) SLURM_API_VERSION;
}
static char *
_reset_period_str(uint16_t reset_period)
{
switch (reset_period) {
case PRIORITY_RESET_NONE:
return "NONE";
case PRIORITY_RESET_NOW:
return "NOW";
case PRIORITY_RESET_DAILY:
return "DAILY";
case PRIORITY_RESET_WEEKLY:
return "WEEKLY";
case PRIORITY_RESET_MONTHLY:
return "MONTHLY";
case PRIORITY_RESET_QUARTERLY:
return "QUARTERLY";
case PRIORITY_RESET_YEARLY:
return "YEARLY";
default:
return "UNKNOWN";
}
}
/*
* slurm_write_ctl_conf - write the contents of slurm control configuration
* IN slurm_ctl_conf_ptr - slurm control configuration pointer
* IN node_info_ptr - pointer to node table of information
* IN part_info_ptr - pointer to partition information
*/
void slurm_write_ctl_conf ( slurm_ctl_conf_info_msg_t * slurm_ctl_conf_ptr,
node_info_msg_t * node_info_ptr,
partition_info_msg_t * part_info_ptr)
{
int i = 0;
char time_str[32];
char *tmp_str = NULL;
char *base_path = NULL;
char *path = NULL;
void *ret_list = NULL;
uint16_t val, force;
FILE *fp = NULL;
partition_info_t *p = NULL;
struct records {
char *rec;
hostlist_t hostlist;
struct records *next;
} *rp = NULL;
struct records *crp;
if ( slurm_ctl_conf_ptr == NULL )
return ;
slurm_make_time_str ((time_t *)&slurm_ctl_conf_ptr->last_update,
time_str, sizeof(time_str));
/* open new slurm.conf.<datetime> file for write. This file will
* contain the currently running slurm configuration. */
base_path = getenv("SLURM_CONF");
if (base_path == NULL)
base_path = default_slurm_config_file;
xstrfmtcat (path, "%s.%s", base_path, time_str);
debug("Writing slurm.conf file: %s", path);
if ( ( fp = fopen(path, "w") ) == NULL ) {
fprintf(stderr, "Could not create file %s: %s\n", path,
strerror(errno));
xfree(path);
return;
}
fprintf(fp,
"########################################################\n");
fprintf(fp,
"# Configuration file for Slurm - %s #\n", time_str);
fprintf(fp,
"########################################################\n");
fprintf(fp, "#\n#\n");
ret_list = slurm_ctl_conf_2_key_pairs(slurm_ctl_conf_ptr);
if (ret_list) {
_write_key_pairs(fp, ret_list);
FREE_NULL_LIST(ret_list);
}
_write_group_header (fp, "NODES");
/* Write node info; first create a string (tmp_str) that contains
* all fields associated with a node (but do not include the node
* name itself). Search for duplicate tmp_str records as we process
* each node entry so not to have duplicates. Associate each node
* name that has equal tmp_str records and create a hostlist_t string
* for that record. */
for (i = 0; i < node_info_ptr->record_count; i++) {
if (node_info_ptr->node_array[i].name == NULL)
continue;
if (node_info_ptr->node_array[i].node_hostname != NULL &&
xstrcmp(node_info_ptr->node_array[i].node_hostname,
node_info_ptr->node_array[i].name))
xstrfmtcat(tmp_str, " NodeHostName=%s",
node_info_ptr->node_array[i].node_hostname);
if (node_info_ptr->node_array[i].node_addr != NULL &&
xstrcmp(node_info_ptr->node_array[i].node_addr,
node_info_ptr->node_array[i].name))
xstrfmtcat(tmp_str, " NodeAddr=%s",
node_info_ptr->node_array[i].node_addr);
if (node_info_ptr->node_array[i].sockets)
xstrfmtcat(tmp_str, " Sockets=%u",
node_info_ptr->node_array[i].sockets);
if (node_info_ptr->node_array[i].cores)
xstrfmtcat(tmp_str, " CoresPerSocket=%u",
node_info_ptr->node_array[i].cores);
if (node_info_ptr->node_array[i].threads)
xstrfmtcat(tmp_str, " ThreadsPerCore=%u",
node_info_ptr->node_array[i].threads);
if (node_info_ptr->node_array[i].gres != NULL)
xstrfmtcat(tmp_str, " Gres=%s",
node_info_ptr->node_array[i].gres);
if (node_info_ptr->node_array[i].real_memory > 1)
xstrfmtcat(tmp_str, " RealMemory=%"PRIu64"",
node_info_ptr->node_array[i].real_memory);
if (node_info_ptr->node_array[i].tmp_disk)
xstrfmtcat(tmp_str, " TmpDisk=%u",
node_info_ptr->node_array[i].tmp_disk);
if (node_info_ptr->node_array[i].weight != 1)
xstrfmtcat(tmp_str, " Weight=%u",
node_info_ptr->node_array[i].weight);
if (node_info_ptr->node_array[i].features != NULL)
xstrfmtcat(tmp_str, " Feature=%s",
node_info_ptr->node_array[i].features);
if (node_info_ptr->node_array[i].port &&
node_info_ptr->node_array[i].port
!= slurm_ctl_conf_ptr->slurmd_port)
xstrfmtcat(tmp_str, " Port=%u",
node_info_ptr->node_array[i].port);
/* check for duplicate records */
for (crp = rp; crp != NULL; crp = crp->next) {
if (!xstrcmp(crp->rec, tmp_str)) {
xfree(tmp_str);
break;
}
}
if (crp == NULL) {
crp = xmalloc(sizeof(struct records));
crp->rec = tmp_str;
tmp_str = NULL; /* transfered to record */
crp->hostlist = hostlist_create("");
hostlist_push(crp->hostlist,
node_info_ptr->node_array[i].name);
crp->next = rp;
rp = crp;
} else {
hostlist_push(crp->hostlist,
node_info_ptr->node_array[i].name);
}
}
/* now write the node strings to the output file */
for (crp = rp; crp != NULL; crp = crp->next) {
tmp_str = hostlist_ranged_string_xmalloc(crp->hostlist);
fprintf(fp, "NodeName=%s%s\n", tmp_str, crp->rec);
debug("Hostlist: %s written to output file.", tmp_str);
xfree(tmp_str);
xfree(crp->rec);
hostlist_destroy(crp->hostlist);
}
/* free structure elements */
while (rp != NULL) {
crp = rp;
rp = rp->next;
xfree(crp);
}
_write_group_header (fp, "PARTITIONS");
/* now write partition info */
p = part_info_ptr->partition_array;
for (i = 0; i < part_info_ptr->record_count; i++) {
if (p[i].name == NULL)
continue;
fprintf(fp, "PartitionName=%s", p[i].name);
if (p[i].allow_alloc_nodes &&
(xstrcasecmp(p[i].allow_alloc_nodes, "ALL") != 0))
fprintf(fp, " AllocNodes=%s",
p[i].allow_alloc_nodes);
if (p[i].allow_accounts &&
(xstrcasecmp(p[i].allow_accounts, "ALL") != 0))
fprintf(fp, " AllowAccounts=%s", p[i].allow_accounts);
if (p[i].allow_groups &&
(xstrcasecmp(p[i].allow_groups, "ALL") != 0))
fprintf(fp, " AllowGroups=%s", p[i].allow_groups);
if (p[i].allow_qos && (xstrcasecmp(p[i].allow_qos, "ALL") != 0))
fprintf(fp, " AllowQos=%s", p[i].allow_qos);
if (p[i].alternate != NULL)
fprintf(fp, " Alternate=%s", p[i].alternate);
if (p[i].flags & PART_FLAG_DEFAULT)
fprintf(fp, " Default=YES");
if (p[i].def_mem_per_cpu & MEM_PER_CPU) {
if (p[i].def_mem_per_cpu != MEM_PER_CPU)
fprintf(fp, " DefMemPerCPU=%"PRIu64"",
p[i].def_mem_per_cpu & (~MEM_PER_CPU));
} else if (p[i].def_mem_per_cpu != 0)
fprintf(fp, " DefMemPerNode=%"PRIu64"",
p[i].def_mem_per_cpu);
if (!p[i].allow_accounts && p[i].deny_accounts)
fprintf(fp, " DenyAccounts=%s", p[i].deny_accounts);
if (!p[i].allow_qos && p[i].deny_qos)
fprintf(fp, " DenyQos=%s", p[i].deny_qos);
if (p[i].default_time != NO_VAL) {
if (p[i].default_time == INFINITE)
fprintf(fp, " DefaultTime=UNLIMITED");
else {
char time_line[32];
secs2time_str(p[i].default_time * 60, time_line,
sizeof(time_line));
fprintf(fp, " DefaultTime=%s", time_line);
}
}
if (p[i].flags & PART_FLAG_NO_ROOT)
fprintf(fp, " DisableRootJobs=YES");
if (p[i].flags & PART_FLAG_EXCLUSIVE_USER)
fprintf(fp, " ExclusiveUser=YES");
if (p[i].grace_time)
fprintf(fp, " GraceTime=%"PRIu32"", p[i].grace_time);
if (p[i].flags & PART_FLAG_HIDDEN)
fprintf(fp, " Hidden=YES");
if (p[i].flags & PART_FLAG_LLN)
fprintf(fp, " LLN=YES");
if (p[i].max_cpus_per_node != INFINITE)
fprintf(fp, " MaxCPUsPerNode=%"PRIu32"",
p[i].max_cpus_per_node);
if (p[i].max_mem_per_cpu & MEM_PER_CPU) {
if (p[i].max_mem_per_cpu != MEM_PER_CPU)
fprintf(fp, " MaxMemPerCPU=%"PRIu64"",
p[i].max_mem_per_cpu & (~MEM_PER_CPU));
} else if (p[i].max_mem_per_cpu != 0)
fprintf(fp, " MaxMemPerNode=%"PRIu64"",
p[i].max_mem_per_cpu);
if (p[i].max_nodes != INFINITE)
fprintf(fp, " MaxNodes=%u", p[i].max_nodes);
if (p[i].max_time != INFINITE) {
char time_line[32];
secs2time_str(p[i].max_time * 60, time_line,
sizeof(time_line));
fprintf(fp, " MaxTime=%s", time_line);
}
if (p[i].min_nodes != 1)
fprintf(fp, " MinNodes=%u", p[i].min_nodes);
if (p[i].nodes != NULL)
fprintf(fp, " Nodes=%s", p[i].nodes);
if (p[i].preempt_mode != NO_VAL16)
fprintf(fp, " PreemptMode=%s",
preempt_mode_string(p[i].preempt_mode));
if (p[i].priority_job_factor != 1)
fprintf(fp, " PriorityJobFactor=%"PRIu16,
p[i].priority_job_factor);
if (p[i].priority_tier != 1)
fprintf(fp, " PriorityTier=%"PRIu16,
p[i].priority_tier);
if (p[i].qos_char != NULL)
fprintf(fp, " QOS=%s", p[i].qos_char);
if (p[i].flags & PART_FLAG_REQ_RESV)
fprintf(fp, " ReqResv=YES");
if (p[i].flags & PART_FLAG_ROOT_ONLY)
fprintf(fp, " RootOnly=YES");
if (p[i].cr_type & CR_CORE)
fprintf(fp, " SelectTypeParameters=CR_CORE");
else if (p[i].cr_type & CR_SOCKET)
fprintf(fp, " SelectTypeParameters=CR_SOCKET");
force = p[i].max_share & SHARED_FORCE;
val = p[i].max_share & (~SHARED_FORCE);
if (val == 0)
fprintf(fp, " Shared=EXCLUSIVE");
else if (force) {
fprintf(fp, " Shared=FORCE:%u", val);
} else if (val != 1)
fprintf(fp, " Shared=YES:%u", val);
if (p[i].state_up == PARTITION_UP)
fprintf(fp, " State=UP");
else if (p[i].state_up == PARTITION_DOWN)
fprintf(fp, " State=DOWN");
else if (p[i].state_up == PARTITION_INACTIVE)
fprintf(fp, " State=INACTIVE");
else if (p[i].state_up == PARTITION_DRAIN)
fprintf(fp, " State=DRAIN");
else
fprintf(fp, " State=UNKNOWN");
if (p[i].billing_weights_str != NULL)
fprintf(fp, " TRESBillingWeights=%s",
p[i].billing_weights_str);
fprintf(fp, "\n");
}
fprintf(stdout, "Slurm config saved to %s\n", path);
xfree(path);
fclose(fp);
}
static void _print_config_plugin_params_list(FILE* out, List l, char *title)
{
ListIterator itr = NULL;
config_plugin_params_t *p;
if (!l || !list_count(l))
return;
fprintf(out, "%s", title);
itr = list_iterator_create(l);
while ((p = list_next(itr))){
fprintf(out, "\n----- %s -----\n", p->name);
slurm_print_key_pairs(out, p->key_pairs,"");
}
list_iterator_destroy(itr);
}
/*
* slurm_print_ctl_conf - output the contents of slurm control configuration
* message as loaded using slurm_load_ctl_conf()
* IN out - file to write to
* IN slurm_ctl_conf_ptr - slurm control configuration pointer
*/
void slurm_print_ctl_conf ( FILE* out,
slurm_ctl_conf_info_msg_t * slurm_ctl_conf_ptr )
{
char time_str[32], tmp_str[128];
void *ret_list = NULL;
char *select_title = "Select Plugin Configuration";
uint32_t cluster_flags = slurmdb_setup_cluster_flags();
char *tmp2_str = NULL;
if (cluster_flags & CLUSTER_FLAG_CRAY)
select_title = "\nCray configuration\n";
if (slurm_ctl_conf_ptr == NULL)
return;
slurm_make_time_str((time_t *)&slurm_ctl_conf_ptr->last_update,
time_str, sizeof(time_str));
snprintf(tmp_str, sizeof(tmp_str), "Configuration data as of %s\n",
time_str);
ret_list = slurm_ctl_conf_2_key_pairs(slurm_ctl_conf_ptr);
if (ret_list) {
slurm_print_key_pairs(out, ret_list, tmp_str);
FREE_NULL_LIST(ret_list);
}
slurm_print_key_pairs(out, slurm_ctl_conf_ptr->acct_gather_conf,
"\nAccount Gather Configuration:\n");
slurm_print_key_pairs(out, slurm_ctl_conf_ptr->cgroup_conf,
"\nCgroup Support Configuration:\n");
slurm_print_key_pairs(out, slurm_ctl_conf_ptr->ext_sensors_conf,
"\nExternal Sensors Configuration:\n");
xstrcat(tmp2_str, "\nNode Features Configuration:");
_print_config_plugin_params_list(out,
(List) slurm_ctl_conf_ptr->node_features_conf, tmp2_str);
xfree(tmp2_str);
xstrcat(tmp2_str, "\nSlurmctld Plugstack Plugins Configuration:");
_print_config_plugin_params_list(out,
(List) slurm_ctl_conf_ptr->slurmctld_plugstack_conf, tmp2_str);
xfree(tmp2_str);
slurm_print_key_pairs(out, slurm_ctl_conf_ptr->select_conf_key_pairs,
select_title);
}
extern void *slurm_ctl_conf_2_key_pairs (slurm_ctl_conf_t* slurm_ctl_conf_ptr)
{
List ret_list = NULL;
config_key_pair_t *key_pair;
char tmp_str[128];
uint32_t cluster_flags = slurmdb_setup_cluster_flags();
int i;
if ( slurm_ctl_conf_ptr == NULL )
return NULL;
ret_list = list_create(destroy_config_key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageBackupHost");
key_pair->value =
xstrdup(slurm_ctl_conf_ptr->accounting_storage_backup_host);
list_append(ret_list, key_pair);
accounting_enforce_string(slurm_ctl_conf_ptr->
accounting_storage_enforce,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageEnforce");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageHost");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_host);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageLoc");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_loc);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->accounting_storage_port);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStoragePort");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageTRES");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_tres);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStorageUser");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_user);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AccountingStoreJobComment");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->acctng_store_job_comment ? "Yes" : "No");
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AcctGatherEnergyType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_energy_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AcctGatherFilesystemType");
key_pair->value =
xstrdup(slurm_ctl_conf_ptr->acct_gather_filesystem_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AcctGatherInterconnectType");
key_pair->value =
xstrdup(slurm_ctl_conf_ptr->acct_gather_interconnect_type);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->acct_gather_node_freq);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AcctGatherNodeFreq");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AcctGatherProfileType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_profile_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AllowSpecResourcesUsage");
key_pair->value = xstrdup_printf(
"%u", slurm_ctl_conf_ptr->use_spec_resources);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AuthInfo");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->authinfo);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("AuthType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->authtype);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->batch_start_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("BatchStartTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
slurm_make_time_str((time_t *)&slurm_ctl_conf_ptr->boot_time,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("BOOT_TIME");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("BurstBufferType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->bb_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CheckpointType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->checkpoint_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ClusterName");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->cluster_name);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CommunicationParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->comm_params);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->complete_wait);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CompleteWait");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CoreSpecPlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->core_spec_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CpuFreqDef");
cpu_freq_to_string(tmp_str, sizeof(tmp_str),
slurm_ctl_conf_ptr->cpu_freq_def);
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CpuFreqGovernors");
cpu_freq_govlist_to_string(tmp_str, sizeof(tmp_str),
slurm_ctl_conf_ptr->cpu_freq_govs);
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("CryptoType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->crypto_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("DebugFlags");
key_pair->value = debug_flags2str(slurm_ctl_conf_ptr->debug_flags);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->def_mem_per_cpu == INFINITE64) {
key_pair->name = xstrdup("DefMemPerNode");
key_pair->value = xstrdup("UNLIMITED");
} else if (slurm_ctl_conf_ptr->def_mem_per_cpu & MEM_PER_CPU) {
key_pair->name = xstrdup("DefMemPerCPU");
snprintf(tmp_str, sizeof(tmp_str), "%"PRIu64"",
slurm_ctl_conf_ptr->def_mem_per_cpu &
(~MEM_PER_CPU));
key_pair->value = xstrdup(tmp_str);
} else if (slurm_ctl_conf_ptr->def_mem_per_cpu) {
key_pair->name = xstrdup("DefMemPerNode");
snprintf(tmp_str, sizeof(tmp_str), "%"PRIu64"",
slurm_ctl_conf_ptr->def_mem_per_cpu);
key_pair->value = xstrdup(tmp_str);
} else {
key_pair->name = xstrdup("DefMemPerNode");
key_pair->value = xstrdup("UNLIMITED");
}
key_pair = xmalloc(sizeof(config_key_pair_t));
list_append(ret_list, key_pair);
key_pair->name = xstrdup("DisableRootJobs");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->disable_root_jobs ? "Yes" : "No");
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("EioTimeout");
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->eio_timeout);
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
list_append(ret_list, key_pair);
key_pair->name = xstrdup("EnforcePartLimits");
key_pair->value = xstrdup(
parse_part_enforce_type_2str(
slurm_ctl_conf_ptr->enforce_part_limits));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("Epilog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->epilog);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u usec",
slurm_ctl_conf_ptr->epilog_msg_time);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("EpilogMsgTime");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("EpilogSlurmctld");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->epilog_slurmctld);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ExtSensorsType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->ext_sensors_type);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->ext_sensors_freq);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ExtSensorsFreq");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
if (xstrcmp(slurm_ctl_conf_ptr->priority_type, "priority/basic")) {
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->fs_dampening_factor);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("FairShareDampeningFactor");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
}
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->fast_schedule);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("FastSchedule");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("FederationParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->fed_params);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->first_job_id);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("FirstJobId");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->get_env_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("GetEnvTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("GresTypes");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->gres_plugins);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->group_force);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("GroupUpdateForce");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->group_time);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("GroupUpdateTime");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->hash_val != NO_VAL) {
if (slurm_ctl_conf_ptr->hash_val == slurm_get_hash_val())
snprintf(tmp_str, sizeof(tmp_str), "Match");
else {
snprintf(tmp_str, sizeof(tmp_str),
"Different Ours=0x%x Slurmctld=0x%x",
slurm_get_hash_val(),
slurm_ctl_conf_ptr->hash_val);
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("HASH_VAL");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
}
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->health_check_interval);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("HealthCheckInterval");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("HealthCheckNodeState");
key_pair->value = health_check_node_state_str(slurm_ctl_conf_ptr->
health_check_node_state);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("HealthCheckProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->health_check_program);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->inactive_limit);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("InactiveLimit");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobAcctGatherFrequency");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_freq);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobAcctGatherType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobAcctGatherParams");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_params);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCheckpointDir");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_ckpt_dir);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCompHost");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_host);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCompLoc");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_loc);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->job_comp_port);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCompPort");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCompType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCompUser");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_user);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobContainerType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_container_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCredentialPrivateKey");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->
job_credential_private_key);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobCredentialPublicCertificate");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->job_credential_public_certificate);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobDefaults");
key_pair->value =
job_defaults_str(slurm_ctl_conf_ptr->job_defaults_list);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->job_file_append);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobFileAppend");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobRequeue");
key_pair->value = xstrdup_printf(
"%u", slurm_ctl_conf_ptr->job_requeue);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("JobSubmitPlugins");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_submit_plugins);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->keep_alive_time == NO_VAL16)
snprintf(tmp_str, sizeof(tmp_str), "SYSTEM_DEFAULT");
else {
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->keep_alive_time);
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("KeepAliveTime");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->kill_on_bad_exit);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("KillOnBadExit");
key_pair->value = xstrdup_printf(
"%u", slurm_ctl_conf_ptr->kill_on_bad_exit);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->kill_wait);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("KillWait");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("LaunchParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->launch_params);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("LaunchType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->launch_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("Layouts");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->layouts);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("Licenses");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->licenses);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("LicensesUsed");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->licenses_used);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("LogTimeFormat");
if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_ISO8601_MS)
key_pair->value = xstrdup("iso8601_ms");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_ISO8601)
key_pair->value = xstrdup("iso8601");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_RFC5424_MS)
key_pair->value = xstrdup("rfc5424_ms");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_RFC5424)
key_pair->value = xstrdup("rfc5424");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_CLOCK)
key_pair->value = xstrdup("clock");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_SHORT)
key_pair->value = xstrdup("short");
else if (slurm_ctl_conf_ptr->log_fmt == LOG_FMT_THREAD_ID)
key_pair->value = xstrdup("thread_id");
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MailDomain");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mail_domain);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MailProg");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mail_prog);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->max_array_sz);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MaxArraySize");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->max_job_cnt);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MaxJobCount");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->max_job_id);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MaxJobId");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->max_mem_per_cpu == INFINITE64) {
key_pair->name = xstrdup("MaxMemPerNode");
key_pair->value = xstrdup("UNLIMITED");
} else if (slurm_ctl_conf_ptr->max_mem_per_cpu & MEM_PER_CPU) {
key_pair->name = xstrdup("MaxMemPerCPU");
snprintf(tmp_str, sizeof(tmp_str), "%"PRIu64"",
slurm_ctl_conf_ptr->max_mem_per_cpu & (~MEM_PER_CPU));
key_pair->value = xstrdup(tmp_str);
} else if (slurm_ctl_conf_ptr->max_mem_per_cpu) {
key_pair->name = xstrdup("MaxMemPerNode");
snprintf(tmp_str, sizeof(tmp_str), "%"PRIu64"",
slurm_ctl_conf_ptr->max_mem_per_cpu);
key_pair->value = xstrdup(tmp_str);
} else {
key_pair->name = xstrdup("MaxMemPerNode");
key_pair->value = xstrdup("UNLIMITED");
}
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->max_step_cnt);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MaxStepCount");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->max_tasks_per_node);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MaxTasksPerNode");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MCSPlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mcs_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MCSParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mcs_plugin_params);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MemLimitEnforce");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->mem_limit_enforce ? "Yes" : "No");
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->msg_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MessageTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->min_job_age);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MinJobAge");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MpiDefault");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mpi_default);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MpiParams");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->mpi_params);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MsgAggregationParams");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->msg_aggr_params);
list_append(ret_list, key_pair);
if (cluster_flags & CLUSTER_FLAG_MULTSD) {
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("MULTIPLE_SLURMD");
key_pair->value = xstrdup("Yes");
list_append(ret_list, key_pair);
}
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->next_job_id);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("NEXT_JOB_ID");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("NodeFeaturesPlugins");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->node_features_plugins);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->over_time_limit == INFINITE16)
snprintf(tmp_str, sizeof(tmp_str), "UNLIMITED");
else
snprintf(tmp_str, sizeof(tmp_str), "%u min",
slurm_ctl_conf_ptr->over_time_limit);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("OverTimeLimit");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PluginDir");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->plugindir);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PlugStackConfig");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->plugstack);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PowerParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->power_parameters);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PowerPlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->power_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PreemptMode");
key_pair->value = xstrdup(preempt_mode_string(slurm_ctl_conf_ptr->
preempt_mode));
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PreemptType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->preempt_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->priority_params);
list_append(ret_list, key_pair);
if (xstrcmp(slurm_ctl_conf_ptr->priority_type, "priority/basic") == 0) {
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->priority_type);
list_append(ret_list, key_pair);
} else {
secs2time_str((time_t) slurm_ctl_conf_ptr->priority_decay_hl,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityDecayHalfLife");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
secs2time_str((time_t)slurm_ctl_conf_ptr->priority_calc_period,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityCalcPeriod");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityFavorSmall");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->priority_favor_small ?
"Yes" : "No");
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityFlags");
key_pair->value = priority_flags_string(slurm_ctl_conf_ptr->
priority_flags);
list_append(ret_list, key_pair);
secs2time_str((time_t) slurm_ctl_conf_ptr->priority_max_age,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityMaxAge");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityUsageResetPeriod");
key_pair->value = xstrdup(_reset_period_str(
slurm_ctl_conf_ptr->
priority_reset_period));
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->priority_type);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->priority_weight_age);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightAge");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->priority_weight_fs);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightFairShare");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->priority_weight_js);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightJobSize");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->priority_weight_part);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightPartition");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->priority_weight_qos);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightQOS");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PriorityWeightTRES");
key_pair->value =
xstrdup(slurm_ctl_conf_ptr->priority_weight_tres);
list_append(ret_list, key_pair);
}
private_data_string(slurm_ctl_conf_ptr->private_data,
tmp_str, sizeof(tmp_str));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PrivateData");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ProctrackType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->proctrack_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("Prolog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->prolog);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->prolog_epilog_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PrologEpilogTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PrologSlurmctld");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->prolog_slurmctld);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PrologFlags");
key_pair->value = prolog_flags2str(slurm_ctl_conf_ptr->prolog_flags);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->propagate_prio_process);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PropagatePrioProcess");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PropagateResourceLimits");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->propagate_rlimits);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("PropagateResourceLimitsExcept");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->
propagate_rlimits_except);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("RebootProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->reboot_program);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ReconfigFlags");
key_pair->value =
reconfig_flags2str(slurm_ctl_conf_ptr->reconfig_flags);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("RequeueExit");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->requeue_exit);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("RequeueExitHold");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->requeue_exit_hold);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResumeFailProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->resume_fail_program);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResumeProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->resume_program);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u nodes/min",
slurm_ctl_conf_ptr->resume_rate);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResumeRate");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->resume_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResumeTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResvEpilog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->resv_epilog);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->resv_over_run == INFINITE16)
snprintf(tmp_str, sizeof(tmp_str), "UNLIMITED");
else
snprintf(tmp_str, sizeof(tmp_str), "%u min",
slurm_ctl_conf_ptr->resv_over_run);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResvOverRun");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ResvProlog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->resv_prolog);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->ret2service);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("ReturnToService");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("RoutePlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->route_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SallocDefaultCommand");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->salloc_default_command);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SbcastParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->sbcast_parameters);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SchedulerParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->sched_params);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->sched_time_slice);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SchedulerTimeSlice");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SchedulerType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->schedtype);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SelectType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->select_type);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->select_type_param) {
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SelectTypeParameters");
key_pair->value = xstrdup(
select_type_param_string(slurm_ctl_conf_ptr->
select_type_param));
list_append(ret_list, key_pair);
}
snprintf(tmp_str, sizeof(tmp_str), "%s(%u)",
slurm_ctl_conf_ptr->slurm_user_name,
slurm_ctl_conf_ptr->slurm_user_id);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmUser");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
slurm_ctl_conf_ptr->slurmctld_addr);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldAddr");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
log_num2string(slurm_ctl_conf_ptr->slurmctld_debug));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldDebug");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
for (i = 0; i < slurm_ctl_conf_ptr->control_cnt; i++) {
key_pair = xmalloc(sizeof(config_key_pair_t));
xstrfmtcat(key_pair->name, "SlurmctldHost[%d]", i);
if (xstrcmp(slurm_ctl_conf_ptr->control_machine[i],
slurm_ctl_conf_ptr->control_addr[i])) {
xstrfmtcat(key_pair->value, "%s(%s)",
slurm_ctl_conf_ptr->control_machine[i],
slurm_ctl_conf_ptr->control_addr[i]);
} else {
key_pair->value =
xstrdup(slurm_ctl_conf_ptr->control_machine[i]);
}
list_append(ret_list, key_pair);
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldLogFile");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_logfile);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->slurmctld_port_count > 1) {
uint32_t high_port = slurm_ctl_conf_ptr->slurmctld_port;
high_port += (slurm_ctl_conf_ptr->slurmctld_port_count - 1);
snprintf(tmp_str, sizeof(tmp_str), "%u-%u",
slurm_ctl_conf_ptr->slurmctld_port, high_port);
} else {
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->slurmctld_port);
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldPort");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
log_num2string(slurm_ctl_conf_ptr->slurmctld_syslog_debug));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldSyslogDebug");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
slurm_ctl_conf_ptr->slurmctld_primary_off_prog);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldPrimaryOffProg");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
slurm_ctl_conf_ptr->slurmctld_primary_on_prog);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldPrimaryOnProg");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->slurmctld_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_params);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
log_num2string(slurm_ctl_conf_ptr->slurmd_debug));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdDebug");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdLogFile");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_logfile);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdParameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_params);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdPidFile");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_pidfile);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->slurmd_port);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdPort");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdSpoolDir");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_spooldir);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s",
log_num2string(slurm_ctl_conf_ptr->slurmd_syslog_debug));
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdSyslogDebug");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->slurmd_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%s(%u)",
slurm_ctl_conf_ptr->slurmd_user_name,
slurm_ctl_conf_ptr->slurmd_user_id);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmdUser");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmSchedLogFile");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->sched_logfile);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->sched_log_level);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmSchedLogLevel");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldPidFile");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_pidfile);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SlurmctldPlugstack");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_plugstack);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SLURM_CONF");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurm_conf);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SLURM_VERSION");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->version);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SrunEpilog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->srun_epilog);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SrunPortRange");
key_pair->value = xstrdup_printf("%u-%u",
(slurm_ctl_conf_ptr->srun_port_range &&
slurm_ctl_conf_ptr->srun_port_range[0] != 0) ?
slurm_ctl_conf_ptr->srun_port_range[0] : 0,
(slurm_ctl_conf_ptr->srun_port_range &&
slurm_ctl_conf_ptr->srun_port_range[1] != 0) ?
slurm_ctl_conf_ptr->srun_port_range[1] : 0);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SrunProlog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->srun_prolog);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("StateSaveLocation");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->state_save_location);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendExcNodes");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_exc_nodes);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendExcParts");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_exc_parts);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_program);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u nodes/min",
slurm_ctl_conf_ptr->suspend_rate);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendRate");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->suspend_time == 0) {
snprintf(tmp_str, sizeof(tmp_str), "NONE");
} else {
snprintf(tmp_str, sizeof(tmp_str), "%d sec",
((int)slurm_ctl_conf_ptr->suspend_time - 1));
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendTime");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
if (slurm_ctl_conf_ptr->suspend_timeout == 0) {
snprintf(tmp_str, sizeof(tmp_str), "NONE");
} else {
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->suspend_timeout);
}
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SuspendTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("SwitchType");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->switch_type);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TaskEpilog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_epilog);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TaskPlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_plugin);
list_append(ret_list, key_pair);
slurm_sprint_cpu_bind_type(tmp_str,
slurm_ctl_conf_ptr->task_plugin_param);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TaskPluginParam");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TaskProlog");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_prolog);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TCPTimeout");
key_pair->value = xstrdup_printf("%u sec",
slurm_ctl_conf_ptr->tcp_timeout);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TmpFS");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->tmp_fs);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TopologyParam");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->topology_param);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TopologyPlugin");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->topology_plugin);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TrackWCKey");
key_pair->value = xstrdup(
slurm_ctl_conf_ptr->track_wckey ? "Yes" : "No");
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u",
slurm_ctl_conf_ptr->tree_width);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("TreeWidth");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("UsePam");
key_pair->value = xstrdup_printf("%u", slurm_ctl_conf_ptr->use_pam);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("UnkillableStepProgram");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->unkillable_program);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->unkillable_timeout);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("UnkillableStepTimeout");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u percent",
slurm_ctl_conf_ptr->vsize_factor);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("VSizeFactor");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
snprintf(tmp_str, sizeof(tmp_str), "%u sec",
slurm_ctl_conf_ptr->wait_time);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("WaitTime");
key_pair->value = xstrdup(tmp_str);
list_append(ret_list, key_pair);
key_pair = xmalloc(sizeof(config_key_pair_t));
key_pair->name = xstrdup("X11Parameters");
key_pair->value = xstrdup(slurm_ctl_conf_ptr->x11_params);
list_append(ret_list, key_pair);
return (void *)ret_list;
}
/*
* slurm_load_ctl_conf - issue RPC to get slurm control configuration
* information if changed since update_time
* IN update_time - time of current configuration data
* IN slurm_ctl_conf_ptr - place to store slurm control configuration
* pointer
* RET 0 on success, otherwise return -1 and set errno to indicate the error
* NOTE: free the response using slurm_free_ctl_conf
*/
int
slurm_load_ctl_conf (time_t update_time, slurm_ctl_conf_t **confp)
{
int rc;
slurm_msg_t req_msg;
slurm_msg_t resp_msg;
last_update_msg_t req;
slurm_msg_t_init(&req_msg);
slurm_msg_t_init(&resp_msg);
memset(&req, 0, sizeof(req));
req.last_update = update_time;
req_msg.msg_type = REQUEST_BUILD_INFO;
req_msg.data = &req;
if (slurm_send_recv_controller_msg(&req_msg, &resp_msg,
working_cluster_rec) < 0)
return SLURM_ERROR;
switch (resp_msg.msg_type) {
case RESPONSE_BUILD_INFO:
*confp = (slurm_ctl_conf_info_msg_t *) resp_msg.data;
break;
case RESPONSE_SLURM_RC:
rc = ((return_code_msg_t *) resp_msg.data)->return_code;
slurm_free_return_code_msg(resp_msg.data);
if (rc)
slurm_seterrno_ret(rc);
break;
default:
slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR);
break;
}
return SLURM_PROTOCOL_SUCCESS;
}
/*
* slurm_load_slurmd_status - issue RPC to get the status of slurmd
* daemon on this machine
* IN slurmd_info_ptr - place to store slurmd status information
* RET 0 or -1 on error
* NOTE: free the response using slurm_free_slurmd_status()
*/
extern int
slurm_load_slurmd_status(slurmd_status_t **slurmd_status_ptr)
{
int rc;
slurm_msg_t req_msg;
slurm_msg_t resp_msg;
uint32_t cluster_flags = slurmdb_setup_cluster_flags();
char *this_addr;
slurm_msg_t_init(&req_msg);
slurm_msg_t_init(&resp_msg);
if (cluster_flags & CLUSTER_FLAG_MULTSD) {
if ((this_addr = getenv("SLURMD_NODENAME"))) {
slurm_conf_get_addr(this_addr, &req_msg.address);
} else {
this_addr = "localhost";
slurm_set_addr(&req_msg.address,
(uint16_t)slurm_get_slurmd_port(),
this_addr);
}
} else {
char this_host[256];
/*
* Set request message address to slurmd on localhost
*/
gethostname_short(this_host, sizeof(this_host));
this_addr = slurm_conf_get_nodeaddr(this_host);
if (this_addr == NULL)
this_addr = xstrdup("localhost");
slurm_set_addr(&req_msg.address,
(uint16_t)slurm_get_slurmd_port(),
this_addr);
xfree(this_addr);
}
req_msg.msg_type = REQUEST_DAEMON_STATUS;
req_msg.data = NULL;
rc = slurm_send_recv_node_msg(&req_msg, &resp_msg, 0);
if ((rc != 0) || !resp_msg.auth_cred) {
error("slurm_slurmd_info: %m");
if (resp_msg.auth_cred)
g_slurm_auth_destroy(resp_msg.auth_cred);
return SLURM_ERROR;
}
if (resp_msg.auth_cred)
g_slurm_auth_destroy(resp_msg.auth_cred);
switch (resp_msg.msg_type) {
case RESPONSE_SLURMD_STATUS:
*slurmd_status_ptr = (slurmd_status_t *) resp_msg.data;
break;
case RESPONSE_SLURM_RC:
rc = ((return_code_msg_t *) resp_msg.data)->return_code;
slurm_free_return_code_msg(resp_msg.data);
if (rc)
slurm_seterrno_ret(rc);
break;
default:
slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR);
break;
}
return SLURM_PROTOCOL_SUCCESS;
}
/*
* slurm_print_slurmd_status - output the contents of slurmd status
* message as loaded using slurm_load_slurmd_status
* IN out - file to write to
* IN slurmd_status_ptr - slurmd status pointer
*/
void slurm_print_slurmd_status (FILE* out,
slurmd_status_t * slurmd_status_ptr)
{
char time_str[32];
if (slurmd_status_ptr == NULL )
return ;
fprintf(out, "Active Steps = %s\n",
slurmd_status_ptr->step_list);
fprintf(out, "Actual CPUs = %u\n",
slurmd_status_ptr->actual_cpus);
fprintf(out, "Actual Boards = %u\n",
slurmd_status_ptr->actual_boards);
fprintf(out, "Actual sockets = %u\n",
slurmd_status_ptr->actual_sockets);
fprintf(out, "Actual cores = %u\n",
slurmd_status_ptr->actual_cores);
fprintf(out, "Actual threads per core = %u\n",
slurmd_status_ptr->actual_threads);
fprintf(out, "Actual real memory = %"PRIu64" MB\n",
slurmd_status_ptr->actual_real_mem);
fprintf(out, "Actual temp disk space = %u MB\n",
slurmd_status_ptr->actual_tmp_disk);
slurm_make_time_str ((time_t *)&slurmd_status_ptr->booted,
time_str, sizeof(time_str));
fprintf(out, "Boot time = %s\n", time_str);
fprintf(out, "Hostname = %s\n",
slurmd_status_ptr->hostname);
if (slurmd_status_ptr->last_slurmctld_msg) {
slurm_make_time_str ((time_t *)
&slurmd_status_ptr->last_slurmctld_msg,
time_str, sizeof(time_str));
fprintf(out, "Last slurmctld msg time = %s\n", time_str);
} else
fprintf(out, "Last slurmctld msg time = NONE\n");
fprintf(out, "Slurmd PID = %u\n",
slurmd_status_ptr->pid);
fprintf(out, "Slurmd Debug = %u\n",
slurmd_status_ptr->slurmd_debug);
fprintf(out, "Slurmd Logfile = %s\n",
slurmd_status_ptr->slurmd_logfile);
fprintf(out, "Version = %s\n",
slurmd_status_ptr->version);
return;
}
/*
* _write_key_pairs - write the contents of slurm
* configuration to an output file
* IN out - file to write to
* IN key_pairs - key pairs of the running slurm configuration
*/
static void _write_key_pairs(FILE* out, void *key_pairs)
{
config_key_pair_t *key_pair;
char *temp = NULL;
List config_list = (List)key_pairs;
ListIterator iter = NULL;
/* define lists of specific configuration sections */
List other_list = list_create(slurm_destroy_char);
List control_list = list_create(slurm_destroy_char);
List accounting_list = list_create(slurm_destroy_char);
List logging_list = list_create(slurm_destroy_char);
List power_list = list_create(slurm_destroy_char);
List sched_list = list_create(slurm_destroy_char);
List topology_list = list_create(slurm_destroy_char);
List timers_list = list_create(slurm_destroy_char);
List debug_list = list_create(slurm_destroy_char);
List proepilog_list = list_create(slurm_destroy_char);
List resconf_list = list_create(slurm_destroy_char);
List proctrac_list = list_create(slurm_destroy_char);
if (!config_list)
return;
iter = list_iterator_create(config_list);
while ((key_pair = list_next(iter))) {
/* Ignore ENV variables in config_list; they'll
* cause problems in an active slurm.conf */
if (!xstrcmp(key_pair->name, "BOOT_TIME") ||
!xstrcmp(key_pair->name, "HASH_VAL") ||
!xstrcmp(key_pair->name, "NEXT_JOB_ID") ||
!xstrcmp(key_pair->name, "SLURM_CONF") ||
!xstrcmp(key_pair->name, "SLURM_VERSION")) {
debug("Ignoring %s (not written)", key_pair->name);
continue;
}
/* Comment out certain key_pairs */
/* - TaskPluginParam=(null type) is not a NULL but
* it does imply no value */
if ((key_pair->value == NULL) ||
(strlen(key_pair->value) == 0) ||
!xstrcasecmp(key_pair->value, "(null type)") ||
!xstrcasecmp(key_pair->value, "(null)") ||
!xstrcasecmp(key_pair->value, "N/A") ||
(!xstrcasecmp(key_pair->name, "KeepAliveTime") &&
!xstrcasecmp(key_pair->value, "SYSTEM_DEFAULT")) ||
!xstrcasecmp(key_pair->name, "DynAllocPort") ||
(!xstrcasecmp(key_pair->name, "DefMemPerNode") &&
!xstrcasecmp(key_pair->value, "UNLIMITED"))) {
temp = xstrdup_printf("#%s=", key_pair->name);
debug("Commenting out %s=%s",
key_pair->name,
key_pair->value);
} else {
if ((!xstrcasecmp(key_pair->name, "ChosLoc")) ||
(!xstrcasecmp(key_pair->name, "Epilog")) ||
(!xstrcasecmp(key_pair->name, "EpilogSlurmctld")) ||
(!xstrcasecmp(key_pair->name,
"HealthCheckProgram")) ||
(!xstrcasecmp(key_pair->name, "MailProg")) ||
(!xstrcasecmp(key_pair->name, "Prolog")) ||
(!xstrcasecmp(key_pair->name, "PrologSlurmctld")) ||
(!xstrcasecmp(key_pair->name, "RebootProgram")) ||
(!xstrcasecmp(key_pair->name, "ResumeProgram")) ||
(!xstrcasecmp(key_pair->name, "ResvEpilog")) ||
(!xstrcasecmp(key_pair->name, "ResvProlog")) ||
(!xstrcasecmp(key_pair->name,
"SallocDefaultCommand")) ||
(!xstrcasecmp(key_pair->name, "SrunEpilog")) ||
(!xstrcasecmp(key_pair->name, "SrunProlog")) ||
(!xstrcasecmp(key_pair->name, "SuspendProgram")) ||
(!xstrcasecmp(key_pair->name, "TaskEpilog")) ||
(!xstrcasecmp(key_pair->name, "TaskProlog")) ||
(!xstrcasecmp(key_pair->name,
"UnkillableStepProgram"))) {
/* Exceptions not be tokenized in the output */
temp = key_pair->value;
} else {
/*
* Only write out values. Use strtok
* to grab just the value (ie. "60 sec")
*/
temp = strtok(key_pair->value, " (");
}
temp = xstrdup_printf("%s=%s",
key_pair->name, temp);
}
if (!xstrcasecmp(key_pair->name, "ControlMachine") ||
!xstrcasecmp(key_pair->name, "ControlAddr") ||
!xstrcasecmp(key_pair->name, "ClusterName") ||
!xstrcasecmp(key_pair->name, "SlurmUser") ||
!xstrcasecmp(key_pair->name, "SlurmdUser") ||
!xstrcasecmp(key_pair->name, "SlurmctldPort") ||
!xstrcasecmp(key_pair->name, "SlurmdPort") ||
!xstrcasecmp(key_pair->name, "BackupAddr") ||
!xstrcasecmp(key_pair->name, "BackupController")) {
list_append(control_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "StateSaveLocation") ||
!xstrcasecmp(key_pair->name, "SlurmdSpoolDir") ||
!xstrcasecmp(key_pair->name, "SlurmctldLogFile") ||
!xstrcasecmp(key_pair->name, "SlurmdLogFile") ||
!xstrcasecmp(key_pair->name, "SlurmctldPidFile") ||
!xstrcasecmp(key_pair->name, "SlurmdPidFile") ||
!xstrcasecmp(key_pair->name, "SlurmSchedLogFile") ||
!xstrcasecmp(key_pair->name, "SlurmEventHandlerLogfile")) {
list_append(logging_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "AccountingStorageBackupHost") ||
!xstrcasecmp(key_pair->name, "AccountingStorageEnforce") ||
!xstrcasecmp(key_pair->name, "AccountingStorageHost") ||
!xstrcasecmp(key_pair->name, "AccountingStorageLoc") ||
!xstrcasecmp(key_pair->name, "AccountingStoragePort") ||
!xstrcasecmp(key_pair->name, "AccountingStorageType") ||
!xstrcasecmp(key_pair->name, "AccountingStorageUser") ||
!xstrcasecmp(key_pair->name, "AccountingStoreJobComment") ||
!xstrcasecmp(key_pair->name, "AcctGatherEnergyType") ||
!xstrcasecmp(key_pair->name, "AcctGatherFilesystemType") ||
!xstrcasecmp(key_pair->name, "AcctGatherInterconnectType") ||
!xstrcasecmp(key_pair->name, "AcctGatherNodeFreq") ||
!xstrcasecmp(key_pair->name, "AcctGatherProfileType") ||
!xstrcasecmp(key_pair->name, "JobAcctGatherFrequency") ||
!xstrcasecmp(key_pair->name, "JobAcctGatherType") ||
!xstrcasecmp(key_pair->name, "ExtSensorsType") ||
!xstrcasecmp(key_pair->name, "ExtSensorsFreq")) {
list_append(accounting_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "SuspendExcNodes") ||
!xstrcasecmp(key_pair->name, "SuspendExcParts") ||
!xstrcasecmp(key_pair->name, "SuspendProgram") ||
!xstrcasecmp(key_pair->name, "SuspendRate") ||
!xstrcasecmp(key_pair->name, "SuspendTime") ||
!xstrcasecmp(key_pair->name, "SuspendTimeout") ||
!xstrcasecmp(key_pair->name, "ResumeProgram") ||
!xstrcasecmp(key_pair->name, "ResumeRate") ||
!xstrcasecmp(key_pair->name, "ResumeTimeout")) {
list_append(power_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "SelectType") ||
!xstrcasecmp(key_pair->name, "SelectTypeParameters") ||
!xstrcasecmp(key_pair->name, "SchedulerParameters") ||
!xstrcasecmp(key_pair->name, "SchedulerTimeSlice") ||
!xstrcasecmp(key_pair->name, "SchedulerType") ||
!xstrcasecmp(key_pair->name, "SlurmSchedLogLevel") ||
!xstrcasecmp(key_pair->name, "PreemptMode") ||
!xstrcasecmp(key_pair->name, "PreemptType") ||
!xstrcasecmp(key_pair->name, "PriorityType") ||
!xstrcasecmp(key_pair->name, "FastSchedule")) {
list_append(sched_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "TopologyPlugin")) {
list_append(topology_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "SlurmctldTimeout") ||
!xstrcasecmp(key_pair->name, "SlurmdTimeout") ||
!xstrcasecmp(key_pair->name, "InactiveLimit") ||
!xstrcasecmp(key_pair->name, "MinJobAge") ||
!xstrcasecmp(key_pair->name, "KillWait") ||
!xstrcasecmp(key_pair->name, "BatchStartTimeout") ||
!xstrcasecmp(key_pair->name, "CompleteWait") ||
!xstrcasecmp(key_pair->name, "EpilogMsgTime") ||
!xstrcasecmp(key_pair->name, "GetEnvTimeout") ||
!xstrcasecmp(key_pair->name, "Waittime")) {
list_append(timers_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "SlurmctldDebug") ||
!xstrcasecmp(key_pair->name, "SlurmdDebug") ||
!xstrcasecmp(key_pair->name, "DebugFlags")) {
list_append(debug_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "TaskPlugin") ||
!xstrcasecmp(key_pair->name, "TaskPluginParam")) {
list_append(resconf_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "ProcTrackType")) {
list_append(proctrac_list, temp);
continue;
}
if (!xstrcasecmp(key_pair->name, "Epilog") ||
!xstrcasecmp(key_pair->name, "Prolog") ||
!xstrcasecmp(key_pair->name, "SrunProlog") ||
!xstrcasecmp(key_pair->name, "SrunEpilog") ||
!xstrcasecmp(key_pair->name, "TaskEpilog") ||
!xstrcasecmp(key_pair->name, "TaskProlog")) {
list_append(proepilog_list, temp);
continue;
} else {
list_append(other_list, temp);
}
}
list_iterator_destroy(iter);
_write_group_header (out, "CONTROL");
iter = list_iterator_create(control_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(control_list);
_write_group_header (out, "LOGGING & OTHER PATHS");
iter = list_iterator_create(logging_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(logging_list);
_write_group_header (out, "ACCOUNTING");
iter = list_iterator_create(accounting_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(accounting_list);
_write_group_header (out, "SCHEDULING & ALLOCATION");
iter = list_iterator_create(sched_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(sched_list);
_write_group_header (out, "TOPOLOGY");
iter = list_iterator_create(topology_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(topology_list);
_write_group_header (out, "TIMERS");
iter = list_iterator_create(timers_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(timers_list);
_write_group_header (out, "POWER");
iter = list_iterator_create(power_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(power_list);
_write_group_header (out, "DEBUG");
iter = list_iterator_create(debug_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(debug_list);
_write_group_header (out, "EPILOG & PROLOG");
iter = list_iterator_create(proepilog_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(proepilog_list);
_write_group_header (out, "PROCESS TRACKING");
iter = list_iterator_create(proctrac_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(proctrac_list);
_write_group_header (out, "RESOURCE CONFINEMENT");
iter = list_iterator_create(resconf_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(resconf_list);
_write_group_header (out, "OTHER");
iter = list_iterator_create(other_list);
while ((temp = list_next(iter)))
fprintf(out, "%s\n", temp);
list_iterator_destroy(iter);
FREE_NULL_LIST(other_list);
}
/*
* slurm_print_key_pairs - output the contents of key_pairs
* which is a list of opaque data type config_key_pair_t
* IN out - file to write to
* IN key_pairs - List containing key pairs to be printed
* IN title - title of key pair list
*/
extern void slurm_print_key_pairs(FILE* out, void *key_pairs, char *title)
{
List config_list = (List)key_pairs;
ListIterator iter = NULL;
config_key_pair_t *key_pair;
if (!config_list || !list_count(config_list))
return;
fprintf(out, "%s", title);
iter = list_iterator_create(config_list);
while ((key_pair = list_next(iter))) {
fprintf(out, "%-23s = %s\n", key_pair->name, key_pair->value);
}
list_iterator_destroy(iter);
}
/*
* _write_group_header - write the group headers on the
* output slurm configuration file - with the header
* string centered between the hash characters
* IN out - file to write to
* IN header - header string to write
*/
static void _write_group_header(FILE* out, char * header)
{
static int comlen = 48;
int i, hdrlen, left, right;
if (!header)
return;
hdrlen = strlen(header);
left = ((comlen - hdrlen) / 2) - 1;
right = left;
if ((comlen - hdrlen) % 2)
right++;
fprintf(out, "#\n");
for (i = 0; i < comlen; i++)
fprintf(out, "#");
fprintf(out, "\n#");
for (i = 0; i < left; i++)
fprintf(out, " ");
fprintf(out, "%s", header);
for (i = 0; i < right; i++)
fprintf(out, " ");
fprintf(out, "#\n");
for (i = 0; i < comlen; i++)
fprintf(out, "#");
fprintf(out, "\n");
}