#!/usr/local/bin/cbsd
#v11.0.15
CBSDMODULE="jail"
MYARG="jname"
MYOPTARG="dbfile mode status 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\
status= overwrite default status, for example set it to maintenace by default\n\
rcfile= alternative path to ascii rc.conf file\n"

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

init $*

. ${workdir}/env_register.subr


# We accept jname with wildcard '*' e.g.: jail*, *vnet*
# Also we need personal jname_is_multiple()
# since jname_is_multiple from tools operate only with SQLite3
# while jregister works only with ascii-based rc.conf files

# jail as mask?
is_mask=0

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

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

jail_list=

if [ ${is_mask} -ne 0 ]; then

	for J in $( /bin/ls ${jailrcconfdir} ); do
		[ "${J}" = "dir.id" ] && continue
		jname=
		[ ! -r ${jailrcconfdir}/${J} ] && continue
		. ${jailrcconfdir}/${J}
		[ -z "${jname}" ] && continue
		jail_list="${jail_list} ${jname}"
	done
fi

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

for jname in ${JLIST}; do

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

	if [ ! -f  ${JAILRCCONF} ]; then
		${ECHO} "${MAGENTA}no rcconf ${JAILRCCONF} file for jail: ${GREEN}${jname}${NORMAL}"
		continue
	fi

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

	# make backup before replacewdir
	/bin/cp -a ${JAILRCCONF} /tmp/rcconf.$$

	replacewdir file0=/tmp/rcconf.$$ old="CBSDROOT"
	. /tmp/rcconf.$$

	# extra check for system direcories
	#if [ ! -r ${jailsysdir}/${jname}/local.sqlite ]; then
	#	/bin/rm -f /tmp/rcconf.$$
	#	err 1 "${LRED}Error: no data (shared dir?) or wrong permission in system directory: ${GREEN}${jailsysdir}/${jname}/local.sqlite${NORMAL}"
	#fi

	# extra check for data direcories
	_data_files=$( /bin/ls -1 ${data} )

	#if [ -z "${_data_files}" ]; then
	#	/bin/rm -f /tmp/rcconf.$$
	#	err 1 "${LRED}Error: no data (shared dir?) or wrong permission, empty dir: ${GREEN}${data}${NORMAL}"
	#fi

	#case "${emulator}" in
	#	jail)
	#		[ ! -r ${mount_fstab} ] && ${ECHO} "${LRED}Warning: fstab file not found - this is ok (shared dir?): ${GREEN}${mount_fstab}${NORMAL}"
	#		[ -r ${mount_fstab} ] && replacewdir file0="${mount_fstab}" old="CBSDROOT"
	#		[ -r ${mount_fstab}.local ] && replacewdir file0="${mount_fstab}.local" old="CBSDROOT"
	#		;;
	#esac

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

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

	if [ ! -f "${dbfile}" ]; then
		${ECHO} "${MAGENTA}inventorydb not found. You must create them first via misc/updatesql: ${GREEN}${dbfile}${NORMAL}"
		continue
	fi

	. ${sharedir}/jail-arg

	register_delete_full
	register_insert_full

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

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