#!/usr/local/bin/cbsd
#v11.0.0
globalconf="${workdir}/cbsd.conf"
CBSDMODULE="bsdconf"
MYARG=""
MYOPTARG="jname mode baseonly ver arch"
MYDESC="cbsd service wrapper"
ADDHELP="jname= work in with jail\n\
mode=list - show service list but apply IGNORE_SERVICES list from srvbrowser.conf\n\
baseonly=1 - show services only from FreeBSD distribition (use basejail dir)\n"
EXTHELP="modules/bsdconf.d.html"

. ${subr}
. ${strings}
. ${system}

unset jname baseonly arch ver

init $*


srv_list()
{
	readconf ${platform}-srvbrowser.conf

	local _i _x _skip
	srv_list=

	for _i in $( ${exec_cmd} -l ); do
		_skip=0
		for _x in ${IGNORE_SERVICES}; do
			[ "${_x}" = "${_i}" ] && _skip=1
		done
		[ ${_skip} -eq 0 ] && srv_list="${srv_list} ${_i}"
	done

	for i in ${srv_list}; do
		echo ${i}
	done
}

#defines
_MYDIR=$( dirname `realpath $0` )
[ -n "${jname}" ] && shift # skip for jname arg
[ -n "${baseonly}" ] && shift # skip for baseonly arg
[ -n "${arch}" ] && shift # skip for arch arg
[ -n "${ver}" ] && shift # skip for ver arg

cmd="${@}"
[ -z "${cmd}" ] && err 1 "${MAGENTA}Empty command${NORMAL}"

## MAIN ##
if [ -n "${jname}" ]; then
	. ${jrcconf}
	[ $? -eq 1 ] && err 1 "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
	[ ${jid} -eq 0 ] && err 1 "Jail is offline"
#	permit any action, e.g: configtest ?
	[ $baserw -eq 1 ] && path=$data

	exec_cmd="jexec jname=${jname} /usr/sbin/service"
else
	data=""
	if [ "${baseonly}" = "1" ]; then
		. ${workdir}/universe.subr
		readconf buildworld.conf
		. ${buildconf}
		init_target_arch
		init_srcdir
		init_basedir
		[ ! -d "${BASE_DIR}/dev" ] && err 1 "${MAGENTA}No such base: ${GREEN}${BASE_DIR}${NORMAL}"
		exec_cmd="/usr/sbin/chroot ${BASE_DIR} /usr/sbin/service"
		/sbin/mount -t devfs devfs ${BASE_DIR}/dev
		TRAP="${TRAP} /sbin/umount ${BASE_DIR}/dev;"
		trap "${TRAP}" HUP INT ABRT BUS TERM EXIT
	else
		exec_cmd="/usr/sbin/service"
	fi
fi

[ ! -d "${data}/etc" ] && err 1 "${MAGENTA}No such etc dir: ${GREEN}${data}/etc${NORMAL}"

case "${mode}" in
	list)
		srv_list
		;;
	*)
		${exec_cmd} ${cmd}
		errcode=$?
		;;
esac

exit ${errcode}
