#!/usr/local/bin/cbsd
#v11.1.5
globalconf="${distdir}/cbsd.conf";
CBSDMODULE="jail"
MYARG="jname"
MYOPTARG="fstab zfs"
MYDESC="Delegate ZFS filesystem to jail"
ADDHELP="zfs - source zfs filesystem, jname - destination jail. fstab - mount via fstab file records\n"

set -e
. ${globalconf}
set +e

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

[ ${zfsfeat} -eq 0 ] && exit
[ -n "${fstab}" -a ! -f "${fstab}" ] && err 1 "${N1_COLOR}attachzfs: ${fstab} does not exist${N0_COLOR}"
[ -z "${zfs}" -a -z "${fstab}" ] && err 1 "${N1_COLOR}attachzfs: ${N2_COLOR}zfs=${N1_COLOR} or ${N2_COLOR}fstab= ${N1_COLOR} is necessary${N0_COLOR}"

zfs_check_and_attach()
{
	local _err _mp=${2}

	zfsfs ${1}

	_err=$?

	[ "${_err}" -ne 2 ] && return ${_err}

	_err=$( ${ZFS_CMD} get -Ho value mounted ${1} )

	[ "${_err}" = "yes" ] && ${ZFS_CMD} unmount ${1}

	# now we ready for attaching ${zfs} to $jname
	${ZFS_CMD} set jailed=on ${1}
	${ZFS_CMD} jail ${jname} ${1}

	[ -z "${_mp}" ] && return 3

	_err=$( ${ZFS_CMD} get -Ho value mounted ${1} )

	if [ "${_err}" = "no" ]; then
		${CAT_CMD} >> ${data}/etc/rc.cbsdjail_first_boot <<EOF
${ZFS_CMD} set mountpoint=${_mp} ${1}
EOF
	else
		${ECHO} "${N1_COLOR}attachzfs error: FS already mounted, please unmount from hoster before attaching to jail: ${N2_COLOR}${1}${N0_COLOR}"
	fi

	return 2
}


mount_via_fstab()
{
	${CAT_CMD} ${fstab} | while read _device _mountpt _fs _mode _a _b; do
		case ":${_device}" in
			:#* | :)
				continue
			;;
		esac

		[ "${_fs}" != "zfs" -o -z "${_device}" ] && continue
		zfs_check_and_attach ${_device} ${_mountpt}
		case $? in
			0)
				${ECHO} "${N1_COLOR}attachzfs: ${N2_COLOR}${_device}${N1_COLOR} is not valid ZFS filesystem${N0_COLOR}"
				;;
			1)
				${ECHO} "${N1_COLOR}attachzfs: ${N2_COLOR}${_device}${N1_COLOR} already mounted. Please reset mount point via: ${N2_COLOR}zfs set mountpoint=none ${_device}${N0_COLOR}"
				;;
			2)
				${ECHO} "${N1_COLOR}attachzfs: attached: ${N2_COLOR}${_device}${N0_COLOR}"
				;;
			3)
				${ECHO} "${N1_COLOR}attachzfs: empty mount point for: ${N2_COLOR}${_device}${N0_COLOR}"
				;;
			*)
				${ECHO} "${N1_COLOR}attachzfs: unknown error while test for zfsfs ${zfs}. Skip${N0_COLOR}"
				;;
		esac
	done

	# exit now
	exit 0
}

. ${subrdir}/rcconf.subr
[ $? -eq 1 ] && err 1 "${N1_COLOR}attachzfs: no such jail: ${N2_COLOR}${jname}${N0_COLOR}"
[ ${status} -ne 1 ] && err 1 "${N1_COLOR}attachzfs: jail is not running: ${N2_COLOR}${jname}${N0_COLOR}"

. ${subrdir}/zfs.subr
[ -n "${fstab}" ] && mount_via_fstab

zfs_check_and_attach ${zfs}
