#!/usr/local/bin/cbsd
#v11.0.6
globalconf="${workdir}/cbsd.conf";
MYARG=""
MYOPTARG="jname inter"
MYDESC="Destroy jail"
CBSDMODULE="jail"
EXTHELP="wf_jremove.html"

set -e
. ${globalconf}
set +e

. ${subr}
. ${jfs}
. ${strings}
. ${tools}

if [ -z "${1}" ]; then
	select_jail_by_list -s "List of local jails:" -r ${sqlreplica}
	if getyesno "Remove jail ${jname}. Are you sure? "; then
		echo
	else
		exit 0
	fi
fi
init $*

[ -n "${inter}" ] && shift

if [ -n "${jname}" ]; then
	emulator="jail"		# for jname_is_multiple
	jname_is_multiple

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

[ -z "${JLIST}" ] && err 1 "Give me jname"
[ -z "${cbsd_queue_name}" ] && cbsd_queue_name="/clonos/jailscontainers/"

for jname in ${JLIST}; do
	st_time=$( /bin/date +%s )

	DST="${jaildatadir}/${jname}-${jaildatapref}"
	JAILDIR="${jaildir}/${jname}"
	JAILFSTAB="${jailfstabdir}/${jailfstabpref}${jname}"
	JAILRCCONF="${jailsysdir}/${jname}/rc.conf_${jname}"

	unregister=0

	. ${jrcconf}
	if [ $? -eq 1 ]; then
		if [ ! -f "${JAILRCCONF}" ]; then
			# remote?
			if [ ${sqlreplica} -eq 0 ]; then
				${ECHO} "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
				continue
			fi
			remotenode=$( jwhereis ${jname} )
			if [ -z "${remotenode}" ]; then
				${ECHO} "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
				continue
			fi
			for i in ${remotenode}; do
				if [ "${i}" = "${nodename}" ]; then
					${ECHO} "${MAGENTA}Remote jremove: found on nodename ${GREEN}${nodename}${MAGENTA}. Skipped${NORMAL}"
					continue
				fi
				${ECHO} "${MAGENTA}Remote jremove: ${GREEN}${jname} ${MAGENTA}on${GREEN} ${i}${NORMAL}"
				rexe node=${i} cbsd jremove jname=${jname}
				if [ $? -eq 0 ]; then
					# updating state and put task for retrinv inventory
					${ECHO} "${MAGENTA}Updating inventory...${NORMAL}"
					task mode=new retrinv node=${i} data=db tryoffline=1 > /dev/null 2>&1
				fi
			done
			continue
		else
			. ${JAILRCCONF}
			unregister=1
		fi
	fi

	if [ "${protected}" = "1" ]; then
		${ECHO} "${MAGENTA}Protected/locked jail. Skip for remove: ${GREEN}${jname}${NORMAL}"
		continue
	fi

	# CBSD QUEUE
	if [ -x "${moduledir}/cbsd_queue.d/cbsd_queue" ]; then
		[ "${cbsd_queue_name}" != "none" ] && cbsd_queue cbsd_queue_name=${cbsd_queue_name} id=${jname} cmd=jremove status=1
	fi

	. ${workdir}/jcreate.subr
	export_jail_data_for_external_hook
	external_exec_master_script "remove.d"

	if [ ${unregister} -eq 0 ] ; then
		if [  ${jid} -ne 0 ]; then
			case "${emulator}" in
				"bhyve")
					bstop jname=${jname}
					;;
				"virtualbox")
					. ${workdir}/virtualbox.subr
					vstop jname=${jname}
					;;
				*)
					jstop jname=${jname}
					;;
			esac
		fi
		jcleanup jname=${jname}
		/sbin/umount ${path} 2>/dev/null
		# auto-promote if we have children
		if [ ${zfsfeat} -eq 1 ]; then
			/sbin/zfs get -H -o name,value origin | while read _name _values; do
			[ "${_values}" = "-" ] && continue
			echo "${_values}" | /usr/bin/grep -q -E "${jname}@cbsd-original\-*" 2>/dev/null
			if [ $? -eq 0 ]; then
				${ECHO} "${MAGENTA}Auto-promote FS: ${GREEN}${_name}${NORMAL}"
				/sbin/zfs promote ${_name}
			fi
			done || true

			jsnapshot mode=destroyall jname=${jname}
		fi
		# junregister jname=${jname} rcfile=${JAILRCCONF}
	fi

	[ -d "${DST}" ] && removedata ${DST} force
	[ ${zfsfeat} -eq 1 ] && jsnapshot mode=destroyall_original jname=${jname}
	[ ${unregister} -eq 0 ] && junregister jname=${jname} rcfile=${JAILRCCONF}

	[ -f "${JAILFSTAB}" ] && /bin/rm -f ${JAILFSTAB}
	[ -f "${JAILFSTAB}.local" ] && /bin/rm -f "${JAILFSTAB}.local"
	[ -f "${JAILRCCONF}" ] && /bin/rm -f ${JAILRCCONF}
	[ -f "${jailrcconfdir}/rc.conf_${jname}" ] && /bin/rm -f "${jailrcconfdir}/rc.conf_${jname}"
	[ -d "${jailsysdir}/${jname}" ] && /bin/rm -rf "${jailsysdir}/${jname}"
	[ -f "${logdir}/${jname}.log" ] && /bin/rm -f "${logdir}/${jname}.log"
	[ -d "${jaildir}/${jname}" ] && /usr/bin/find ${jaildir}/${jname}/ -type d -exec /bin/rmdir {} \; > /dev/null 2>&1
	[ -d "${jaildir}/${jname}" ] && /bin/rmdir ${jaildir}/${jname}

	if [ "${emulator}" != "jail" ]; then
		# TODO: cbsd media unregister mode=removeall jname=jname
		cbsdsql storage_media "DELETE FROM media WHERE jname=\"${jname}\" AND type = \"hdd\""
		cbsdsql storage_media "UPDATE media SET jname='-' WHERE jname=\"${jname}\" AND type = \"iso\""
	fi

	if [ "${emulator}" = "virtualbox" ]; then
		. ${workdir}/virtualbox.subr
		${VBOX_MGMT_CMD} unregistervm ${jname}
		[ -d "/root/VirtualBox VMs/${jname}" ] && /bin/rm -rf "/root/VirtualBox VMs/${jname}"
	fi

	# CBSD QUEUE
	if [ -x "${moduledir}/cbsd_queue.d/cbsd_queue" ]; then
		[ "${cbsd_queue_name}" != "none" ] && cbsd_queue cbsd_queue_name=${cbsd_queue_name} id=${jname} cmd=jremove status=2
	fi

	end_time=$( /bin/date +%s )
	cbsdlogger NOTICE ${CBSD_APP}: jail ${jname} removed in $(( end_time - st_time ))s
done

exit 0
