#!/usr/local/bin/cbsd
#v11.0.6
MYARG=""
MYOPTARG="jname inter"
MYDESC="Destroy jail"
CBSDMODULE="jail"
EXTHELP="wf_jremove"
ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

Destroy jail and all related data.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}jname=${N0_COLOR} - target env name.

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd jdestroy
 # cbsd jdestroy <env>
 # cbsd jdestroy jname=<env>

${H3_COLOR}See also${N0_COLOR}:

 cbsd destroy --help

"

. ${subrdir}/nc.subr
. ${tools}	# for select_jail_by_list

if [ -z "${1}" ]; then
	select_jail_by_list -s "List of local jails:" -r ${sqlreplica}
	[ -z "${jname}" ] && err 1 "${N1_COLOR}No such domains${N0_COLOR}"
	if getyesno "Remove jail ${jname}. Are you sure? "; then
		echo
	else
		exit 0
	fi
fi

. ${cbsdinit}
. ${jfs}

[ -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"

if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then
	readconf cbsd_queue.conf
	[ -z "${cbsd_queue_backend}" ] && MOD_CBSD_QUEUE_DISABLED="1"
fi

. ${subrdir}/time.subr
st_time=$( ${DATE_CMD} +%s )

for jname in ${JLIST}; do
	DST="${jaildatadir}/${jname}-${jaildatapref}"
	JAILDIR="${jaildir}/${jname}"
	JAILFSTAB_OLD="${jailfstabdir}/${jailfstabpref}${jname}"
	JAILFSTAB_DIR="${jailfstabdir}/${jname}"
	JAILRCCONF="${jailsysdir}/${jname}/rc.conf_${jname}"
	unregister=0

	# Redis
	if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
		cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":1}'
	fi

	# per-jail time
	st_jtime=$( ${DATE_CMD} +%s )

	. ${subrdir}/rcconf.subr
	if [ $? -eq 1 ]; then
		if [ ! -f "${JAILRCCONF}" ]; then
			# remote?
			if [ ${sqlreplica} -eq 0 ]; then
				${ECHO} "${N1_COLOR}no such jail: ${N2_COLOR}${jname}${N0_COLOR}"
				if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
					cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":2}'
				fi
				continue
			fi
			remotenode=$( jwhereis ${jname} )
			if [ -z "${remotenode}" ]; then
				${ECHO} "${N1_COLOR}No such jail: ${N2_COLOR}${jname}${N0_COLOR}"
				if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
					cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":2}'
				fi
				continue
			fi
			for i in ${remotenode}; do
				if [ "${i}" = "${nodename}" ]; then
					${ECHO} "${N1_COLOR}Remote jremove: found on nodename ${N2_COLOR}${nodename}${N1_COLOR}. Skipped${N0_COLOR}"
					continue
				fi
				${ECHO} "${N1_COLOR}Remote jremove: ${N2_COLOR}${jname} ${N1_COLOR}on${N2_COLOR} ${i}${N0_COLOR}"
				rexe node=${i} cbsd jremove jname=${jname}
				if [ $? -eq 0 ]; then
					# updating state and put task for retrinv inventory
					${ECHO} "${N1_COLOR}Updating inventory...${N0_COLOR}"
					task autoflush=2 mode=new retrinv node=${i} data=db tryoffline=1 > /dev/null 2>&1
				fi
			done
			if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
				cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":2}'
			fi
			continue
		else
			${ECHO} "${N1_COLOR}${CBSD_APP}: found legacy/unregister config: ${N2_COLOR}${JAILRCCONF}${N0_COLOR}"
			. ${JAILRCCONF}
			unregister=1
		fi
	fi

	# getJailID()
#	if [ "${mod_cbsd_cluster_enabled}" = "YES" -a -z "${MOD_CBSD_CLUSTER_DISABLED}" ]; then
#
#		if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
#			cbsdredis hget -env "jail:${jname}" jail_id
#		fi
#
#		if [ -z "${jail_id}"]; then
#			cbsdsqlrw @cluster SELECT "jail_id FROM tbl_jails WHERE jail_name='${jname}'" || read jail_id
#		fi
#
#		if [ -z "${jail_id}"]; then
#			if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
#				cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":6}'
#			fi
#			${ECHO} "${N1_COLOR}WARNING could not find jail in cluster. ${N2_COLOR}${jname}${N0_COLOR}"	
#			continue
#		fi
#
#	fi

	if [ "${protected}" = "1" ]; then
		${ECHO} "${N1_COLOR}Protected/locked jail. Skip for remove: ${N2_COLOR}${jname}${N0_COLOR}"
		# Redis
		if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
			cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":5}'
		fi
		continue
	fi

	# remove port expose
	[ ${unregister} -ne 1 ] && expose jname=${jname} mode=flush

	# CBSD QUEUE
	if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then
		readconf cbsd_queue.conf
		if [ -z "${cbsd_queue_backend}" ]; then
			MOD_CBSD_QUEUE_DISABLED="1"
		else
			[ -n "${cbsd_jail_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_jail_queue_name} id=${jname} cmd=jremove status=1
		fi
	fi

	if [ ${unregister} -eq 0 ]; then
		. ${subrdir}/jcreate.subr
		geniplist ${ip4_addr}		# for ipvX_first_public-like vars
		export_jail_data_for_external_hook
		external_exec_master_script "remove.d"
	fi

	if [ ${unregister} -eq 0 ] ; then
		if [  ${jid} -ne 0 ]; then
			case "${emulator}" in
				"bhyve")
					bstop jname=${jname} noacpi=1
					;;
				"virtualbox")
					. ${subrdir}/virtualbox.subr
					vstop jname=${jname}
					;;
				*)
					jstop jname=${jname} fast=1
					;;
			esac
		fi
		jcleanup jname=${jname}

		. ${system}     # for is_mounted
		if is_mounted ${path}; then
			${UMOUNT_CMD} ${path} 2>/dev/null
		fi
		# auto-promote if we have children
		if [ ${zfsfeat} -eq 1 ]; then
			${ZFS_CMD} get -H -o name,value origin | while read _name _values; do
			[ "${_values}" = "-" ] && continue
			echo "${_values}" | ${GREP_CMD} -q -E "${jname}@cbsd-original\-*" 2>/dev/null
			if [ $? -eq 0 ]; then
				${ECHO} "${N1_COLOR}Auto-promote FS: ${N2_COLOR}${_name}${N0_COLOR}"
				${ZFS_CMD} promote ${_name}
			fi
			done || true

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

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

	if [ -d "${JAILFSTAB_DIR}" ]; then
		removedir ${JAILFSTAB_DIR}
	fi
	[ -f "${JAILFSTAB_OLD}" ] && ${RM_CMD} -f ${JAILFSTAB_OLD}
	[ -f "${JAILFSTAB_OLD}.local" ] && ${RM_CMD} -f "${JAILFSTAB_OLD}.local"
	[ -f "${JAILRCCONF}" ] && ${RM_CMD} -f ${JAILRCCONF}
	[ -f "${jailrcconfdir}/rc.conf_${jname}" ] && ${RM_CMD} -f "${jailrcconfdir}/rc.conf_${jname}"
	[ -d "${jailsysdir}/${jname}" ] && removedir "${jailsysdir}/${jname}"
	[ -f "${logdir}/${jname}.log" ] && ${RM_CMD} -f "${logdir}/${jname}.log"
	[ -d "${jaildir}/${jname}" ] && ${FIND_CMD} ${jaildir}/${jname}/ -mindepth 1 -type d -exec ${RMDIR_CMD} {} \; > /dev/null 2>&1
	[ -d "${jaildir}/${jname}" ] && ${RMDIR_CMD} ${jaildir}/${jname}

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

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

	# CBSD QUEUE
	if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then
		[ -n "${cbsd_jail_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_jail_queue_name} id=${jname} cmd=jremove status=2 
	fi

	end_jtime=$( ${DATE_CMD} +%s )
	diff_jtime=$(( end_jtime - st_jtime ))

	#clustering
# - We only need to try and delete it when it's deleted on all nodes?!
#	if [ -n "${jail_id}" -a "${mod_cbsd_cluster_enabled}" = "YES" -a -z "${MOD_CBSD_CLUSTER_DISABLED}" ]; then
#		cbsdsqlrw @cluster DELETE FROM tbl_jails WHERE jail_id=${jail_id} || [
#			if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" ]; then
#				cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":4, "duration":'${diff_jtime}'}'
#				CBSD_SKIP_REDIS=1
#			fi
#		]
#	fi

	# Redis
	if [ "${mod_cbsd_redis_enabled}" = "YES" -a -z "${MOD_CBSD_REDIS_DISABLED}" -a -z "${CBSD_SKIP_REDIS}" ]; then
		cbsdredis publish cbsd_events '{"cmd":"'${CBSD_APP}'", "node":"'${nodename}'", "jail":"'${jname}'", "status":0, "duration":'${diff_jtime}'}'
		cbsdredis del "jail:${jname}"
	fi

	diff_jtime=$( displaytime ${diff_jtime} )
	cbsdlogger NOTICE ${CBSD_APP}: jail ${jname} removed in ${diff_jtime}
done

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
