#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test sbcast security issues.
############################################################################
# Copyright (C) 2006 The Regents of the University of California.
# 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.
#
# 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.
############################################################################
source ./globals

set file_in     "$test_dir/input"
set file_out    "$test_dir/output"
set file_err    "$test_dir/error"
set job_id      0

if {[get_my_uid] == 0} {
	skip "This test can't be run as user root"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# Build input script file that broadcasts a file
#
make_bash_script $file_in "
  $sbcast $sbcast /test1.$test_id
  $srun ls /test1.$test_id
"

#
# Spawn an sbatch job that uses stdout/err and confirm their contents
#
set timeout $max_job_delay
set job_id [submit_job -fail "-N1 --output=$file_out --error=$file_err -t1 $file_in"]

#
# Wait for job to complete and check output file
#
wait_for_job -fail $job_id "DONE"

set matches 0
wait_for_file -fail $file_err
spawn $bin_cat $file_err
expect {
	-re "error: REQUEST_FILE_BCAST" {
		log_debug "These errors are expected, no worries"
		incr matches
		exp_continue
	}
	-re "ls.* No such file" {
		log_debug "These errors are expected, no worries"
		incr matches
		exp_continue
	}
	-re "ls.* does not exist" {
		log_debug "These errors are expected, no worries"
		incr matches
		exp_continue
	}
	-re "ls.* not found" {
		log_debug "These errors are expected, no worries"
		incr matches
		exp_continue
	}
	eof {
		wait
	}
}
if {$matches != 2} {
	fail "sbcast wrote into root file system without root access ($matches)"
}
