From 850fe67785c32c4460cc7d0840ce032190c25747 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 22 Nov 2002 19:36:40 +0000
Subject: [PATCH] Add basic support for SlurmUser configuration parameter.

---
 src/api/config_info.c            |  3 +++
 src/api/free_msg.c               |  2 ++
 src/api/slurm.h                  |  2 ++
 src/common/read_config.c         | 29 +++++++++++++++++++++++++----
 src/common/slurm_protocol_pack.c |  5 +++++
 src/slurmctld/controller.c       |  7 +++++++
 6 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/api/config_info.c b/src/api/config_info.c
index 0f795439bb8..2dcf8ccc41e 100644
--- a/src/api/config_info.c
+++ b/src/api/config_info.c
@@ -76,6 +76,9 @@ void slurm_print_ctl_conf ( FILE* out,
 		slurm_ctl_conf_ptr->prolog);
 	fprintf(out, "ReturnToService   = %u\n", 
 		slurm_ctl_conf_ptr->ret2service);
+	fprintf(out, "SlurmUser         = %s(%u)\n", 
+		slurm_ctl_conf_ptr->slurm_user_name,
+		slurm_ctl_conf_ptr->slurm_user_id);
 	fprintf(out, "SlurmctldLogFile  = %s\n", 
 		slurm_ctl_conf_ptr->slurmctld_logfile);
 	fprintf(out, "SlurmctldTimeout  = %u\n", 
diff --git a/src/api/free_msg.c b/src/api/free_msg.c
index 5527c598e92..350fc5f2154 100644
--- a/src/api/free_msg.c
+++ b/src/api/free_msg.c
@@ -157,6 +157,8 @@ void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * config_ptr)
 			xfree(config_ptr->prioritize);
 		if (config_ptr->prolog)
 			xfree(config_ptr->prolog);
+		if (config_ptr->slurm_user_name)
+			xfree(config_ptr->slurm_user_name);
 		if (config_ptr->slurmctld_logfile)
 			xfree(config_ptr->slurmctld_logfile);
 		if (config_ptr->slurmd_logfile)
