#!/usr/local/bin/cbsd
#v11.0.15
CBSDMODULE="jail"
MYARG=""
MYOPTARG="dbfile jname rcfile"
MYDESC="Register new environments in DB from ASCII/text config file"
ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

CBSD stores most of the environment settings in the corresponding databases (by default: sqlite3). 
 The 'cbsd jregister' script adds/insert records for the environment to these databases from plain 
text files, which containing environment parameters in the format:

param1="value"
param2="value"

Script can be used to import/export environment settings (without environment data), this is the 
reverse operation for 'cbsd junregister' 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 junregister --help

"

. ${subrdir}/nc.subr
. ${cbsdinit}

[ -z "${jname}" -a -z "${rcfile}" ] && err 1 "${N1_COLOR}Please specify: ${N2_COLOR}jname= ${N1_COLOR} or ${N2_COLOR}rcfile=${N0_COLOR}"

. ${system}

emulator="jail" # for jname_is_multiple

# jname_is_multiple but for file in rc.conf version
jname_rcconf_is_multiple()
{
	jail_list=

	# We accept jname with wildcard '*' e.g.: jail*, *vnet*
	# jail as mask?
	local is_mask=0

	local jail_pref=$( substr --pos=0 --len=1 --str=${jname} )

	if [ "${jail_pref}" = "*" ]; then
		is_mask=1
	else
		strpos --str="${jname}" --search="*"
		is_mask=$?
	fi

	if [ ${is_mask} -ne 0 ]; then
		jail_list=$( ${FIND_CMD} ${jailrcconfdir} -mindepth 1 -maxdepth 1 -name rc.conf_${jname} | ${XARGS_CMD} )
	fi
}

jname_rcconf_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)
jregister_multi_init()
{
	local _jname _res

	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
        _res=$( ${BASENAME_CMD} ${_jname} )
		task_id_cur=$( task mode=new logfile=${tmpdir}/${task_owner}.${_res}.log.$$ client_id=${_res} autoflush=0 owner=${task_owner} /usr/bin/env NOCOLOR=1 /usr/local/bin/cbsd jregister rcfile=${_jname} jname=${_res} ${cmd} 2>/dev/null )
		sleep 0.1               # dont brute 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="jregister_multiple_remove"
	jregister_multi_init -c "${_args}" -o ${task_owner} -n "jregister"

	err 0 "${N1_COLOR}Multiple jregister: ${N2_COLOR}done${N0_COLOR}"
fi

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

if [ ! -f  ${JAILRCCONF} ]; then
	err 1 "${N1_COLOR}no rcconf ${JAILRCCONF} file for jail: ${N2_COLOR}${jname}${N0_COLOR}"
fi

. ${subrdir}/env_register.subr

# MAIN
# load defaults
readconf jail-freebsd-default.conf

# make backup before replacewdir
${CP_CMD} -a ${JAILRCCONF} ${tmpdir}/rcconf.$$

replacewdir file0=${tmpdir}/rcconf.$$ old="CBSDROOT"
. ${tmpdir}/rcconf.$$

# looks fine, here goes!
# restore replaces wdir first as real rc.conf
${MV_CMD} ${tmpdir}/rcconf.$$ ${JAILRCCONF}

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

. ${distsharedir}/jail-arg

# CBSD 14.1.2, not needed: collision with zfs-migrator and other
#register_delete_full
register_insert_full

case "${emulator}" in
	bhyve)
		register_insert_bhyve
		;;
	virtualbox)
		register_insert_virtualbox
		;;
	qemu)
		register_insert_qemu
		;;
	xen)
		register_insert_xen
		;;
esac

[ ! -d "${jailsysdir}/${jname}" ] && /bin/mkdir -p ${jailsysdir}/${jname}
${MV_CMD} ${JAILRCCONF} ${jailsysdir}/${jname}

exit 0
