#!/usr/local/bin/cbsd

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

jails_stop()
{
	local localjails=
	local localbhyves=
	local localxens=
	local localqemus=

	localjails="$( jorder order=DESC )"
	localbhyves="$( border order=DESC )"
	localxens="$( xorder order=DESC )"
	localqemus="$( qorder order=DESC )"

	[ -n "${localjails}" ] && cbsdlogger NOTICE ${CBSD_APP}: jail stop order: ${localjails}
	[ -n "${localbhyves}" ] && cbsdlogger NOTICE ${CBSD_APP}: bhyve vm stop order: ${localbhyves}
	[ -n "${localxens}" ] && cbsdlogger NOTICE ${CBSD_APP}: XEN vm stop order: ${localxens}
	[ -n "${localqemus}" ] && cbsdlogger NOTICE ${CBSD_APP}: QEMU vm stop order: ${localqemus}

	for jname in ${localjails} ${localbhyves} ${localxens} ${localqemus}; do
		. ${subrdir}/rcconf.subr
		[ ${jid} -eq 0 ] && continue
		stoppid="${ftmpdir}/stop.${jname}.$$"
		${ECHO} "${N1_COLOR}${CBSD_APP}: auto-stop ${emulator}: ${N2_COLOR}${jname}${N0_COLOR}"
		cbsdlogger NOTICE ${CBSD_APP}: auto-stop ${emulator}: ${jname}
		case ${emulator} in
			bhyve)
				env TERM=xterm /usr/local/cbsd/misc/daemonize -E TERM=xterm -p ${stoppid} /usr/local/cbsd/bhyvectl/bstop jname=${jname}
				;;
			jail)
				env TERM=xterm /usr/local/cbsd/misc/daemonize -E TERM=xterm -p ${stoppid} /usr/local/cbsd/jailctl/jstop jname=${jname}
				;;
			xen)
				env TERM=xterm /usr/local/cbsd/misc/daemonize -E TERM=xterm -p ${stoppid} /usr/local/cbsd/xenctl/xstop jname=${jname}
				;;
			qemu)
				env TERM=xterm /usr/local/cbsd/misc/daemonize -E TERM=xterm -p ${stoppid} /usr/local/cbsd/qemuctl/qstop jname=${jname}
				;;
		esac
		# lets save .pid file
		sleep 1
		if [ -f "${stoppid}" ]; then
			PID=$( ${CAT_CMD} ${stoppid} 2>/dev/null )
			[ -n "${PID}" ] && cbsd_pwait --pid=$( ${CAT_CMD} ${stoppid} ) --timeout=${parallel}
		fi
	done
	wait_for_fpid stop
	return 0
}

jails_start()
{
	local jlist=
	local blist=
	local qlist=
	local xlist=
	local localjails= localbhyves= localxens= localqemus=

	localjails="$( jorder order=ASC )"
	localbhyves="$( border order=ASC )"
	localxens="$( xorder order=ASC )"
	localqemus="$( qorder order=ASC )"

	[ -n "${localjails}" ] && cbsdlogger NOTICE ${CBSD_APP}: jail start order: ${localjails}
	[ -n "${localbhyves}" ] && cbsdlogger NOTICE ${CBSD_APP}: bhyve vm start order: ${localbhyves}
	[ -n "${localqemus}" ] && cbsdlogger NOTICE ${CBSD_APP}: QEMU vm start order: ${localqemus}
	[ -n "${localxens}" ] && cbsdlogger NOTICE ${CBSD_APP}: XEN vm start order: ${localxens}

	for jname in ${localjails} ${localbhyves} ${localxens} ${localqemus}; do
		${toolsdir}/save-jail-info jname=${jname}
		. ${subrdir}/rcconf.subr
		if [ ${astart} -ne 1 ]; then
			cbsdlogger NOTICE ${CBSD_APP}: astart=0, skip: ${jname}
			continue
		else
			cbsdlogger NOTICE ${CBSD_APP}: astart=1, start scheduled: ${jname}
		fi
		case "${emulator}" in
			bhyve)
				blist="${blist} ${jname}"
				;;
			jail)
				jlist="${jlist} ${jname}"
				;;
			qemu)
				qlist="${qlist} ${jname}"
				;;
			xen)
				xlist="${xlist} ${jname}"
				;;
		esac
	done

	[ -n "${jlist}" ] && task mode=new autoflush=0 notify=0 owner=syscbsd /usr/local/bin/cbsd jstart inter=0 ${jlist}
	[ -n "${blist}" ] && task mode=new autoflush=0 notify=0 owner=syscbsd /usr/local/bin/cbsd bstart inter=0 ${blist}
	[ -n "${qlist}" ] && task mode=new autoflush=0 notify=0 owner=syscbsd /usr/local/bin/cbsd qstart inter=0 ${qlist}
	[ -n "${xlist}" ] && task mode=new autoflush=0 notify=0 owner=syscbsd /usr/local/bin/cbsd xstart inter=0 ${xlist}

	return 0
}

#### MAIN ####
case ${1} in
	start)
		jails_start
		;;
	stop)
		jails_stop
	;;
esac

exit 0