diff --git a/src/api/slurm.h b/src/api/slurm.h
index 4f106b92037..cefec3ac696 100644
--- a/src/api/slurm.h
+++ b/src/api/slurm.h
@@ -343,6 +343,8 @@ typedef struct slurm_ctl_conf {
 	char *prolog;		/* pathname of job prolog */
 	uint16_t ret2service;	/* 1 return DOWN node to service at 
 				 * registration */ 
+	uint16_t slurm_user_id;	/* uid of slurm_user_name */
+	char *slurm_user_name;	/* user that slurmctld runs as */
 	char *slurmctld_logfile;/* where slurmctld error log gets written */
 	uint32_t slurmctld_port;/* default communications port to slurmctld */
 	uint16_t slurmctld_timeout;/* seconds that backup controller waits 
diff --git a/src/common/read_config.c b/src/common/read_config.c
index 8a6b8575375..cc382d1fdce 100644
--- a/src/common/read_config.c
+++ b/src/common/read_config.c
@@ -32,6 +32,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <netdb.h>
+#include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -85,6 +86,8 @@ init_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr)
 	FREE_NULL (ctl_conf_ptr->prolog);
 	ctl_conf_ptr->ret2service		= (uint16_t) NO_VAL; 
 	FREE_NULL (ctl_conf_ptr->slurmctld_logfile);
+	ctl_conf_ptr->slurm_user_id		= (uint16_t) NO_VAL; 
+	FREE_NULL (ctl_conf_ptr->slurm_user_name);
 	ctl_conf_ptr->slurmctld_port		= (uint32_t) NO_VAL;
 	ctl_conf_ptr->slurmctld_timeout		= (uint16_t) NO_VAL;
 	FREE_NULL (ctl_conf_ptr->slurmd_logfile);
@@ -124,6 +127,7 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 	char *control_addr = NULL, *control_machine = NULL, *epilog = NULL;
 	char *prioritize = NULL, *prolog = NULL;
 	char *state_save_location = NULL, *tmp_fs = NULL;
+	char *slurm_user = NULL;
 	char *slurmctld_logfile = NULL, *slurmctld_port = NULL;
 	char *slurmd_logfile = NULL, *slurmd_port = NULL;
 	char *slurmd_spooldir = NULL, *slurmd_pidfile = NULL;
@@ -143,23 +147,24 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		"HashBase=", 'd', &hash_base,
 		"HeartbeatInterval=", 'd', &heartbeat_interval,
 		"InactiveLimit=", 'd', &inactive_limit,
+		"JobCredentialPrivateKey=", 's', &job_credential_private_key,
+		"JobCredentialPublicCertificate=", 's', 
+					&job_credential_public_certificate,
 		"KillWait=", 'd', &kill_wait,
 		"Prioritize=", 's', &prioritize,
 		"Prolog=", 's', &prolog,
 		"ReturnToService=", 'd', &ret2service,
+		"SlurmUser=", 's', &slurm_user,
 		"SlurmctldLogFile=", 's', &slurmctld_logfile,
 		"SlurmctldPort=", 's', &slurmctld_port,
 		"SlurmctldTimeout=", 'd', &slurmctld_timeout,
 		"SlurmdLogFile=", 's', &slurmd_logfile,
+		"SlurmdPidFile=",  's', &slurmd_pidfile,
 		"SlurmdPort=", 's', &slurmd_port,
 		"SlurmdSpoolDir=", 's', &slurmd_spooldir,
-		"SlurmdPidFile=",  's', &slurmd_pidfile,
 		"SlurmdTimeout=", 'd', &slurmd_timeout,
 		"StateSaveLocation=", 's', &state_save_location, 
 		"TmpFS=", 's', &tmp_fs,
-		"JobCredentialPrivateKey=", 's', &job_credential_private_key,
-		"JobCredentialPublicCertificate=", 's', 
-					&job_credential_public_certificate,
 		"END");
 
 	if (error_code)
@@ -263,6 +268,22 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		ctl_conf_ptr->ret2service = ret2service;
 	}
 
+	if ( slurm_user ) {
+		struct passwd *slurm_passwd;
+		slurm_passwd = getpwnam(slurm_user);
+		if (slurm_passwd == NULL) {
+			error ("Invalid user for SlurmUser %s, ignored",
+			       slurm_user);
+		} else {
+			if ( ctl_conf_ptr->slurm_user_name ) {
+				error (MULTIPLE_VALUE_MSG, "SlurmUser");
+				xfree (ctl_conf_ptr->slurm_user_name);
+			}
+			ctl_conf_ptr->slurm_user_name = slurm_user;
+			ctl_conf_ptr->slurm_user_id = slurm_passwd->pw_uid;
+		}
+	}
+
 	if ( slurmctld_logfile ) {
 		if ( ctl_conf_ptr->slurmctld_logfile ) {
 			error (MULTIPLE_VALUE_MSG, "SlurmctldLogFile");
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index fd5d2d91413..7754d454290 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -1580,6 +1580,8 @@ static void _pack_slurm_ctl_conf_msg (
 	packstr (build_ptr->prioritize, buffer);
 	packstr (build_ptr->prolog, buffer);
 	pack16 (build_ptr->ret2service, buffer);
+	pack16 (build_ptr->slurm_user_id, buffer);
+	packstr (build_ptr->slurm_user_name, buffer);
 	packstr (build_ptr->slurmctld_logfile, buffer);
 	pack16 (build_ptr->slurmctld_timeout, buffer);
 	packstr (build_ptr->slurmd_logfile, buffer);
@@ -1625,6 +1627,9 @@ static int _unpack_slurm_ctl_conf_msg (
 	safe_unpackstr_xmalloc (&build_ptr->prolog, &uint16_tmp, 
 	                        buffer);
 	safe_unpack16 (&build_ptr->ret2service, buffer);
+	safe_unpack16 (&build_ptr->slurm_user_id, buffer);
+	safe_unpackstr_xmalloc (&build_ptr->slurm_user_name, 
+	                        &uint16_tmp, buffer);
 	safe_unpackstr_xmalloc (&build_ptr->slurmctld_logfile, 
 	                        &uint16_tmp, buffer);
 	safe_unpack16 (&build_ptr->slurmctld_timeout, buffer);
diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c
index 0bd6debd3da..1d6c17910be 100644
--- a/src/slurmctld/controller.c
+++ b/src/slurmctld/controller.c
@@ -1980,15 +1980,22 @@ void _fill_ctld_conf(slurm_ctl_conf_t * conf_ptr)
 	conf_ptr->hash_base = slurmctld_conf.hash_base;
 	conf_ptr->heartbeat_interval = slurmctld_conf.heartbeat_interval;
 	conf_ptr->inactive_limit = slurmctld_conf.inactive_limit;
+	conf_ptr->job_credential_private_key = 
+			slurmctld_conf.job_credential_private_key;
+	conf_ptr->job_credential_public_certificate = 
+			slurmctld_conf.job_credential_public_certificate;
 	conf_ptr->kill_wait = slurmctld_conf.kill_wait;
 	conf_ptr->prioritize = slurmctld_conf.prioritize;
 	conf_ptr->prolog = slurmctld_conf.prolog;
 	conf_ptr->ret2service = slurmctld_conf.ret2service;
+	conf_ptr->slurm_user_id = slurmctld_conf.slurm_user_id;
+	conf_ptr->slurm_user_name = slurmctld_conf.slurm_user_name;
 	conf_ptr->slurmctld_logfile = slurmctld_conf.slurmctld_logfile;
 	conf_ptr->slurmctld_port = slurmctld_conf.slurmctld_port;
 	conf_ptr->slurmctld_timeout = slurmctld_conf.slurmctld_timeout;
 	conf_ptr->slurmd_logfile = slurmctld_conf.slurmd_logfile;
 	conf_ptr->slurmd_spooldir = slurmctld_conf.slurmd_spooldir;
+	conf_ptr->slurmd_pidfile = slurmctld_conf.slurmd_pidfile;
 	conf_ptr->slurmd_port = slurmctld_conf.slurmd_port;
 	conf_ptr->slurmd_timeout = slurmctld_conf.slurmd_timeout;
 	conf_ptr->slurm_conf = slurmctld_conf.slurm_conf;
-- 
GitLab