#!/usr/local/bin/cbsd
#v12.0.6
MYARG="jname"
MYOPTARG="dbfile mode rcfile"
MYDESC="Register jail records to SQLite from ASCii config or re-populate ASCii config from SQLite"
ADDHELP="mode= set (apply), unset, show (show current state) or get (show limits)\n\
rcfile=alternarive path for rcconf instead of jails-rcconf dir\n"
CBSDMODULE="jail"

. ${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

[ -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=$( /usr/bin/dirname ${JAILRCCONF} )
[ ! -d "${CONF_DIR}" ] && /bin/mkdir -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
	/bin/rm -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}
