#!/usr/local/bin/cbsd
#v11.1.19
CBSDMODULE="jail"
MYARG="jname"
MYOPTARG="nice"
MYDESC="Pause and resume for jail (send STOP/CONT signal to jail processes)"
ADDHELP="mode=[auto|on|off]\n\
  mode=auto (by default) triggering - e.g, if jail active then pause\n\
  mode=on - pause, stop\n\
  mode=off - unpause, continue\n"

. ${subrdir}/nc.subr
. ${strings}

. ${cbsdinit}

[ -z "${mode}" ] && mode="auto"

. ${subrdir}/rcconf.subr
if [ $? -eq 1 ]; then
	# try_remote
	err 1 "${N1_COLOR}No such jail: ${N2_COLOR}${jname}${N0_COLOR}"
fi
[ "${emulator}" = "bhyve" ] && err 1 "${N1_COLOR}For bhyve jail use: ${N2_COLOR}cbsd bpause=${jname} ${N1_COLOR}instead${N0_COLOR}"
[ ${jid} -eq 0 ] && err 1 "Not running"


pid_count=0
jpid=
jpid_list=

eval $( /bin/ps -axfw -w -o pid,jid,state | while read _pid _jid _state; do
	[ "${jid}" != "${_jid}" ] && continue
	pid_count=$(( pid_count + 1 ))
	if $( echo "${_state}" |${GREP_CMD} -q "T" ); then
		pid_count=$(( pid_count - 1 ))
	fi
	jpid_list="${jpid_list} ${_pid}"
	echo jpid_list=\"${jpid_list}\"
	echo jpid_count=\"${pid_count}\"
done )

case "${mode}" in
	auto)
		if [ ${jpid_count} -gt 0 ]; then
			cbsdlogger NOTICE ${CBSD_APP}: jail is active, triggering to sleep: ${jname}
			${ECHO} "${N1_COLOR}jail is active, triggering to sleep${N0_COLOR}"
			SIGNAL="STOP"
		else
			cbsdlogger NOTICE ${CBSD_APP}: jail is sleeping, triggering to continue: ${jname}
			${ECHO} "${N1_COLOR}jail is sleeping, triggering to continue${N0_COLOR}"
			SIGNAL="CONT"
		fi
		;;
	on)
		SIGNAL="STOP"
		;;
	off)
		SIGNAL="CONT"
		;;
esac

cbsdlogger NOTICE ${CBSD_APP}: re-nice ${nice} to jail ${jname} pids: ${jpid_list}
/usr/bin/renice ${nice} -p ${jpid_list}
