#!/usr/local/bin/cbsd
#v11.2.1
CBSDMODULE="jail"
MYARG="jname"
MYOPTARG="nice"
MYDESC="Re-nice jail processes on-the-fly"
ADDHELP="nice=[new value]\n\
  or skip nice= to apply values from RCTL databases\n\"
"

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

. ${cbsdinit}

emulator="jail" # for jname_is_multiple
jname_is_multiple

if [ -n "${jail_list}" ]; then
	TMP_JLIST="${jail_list}"
else
	TMP_JLIST=$*
fi

JLIST=

# check for actual vm list in arg list
jail_num=0
for i in ${TMP_JLIST}; do
	exist=$( cbsdsqlro local SELECT jname FROM jails WHERE jname=\"${i}\" AND emulator=\"${emulator}\" LIMIT 1 )
	if [ -n "${exist}" ]; then
		JLIST="${exist} ${JLIST}"
		jail_num=$(( jail_num + 1 ))
	fi
done

# this is multiple list, split it by parallel bstop execution
if [ ${jail_num} -gt 1 ]; then
	cbsdlogger NOTICE ${CBSD_APP}: executing for multiple jrenice: ${JLIST}
	new_arg=

	for i in $*; do
		_is_jname=$( substr --pos=0 --len=5 --str=${i} )
		[ "${_is_jname}" = "jname" ] && continue
		new_arg="${new_arg} ${i}"
	done

	for jname in ${JLIST}; do
		jrenice jname=${jname} ${new_arg}
	done
	exit 0
fi


. ${subrdir}/rcconf.subr
[ "${emulator}" != "jail" ] && log_err 1 "${MAGENTA}Not in jail emulator: ${GREEN}${emulator}{NORMAL}"
[ ${jid} -eq 0 ] && exit 0

if [ -z "${nice}" ]; then
	_formfile="${jailsysdir}/${jname}/helpers/jrctl.sqlite"
	[ -r "${_formfile}" ] && nice=$( cbsdsqlro ${_formfile} "SELECT cur FROM forms WHERE param=\"nice\"" )
	# just reset
	[ -z "${nice}" ] && nice="0"
fi

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 )

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

exit 0
