#!/usr/local/bin/cbsd
#v11.1.3
MYARG="jname"
MYOPTARG="cmd user"
MYDESC="Execution for command inside jail"
ADDHELP="if jname='*' then execute command on all jails"
CBSDMODULE="jail"

. ${subr}
. ${strings}
. ${tools}
init $*

[ -z "${jname}" ] && err 1 "Give me jname"

shift  # todo: jname and cmd may have reverse order

if [ -n "${user}" ]; then
	shift
else
	user="root"
fi

[ -z "${cmd}" ] && cmd="${@}"
[ -z "${cmd}" ] && err 1 "Empty command"

emulator="jail"		# for jname_is_multiple
jname_is_multiple	# import jail_list if jname is mask

if [ -n "${jail_list}" ]; then
	. ${workdir}/multiple.subr

	${ECHO} "${MAGENTA}Hint: Press ${GREEN}'Ctrl+t'${MAGENTA} to see last logfile line for active task${NORMAL}" 1>&2
	task_owner="jexec_multiple"

	task_id=
	task_id_cur=

	# spawn command for all jail
	for jname in ${jail_list}; do
		. ${jrcconf}
		[ ${myjid} -eq 0 ] && continue
		task_id_cur=$( task mode=new logfile=/tmp/${task_owner}.${jname}.log.$$ client_id=${jname} autoflush=0 owner=${task_owner} /usr/bin/env NOCOLOR=1 /usr/local/bin/cbsd jexec jname=${jname} ${cmd} 2>/dev/null )
		task_id="${task_id} ${task_id_cur}"
	done

	multiple_task_id_all=$( echo ${task_id} | /usr/bin/tr " " "," )
	sleep 1
	multiple_processing_spawn -o ${task_owner} -n "jexec"
	echo
	exit 0
fi

. ${jrcconf}
[ $? -eq 1 ] && err 1 "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
[ "${emulator}" = "bhyve" ] && err 1 "${MAGENTA}Not for bhyve mode${NORMAL}"

[ ${jid} -ne 0 ] || err 1 "Not running"

#rctl/limits area
. ${workdir}/rctl.subr
[ -z "${nice}" ] && nice="0"

 _formfile="${jailsysdir}/${jname}/helpers/jrctl.sqlite"
[ -r "${_formfile}" ] && nice=$( cbsdsql ${_formfile} "SELECT cur FROM forms WHERE param=\"nice\"" )
[ -z "${nice}" ] && nice="0"

if [ ${exec_fib} -eq 0 ]; then
	SETFIB=""
else
	SETFIB="setfib ${exec_fib}"
fi

if [ "${cpuset}" = "0" ]; then
	CPUSET=""
else
	CPUSET="cpuset -c -l ${cpuset}"
fi

case "${ver}" in
	"empty")
		# is linux?
		if [ -f "${data}/bin/bash" ]; then
			LOGIN_STR="/bin/bash"
		elif [ -f "${data}/bin/sh" ]; then
			LOGIN_STR="/bin/sh" ];
		else
			err 1 "${MAGENTA}Unknown environment, unable to login${NORMAL}"
		fi
		;;
	*)
		if [ "${emulator}" != "jail" -a -n "${emulator}" ]; then
			. ${workdir}/emulator.subr
			init_usermode_emul
			LOGIN_STR="/bin/${emulator} /bin/sh"
		else
			LOGIN_STR="/bin/sh"
		fi
		;;
esac

/usr/bin/nice -n ${nice} ${SETFIB} ${CPUSET} /usr/sbin/jexec -U ${user} ${jid} ${LOGIN_STR} <<CBSD_EOF
${cmd}
CBSD_EOF
