#!/usr/local/bin/cbsd
#v12.1.11
MYARG=""
MYOPTARG="cbsdfile jname cwd multiple"
MYDESC="destroy jail/bhyve env from CBSDfile, vagrant-like behavior"
CBSDMODULE="bhyve,jail"
ADDHELP="\

${H3_COLOR}Description${N0_COLOR}:

Destroy environment which are described in the CBSDfile.
You must be in the directory where the CBSDfile file is located.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}cbsdfile${N0_COLOR} - alternative path to CBSDfile, could be relative to the
            working directory, e.g: '/tmp/CBSDfile'.

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd destroy
 # cbsd destroy jail1 vm4

${H3_COLOR}See also${N0_COLOR}:

 cbsd up --help
 cbsd jdestroy --help
 cbsd bdestroy --help

"
EXTHELP="wf_cbsdfile"

. ${subrdir}/nc.subr
. ${strings}
cwd=
jname=
CLOUD_URL=
CLOUD_KEY=
. ${cbsdinit}

# flags for multiple CBSDfile env
[ -z "${multiple}" ] && multiple=0

# init CBSDfile data
# init CBSDfile data
if [ -n "${cwd}" ]; then
	[ ! -r ${cwd}/CBSDfile ] && err 1 "${N1_COLOR}${CBSD_APP}: no such CBSDfile: ${N2_COLOR}${cwd}/CBSDfile${N0_COLOR}"
	cbsdfile="${cwd}/CBSDfile"
	cd ${cwd}
fi
. ${subrdir}/cbsdfile.subr
. ${subrdir}/time.subr

# testing/wip...
destroy_jail_cloud()
{
	local _cid

	local CURL_CMD=$( which curl )

	[ -z "${CURL_CMD}" ] && err 1 "${N1_COLOR}cloud up requires curl, please install: ${N2_COLOR}pkg install -y curl${N0_COLOR}"
	${ECHO} "${N1_COLOR}destroy ${jname} via: ${N2_COLOR}${CLOUD_URL}${N0_COLOR}"

	_cid=$( ${miscdir}/cbsd_md5 "${CLOUD_KEY}" )

	# via file for debug
	${CAT_CMD} > destroy-${jname}.sh <<EOF
${SUDO_CMD} -u nobody ${CURL_CMD} --no-progress-meter -H "cid:${_cid}" ${CLOUD_URL}/api/v1/destroy/${jname}
EOF
	${CHMOD_CMD} +x destroy-${jname}.sh
	./destroy-${jname}.sh
	${RM_CMD} -f ./destroy-${jname}.sh
	return 0
}

destroy_jail()
{
	local ojname="${jname}"
	[ -z "${jname}" ] && err 1 "${N1_COLOR}run_jail: empty jname${N0_COLOR}"

	if [ -n "${CLOUD_URL}" ]; then
		destroy_jail_cloud
		_ret=$?
		return ${_ret}
	fi

	. ${subrdir}/rcconf.subr
	[ $? -eq 1 ] && err 1 "${N1_COLOR}no such environment: ${N2_COLOR}${jname}${N0_COLOR}"

	# push old cbsd workdir
	ocbsd_workdir="${cbsd_workdir}"

	# per-env predestroy func
	if fn_exists predestroy_${jname} 2>/dev/null; then
		${ECHO} "${N1_COLOR}execute predestroy_${jname}${N0_COLOR}"
		predestroy_${jname}
		jname="${ojname}"               # for corrupted/changed jname in func
		${ECHO} "${N1_COLOR}execute predestroy_${jname} done${N0_COLOR}"
	fi

	${ENV_CMD} cbsd_workdir="${cbsd_workdir}" jremove jname=${jname} quiet="${quiet}"

	# per-env postdestroy func
	if fn_exists postdestroy_${jname} 2>/dev/null; then
		${ECHO} "${N1_COLOR}execute postdestroy_${jname}${N0_COLOR}"
		postdestroy_${jname}
		# export some variables via H_CBSD_ (for scp,expose, and so on...)
		export H_CBSD_jname="${jname}"
		# export some variables via H_CBSD_
		unset H_CBSD_jname
		${ECHO} "${N1_COLOR}execute postdestroy_${jname} done${N0_COLOR}"
	fi

	# restore old workdir
	cbsd_workdir="${ocbsd_workdir}"
}

# testing/wip...
destroy_bhyve_cloud()
{
	local _cid

	local CURL_CMD=$( which curl )

	[ -z "${CURL_CMD}" ] && err 1 "${N1_COLOR}cloud up requires curl, please install: ${N2_COLOR}pkg install -y curl${N0_COLOR}"
	${ECHO} "${N1_COLOR}destroy ${jname} via: ${N2_COLOR}${CLOUD_URL}${N0_COLOR}"

	_cid=$( ${miscdir}/cbsd_md5 "${CLOUD_KEY}" )

	# via file for debug
	${CAT_CMD} > destroy-${jname}.sh <<EOF
${SUDO_CMD} -u nobody ${CURL_CMD} --no-progress-meter -H "cid:${_cid}" ${CLOUD_URL}/api/v1/destroy/${jname}
EOF
	${CHMOD_CMD} +x destroy-${jname}.sh
	./destroy-${jname}.sh
	${RM_CMD} -f ./destroy-${jname}.sh
	return 0
}

