#!/usr/local/bin/cbsd
#v12.2.2
MYARG="mode"
MYOPTARG="version"
MYDESC="Work with cbsd modules"
ADDHELP="\
  mode=install to install module\n\
  mode=update to update module\n\
  version=tag to install specific version, 'main' as default (master)\n\
  e.g:\n\
    cbsd module mode=install forms-redis version=6.1.0\n\
"

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

install_module()
{
	local _ret _res
	local _gh_remote_prefix="https://github.com/cbsd/modules"
	local _gh_raw_content_prefix="https://raw.githubusercontent.com/cbsd/modules"
	local _gh_remote_url="${_gh_remote_prefix}-${data}.git"
	#local _grep_filter="^MODULE_NAME=|^MODULE_DIR="
	local _grep_filter="^MODULE_DIR="
	local _prefix23
	local CBSDPATH

	[ -z "${data}" ] && err 1 "${N1_COLOR}${CBSD_APP}: no such data variable${N0_COLOR}"

	local _metadata_tmp="/tmp/cbsd_module.$$"

	# fetch metadata via unprivilege user
	${SU_CMD} -m nobody -c "${FETCH_CMD} -q -o ${_metadata_tmp} ${_gh_raw_content_prefix}-${data}/${version}/metadata.conf"
	_ret=$?

	if [ ${_ret} -ne 0 ]; then
		err 1 "${N1_COLOR}${CBSD_APP}: unable to fetch metadata via: ${FETCH_CMD} ${N2_COLOR}${_gh_raw_content_prefix}-${data}/${version}/metadata.conf${N0_COLOR}"
	fi

	# trim .. in path and "
	MODULE_DIR=$( ${SU_CMD} -m nobody -c "${GREP_CMD} -E \"${_grep_filter}\" ${_metadata_tmp}" | ${AWK_CMD}  -F"[=]" '{print $2}' | ${SED_CMD} -e 's:\"::g' -e 's:(\.\.:_:g' )
	_ret=$?

	[ ${_ret} -ne 0 -o -z "${MODULE_DIR}" ] && err 1 "${N1_COLOR}${CBSD_APP}: unable to extract MODULE_DIR= variable from manifest: ${N2_COLOR}${_gh_raw_content_prefix}-${data}/${version}/metadata.conf${N0_COLOR}"

	${RM_CMD} ${_metadata_tmp}

	# we do not accept content in places other than CBSD, test it
	_prefix23=$( substr --pos=0 --len=23 --str="${MODULE_DIR}" )
	[ "${_prefix23}" != "/usr/local/cbsd/modules" ] && err 1 "${N1_COLOR}${CBSD_APP}: MODULE_DIR != /usr/local/cbsd/modules in manifest: ${N2_COLOR}${MODULE_DIR}${N0_COLOR}"

	case "${mode}" in
		install)
			[ -d "${MODULE_DIR}" ] && err 1 "${N1_COLOR}${CBSD_APP}: MODULE_DIR already exist: ${N2_COLOR}${MODULE_DIR}${N0_COLOR}"
			;;
		update)
			[ ! -d "${MODULE_DIR}" ] && err 1 "${N1_COLOR}${CBSD_APP}: MODULE_DIR doesn't exist: ${N2_COLOR}${MODULE_DIR}${N0_COLOR}"
			cd ${MODULE_DIR}
			CBSDPATH="${PATH}"
			# reset CBSD PATH
			# it is necessary due to git used external command with conflict with CBSD path
			export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
			${GIT_CMD} pull --ff-only
			_ret=$?
			# restore CBSD PATH
			export PATH="${CBSDPATH}"
			[ ${_ret} -ne 0 ] && err 1 "${N1_COLOR}${CBSD_APP}: git pull error${N0_COLOR}"
			return 0
			;;
	esac

	${ECHO} "${N1_COLOR}${CBSD_APP}: clonning: ${N2_COLOR}${GIT_CMD} clone --depth=1 --single-branch ${_gh_remote_url} ${MODULE_DIR}${N0_COLOR}"
	CBSDPATH="${PATH}"
	# reset CBSD PATH
	# it is necessary due to git used external command with conflict with CBSD path
	export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
	${GIT_CMD} clone --depth=1 --single-branch ${_gh_remote_url} ${MODULE_DIR}
	_ret=$?
	# restore CBSD PATH
	export PATH="${CBSDPATH}"
	[ ${_ret} -ne 0 ] && err 1 "${N1_COLOR}${CBSD_APP}: clone error${N0_COLOR}"

	${ECHO} "${N1_COLOR}${CBSD_APP}: module installed: ${N2_COLOR}${data}${N0_COLOR}"

	if [ -r "${MODULE_DIR}/message.txt" ]; then
		${ECHO} "${N1_COLOR}${CBSD_APP}: module post-install message:${N0_COLOR}"
		${CAT_CMD} ${MODULE_DIR}/message.txt
	fi

	return 0
}


# cbsd module mode=install KyleAnderson-consul version=6.1.0
[ -z "${GIT_CMD}" -o ! -x "${GIT_CMD}" ] && err 1 "${N1_COLOR}${CBSD_APP}: no such git, please install first: ${N2_COLOR}pkg install -y devel/git${N0_COLOR}"

# parse args
for i in $*; do
	prefix5=$( substr --pos=0 --len=5 --str="${i}" )
	prefix7=$( substr --pos=0 --len=7 --str="${i}" )
	prefix8=$( substr --pos=0 --len=8 --str="${i}" )
	[ "${prefix5}" = "mode=" ] && continue
	[ "${prefix7}" = "module=" ] && continue
	[ "${prefix8}" = "version=" ] && continue
	data="${i}"
done

case "${mode}" in
	install|update)
		[ -z "${version}" ] && version="main"
		[ -z "${data}" ] && err 1 "${N1_COLOR}${CBSD_APP}: no such module name${N0_COLOR}"
		install_module
		;;
	*)
		err 1 "${N1_COLOR}${CBSD_APP}: unknown mode: ${N2_COLOR}${mode}${N0_COLOR}"
		;;
esac

exit ${ret}
