#!/usr/local/bin/cbsd
#v11.1.17
globalconf="${distdir}/cbsd.conf";
MYARG="bname jname"
MYOPTARG=""
MYDESC="Drop bhyve domain into jail"
CBSDMODULE="bhyve"

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

. ${cbsdinit}

. ${subrdir}/rcconf.subr

[ $? -eq 1 ] && err 1 "${N1_COLOR}No such jail: ${N2_COLOR}${jname}${N0_COLOR}"

b_exist=$( cbsdsqlro local "SELECT jname FROM jails WHERE jname=\"${bname}\" AND emulator=\"bhyve\"" 2>/dev/null )

[ -z "${b_exist}" ] && err 1 "${N1_COLOR}bhyve domain is not exist: ${N2_COLOR}${bname}${N0_COLOR}"

jdata="${data}"					# jail data path
jpath="${path}"					# jail path
bdata="${jaildatadir}/${bname}-data/"		# bhyve data path
zfs_based=0		# zvol?
jworkdir="/usr/local/jails"

# ensrure jail is protected (and hidden for UI)
${ECHO} "${N1_COLOR}Apply bhyve-related settings...${N0_COLOR}"
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure jail ${jname} is protected${N0_COLOR}"
jset protected=1 jname=${jname}
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure jail ${jname} is hidden for UI${N0_COLOR}"
jset hidden=1 jname=${jname}
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure jail ${jname} is allow_vmm=1${N0_COLOR}"
jset allow_vmm=1 jname=${jname}
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure jail ${jname} is devfs_ruleset${N0_COLOR}"
#jset devfs_ruleset=4 jname=${jname}
jset devfs_ruleset=99 jname=${jname}
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure bhyve ${bname} is jailed${N0_COLOR}"
bset jailed=${jname} jname=${bname}
${ECHO} "  ${H5_COLOR}*${N1_COLOR} ensure jail ${jname} is running${N0_COLOR}"

[ -z "${bhyverun_wrapper}" ] && err 1 "${N0_COLOR}${CBSD_APP}empty mandatory param: ${N1_COLOR}bhyverun_wrapper${N0_COLOR}"

[ ${jid} -ne 0 ] && jstop jname=${jname}		# stop first
jstart jname=${jname}

# unset tap
#
sysrc jname=${jname} cbsd_workdir=${jworkdir}

[ ! -d ${jpath}/usr/local/cbsd ] && ${MKDIR_CMD} -p ${jpath}/usr/local/cbsd	# nullfs mount point
${MOUNT_CMD} -oro -t nullfs /usr/local/cbsd ${jpath}/usr/local/cbsd		# we need this for bhyve firmwares

[ ! -d ${jpath}${jworkdir}/jails-data ] && ${MKDIR_CMD} -p ${jpath}${jworkdir}/jails-data
[ ! -d ${jpath}${jworkdir}/jails-system ] && ${MKDIR_CMD} -p ${jpath}${jworkdir}/jails-system

# nullfs ro
for i in etc nodectl bin jailctl lib sbin misc tools sudoexec share src/iso; do
	[ ! -d ${jpath}${jworkdir}/${i} ] && ${MKDIR_CMD} -p ${jpath}${jworkdir}/${i}
	${MOUNT_CMD} -oro -t nullfs ${workdir}/${i} ${jpath}${jworkdir}/${i}
done

# nullfs rw
for i in jails-system/${bname} jails-data/${bname}-data; do
	[ ! -d ${jpath}${jworkdir}/${i} ] && ${MKDIR_CMD} -p ${jpath}${jworkdir}/${i}
	${MOUNT_CMD} -orw -t nullfs ${workdir}/${i} ${jpath}${jworkdir}/${i}
done

tmpfile="/tmp/${bname}.jconf"

bstart jname=${bname} cfg_only=${tmpfile}

replacewdir file0="${tmpfile}" old=${workdir} new="${jworkdir}"
jailscp ${tmpfile} ${jname}:${tmpfile}

# in dstdir
#jailscp ${distdir}/cbsd.conf ${jname}:${jworkdir}/cbsd.conf

jailscp ${workdir}/nodename ${jname}:${jworkdir}/nodename
jailscp /usr/local/bin/cbsd ${jname}:/usr/local/bin/cbsd

# get my tap
ojname="${jname}"
. ${tmpfile}
jname="${ojname}"

for i in ${mytap} vmm vmm/${bname}; do
	${ECHO} "  ${H5_COLOR}*${N1_COLOR} unhide devfs ${jname}: ${N2_COLOR}${i}${N0_COLOR}"
	${DEVFS_CMD} -m ${jpath}/dev rule add path "${i}" unhide
	${DEVFS_CMD} -m ${jpath}/dev rule applyset
done

#${DEVFS_CMD} -m ${jpath}/dev rule applyset

echo "jexec jname=${jname} ${bhyverun_wrapper} -c ${tmpfile}"
exec /usr/local/cbsd/misc/daemonize /usr/local/cbsd/jailctl/jexec jname=${jname} ${bhyverun_wrapper} -c ${tmpfile}

exit 0