destroy_bhyve()
{
	local ojname="${jname}"
	[ -z "${jname}" ] && err 1 "${N1_COLOR}run_jail: empty jname${N0_COLOR}"

	if [ -n "${CLOUD_URL}" ]; then
		destroy_bhyve_cloud
		_ret=$?
		return ${_ret}
	fi

	. ${subrdir}/rcconf.subr
	[ $? -eq 1 ] && err 1 "${N1_COLOR}no such environment: ${N2_COLOR}${jname}${N0_COLOR}"

	# push old cbsd workdir
	ocbsd_workdir="${cbsd_workdir}"

	# per-env preup func
	if fn_exists predestroy_${jname} 2>/dev/null; then
		${ECHO} "${N1_COLOR}execute predestroy_${jname}${N0_COLOR}"
		predestroy_${jname}
		jname="${ojname}"               # for corrupted/changed jname in func
		${ECHO} "${N1_COLOR}execute predestroy_${jname} done${N0_COLOR}"
	fi

	${ENV_CMD} cbsd_workdir="${cbsd_workdir}" bremove jname=${jname} quiet="${quiet}"

	# per-env postdestroy func
	if fn_exists postdestroy_${jname} 2>/dev/null; then
		${ECHO} "${N1_COLOR}execute postdestroy_${jname}${N0_COLOR}"
		postdestroy_${jname}
		${ECHO} "${N1_COLOR}execute postdestroy_${jname} done${N0_COLOR}"
	fi

	# restore old workdir
	cbsd_workdir="${ocbsd_workdir}"
}


# MAIN
if [ ${num_env} -eq 1 ]; then
	st_time=$( ${DATE_CMD} +%s )

	# protection from multiple env
	if [ ${multiple} -eq 0 ]; then
		# global predestroy
		if fn_exists predestroy 2>/dev/null; then
			predestroy
		fi
	fi

	if [ ${jail_num} -eq 1 ]; then
		jname="${jail_list}"
		destroy_jail
	elif [ ${bhyve_num} -eq 1 ]; then
		jname="${bhyve_list}"
		destroy_bhyve
	fi

	# protection from multiple env
	if [ ${multiple} -eq 0 ]; then
		# global postdestroy
		if fn_exists postdestroy 2>/dev/null; then
			postdestroy
		fi
	fi

	end_time=$( ${DATE_CMD} +%s )
	diff_time=$(( end_time - st_time ))
	diff_time=$( displaytime ${diff_time} )
	${ECHO} "${N1_COLOR}${CBSD_APP} done ${N2_COLOR}in ${diff_time}${N0_COLOR}" 1>&2
	exit 0
fi

# multiple run area
. ${subrdir}/multiple.subr

${ECHO} "${N1_COLOR}Hint: Press ${N2_COLOR}'Ctrl+t'${N1_COLOR} to see last logfile line for active task${N0_COLOR}" 1>&2
task_owner="destroy_multiple"

task_id=
task_id_cur=

# spawn command for all jail
for jname in ${jail_list} ${bhyve_list}; do
	# we must inherit CBSD_PWD via cwd= for cbsd-related function in postcreate_ action
	task_id_cur=$( task mode=new logfile=${tmpdir}/${task_owner}.${jname}.log.$$ client_id=${jname} autoflush=0 owner=${task_owner} /usr/bin/env NOCOLOR=${NOCOLOR} /usr/local/bin/cbsd destroy multiple=1 cbsdfile=${Makefile} jname=${jname} cwd=${CBSD_PWD} )
	task_id="${task_id} ${task_id_cur}"
	multiple_task_id_all=$( echo ${task_id} | ${TR_CMD} " " "," )
	sleep 2
done

st_time=$( ${DATE_CMD} +%s )

multiple_processing_spawn -o ${task_owner} -n "destroy"

# global postdestroy
if fn_exists postdestroy 2>/dev/null; then
	${ECHO} "${N1_COLOR}execute global postdestroy function${N0_COLOR}"
	postdestroy
	${ECHO} "${N1_COLOR}execute global postdestroy function done${N0_COLOR}"
fi

end_time=$( ${DATE_CMD} +%s )
diff_time=$(( end_time - st_time ))
diff_time=$( displaytime ${diff_time} )
${ECHO} "${N1_COLOR}${CBSD_APP} done ${N2_COLOR}in ${diff_time}${N0_COLOR}"

exit 0
