#!/usr/local/bin/cbsd
#v12.0.6
MYARG="jname"
MYOPTARG="dbfile rcfile"
MYDESC="Unregister environments and dump settings from DB to ASCII/text config file"
CBSDMODULE="jail"
ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

CBSD stores most of the environment settings in the corresponding databases (by default: sqlite3).
 The 'cbsd junregister' script dump records for the environment to plain text files and remove
 environment settings from DB (without destroying files (zvol, FS root directory )

Script can be used to import/export environment settings, this is the
reverse operation for 'cbsd jregister' script.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}dbfile=${N0_COLOR}       - <path>, default main database path, by default:
                 ${dbdir}/local.sqlite;
 ${N2_COLOR}jname=${N0_COLOR}        - target environment;
 ${N2_COLOR}rcfile=${N0_COLOR}       - <path>, alternative path to source config file, by default:
                 ${jailrcconfdir}/rc.conf_<env>;

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd jregister jname=myail1

${H3_COLOR}See also${N0_COLOR}:

 cbsd jregister --help

"

. ${subrdir}/nc.subr

. ${cbsdinit}

. ${subrdir}/env_register.subr

emulator="jail" # for jname_is_multiple
jail_list=
jname_is_multiple

# -n "name of the tools" - show <name> in Info string, e.g: -n jexec, -n "pkg install" ...
# -o uniq_name_of_the_task (one world)
junregister_multi_init()
{
	local _jname

	while getopts "c:n:o:" opt; do
		case "${opt}" in
			c) cmd="${OPTARG}" ;;
			n) _multiple_consumer_name="${OPTARG}" ;;
			o) task_owner="${OPTARG}" ;;
		esac
		shift $(($OPTIND - 1))
	done

	[ -z "${task_owner}" ] && err 1 "${N1_COLOR}multiple_processing_spawn: empty -o multiple_task_owner${N0_COLOR}"

	. ${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_id=
	task_id_cur=
	task_owner="${task_owner}"
	# spawn command for all jail
	for _jname in ${jail_list}; do
		task_id_cur=$( task mode=new logfile=${tmpdir}/${task_owner}.${_jname}.log.$$ client_id=${_jname} autoflush=0 owner=${task_owner} /usr/bin/env NOCOLOR=1 /usr/local/bin/cbsd junregister jname=${_jname} ${cmd} 2>/dev/null )
		sleep 0.1               # dont bruce taskdb
		if ! is_number "${task_id_cur}"; then
			task_id="${task_id} ${task_id_cur}"
		fi
	done

	multiple_task_id_all=$( echo ${task_id} | ${TR_CMD} " " "," )
	sleep 0.5
	multiple_processing_spawn -o ${task_owner} -n "${_multiple_consumer_name}"
}

# MAIN for multiple jails
if [ -n "${jail_list}" ]; then
	# multiple jailsastart always non interactive
	if [ -n "${jail_list}" ]; then
		JLIST="${jail_list}"
	fi

	_args=

	# trim for jname= in "$*"
	for i in $*; do
		prefix=
		prefix6=$( substr --pos=0 --len=6 --str="${i}" )
		[ "${prefix6}" = "jname=" ] && continue
		if [ -n "${_args}" ]; then
			_args="${_args} ${i}"
		else
			_args="${i}"
		fi
	done

	task_owner="junregister_multiple_remove"
	junregister_multi_init -c "${_args}" -o ${task_owner} -n "junregister"
	err 0 "${N1_COLOR}Multiple junregister: ${N2_COLOR}done${N0_COLOR}"
fi


ret=0
. ${subrdir}/rcconf.subr
if [ $? -eq 1 ]; then
	# jail can be already unregistered
	JAILRCCONF="${jailrcconfdir}/rc.conf_${jname}"
	if [ ! -f "${JAILRCCONF}" ]; then
		err 1 "${N1_COLOR}No such jail: ${N2_COLOR}${jname}${N0_COLOR}"
	else
		err 1 "${N1_COLOR}Already unregistered: ${N2_COLOR}${jname}${N0_COLOR}"
	fi
fi

if [ ${jid} -ne 0 ]; then
	err 1 "${N1_COLOR}Jail is active. Please stop them first: ${N2_COLOR}${jname}${N0_COLOR}"
fi

jcleanup jname="${jname}"

[ -z "${dbfile}" ] && dbfile="${dbdir}/local.sqlite"

if [ ! -f "${dbfile}" ]; then
	err 1 "${N1_COLOR}inventorydb not found. You must create them first via misc/updatesql: ${N2_COLOR}${dbfile}${N0_COLOR}"
fi

if [ -z "${rcfile}" ]; then
	JAILRCCONF="${jailrcconfdir}/rc.conf_${jname}"
else
	JAILRCCONF="${rcfile}"
fi

CONF_DIR=$( ${DIRNAME_CMD} ${JAILRCCONF} )
[ ! -d "${CONF_DIR}" ] && ${MKDIR_CMD} -m 0755 -p ${CONF_DIR}
[ ! -d "${CONF_DIR}" ] && err 1 "${N1_COLOR}no such dir: ${N2_COLOR}${CONF_DIR}${N0_COLOR}"

jmkrcconf jname=${jname} > ${JAILRCCONF}
res=$( replacewdir file0="${JAILRCCONF}" old=${workdir} new="CBSDROOT" )
_ret=$?

if [ ${_ret} -ne 0 ]; then
	${RM_CMD} -f ${JAILRCCONF}
	err 1 "${N1_COLOR}Error replacewdir for ${JAILRCCONF}: ${res}${N0_COLOR}"
fi

if [ -r ${mount_fstab} ]; then
	res=$( replacewdir file0="${mount_fstab}" old=${workdir} new="CBSDROOT" )
	_ret=$?
	[ ${_ret} -ne 0 ] && err 1 "${N1_COLOR}Error replacewdir for ${mount_fstab}: ${res}${N0_COLOR}"
fi

if [ -r {mount_fstab}.local ]; then
	res=$( replacewdir file0="{mount_fstab}.local" old=${workdir} new="CBSDROOT" )
	_ret=$?
	[ ${_ret} -ne 0 ] && err 1 "${N1_COLOR}Error replacewdir for ${mount_fstab}.local: ${res}${N0_COLOR}"
fi

register_delete_full

exit ${ret}
