#!/usr/local/bin/cbsd
# fetch http://pkgmir.pkg.freebsd.org/freebsd:11:x86:64/latest/packagesite.txz
#v11.2.0
globalconf="${workdir}/cbsd.conf"
CBSDMODULE="helpers"
MYARG="mode"
MYOPTARG="jname pkglist name repodir pkgconf chroot nomount"
MYDESC="cbsd pkg wrapper"
ADDHELP="jname= work in with jail, can be mask, e.g: '*', 'jail*'\n\
pkglist= use package list from file\n\
name= name of pkg\n\
repodir= repository configuration directory\n\
pkgconf= specify pkg.conf to use for pkg\n\
nomount=1 do not mount/unmount jail fs\n\
mode=add,bootstrap,install,info,query,remove,update,upgrade,clean\n"
EXTHELP="modules/pkg.d.html"

set -e
. ${globalconf}
set +e

. ${subr}
. ${strings}
. ${system}
. ${tools}
init $*

#defines
_MYDIR=$( /usr/bin/dirname `/bin/realpath $0` )
noname=0

set -e
	. ${_MYDIR}/pkg.subr
set +e

[ -n "${mode}" ] && shift
if [ -n "${nomount}" ]; then
	shift
	nomount=${nomount}
else
	nomount=0
fi

PKGARGS=""
TRAP=""
# for chroot/jail env
PKG_PRE=""

emulator="jail" # for jname_is_multiple
jail_list=
jname_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)
pkg_multi_init()
{
	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 "${MAGENTA}multiple_processing_spawn: empty -o multiple_task_owner${NORMAL}"

	. ${workdir}/multiple.subr
	${ECHO} "${MAGENTA}Hint: Press ${GREEN}'Ctrl+t'${MAGENTA} to see last logfile line for active task${NORMAL}" 1>&2
	task_id=
	task_id_cur=
	task_owner="${task_owner}"
	# spawn command for all jail
	for jname in ${jail_list}; do
		task_id_cur=$( task mode=new logfile=/tmp/${task_owner}.${jname}.log.$$ client_id=${jname} autoflush=0 owner=${task_owner} /usr/bin/env NOCOLOR=1 /usr/local/bin/cbsd pkg jname=${jname} ${cmd} 2>/dev/null )
		task_id="${task_id} ${task_id_cur}"
	done

	multiple_task_id_all=$( echo ${task_id} | /usr/bin/tr " " "," )
	sleep 1
	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

	case "${mode}" in
		clean)
				jexec jname="${jname}" pkg-static clean -ya
				;;
		update)
				/usr/bin/timeout 360 jexec jname="${jname}" env IGNORE_OSVERSION=yes pkg-static update -f
				;;
		upgrade)
				/usr/bin/timeout 360 jexec jname="${jname}" pkg-static upgrade -g -U -y
				;;
		install|add)
				task_owner="pkg_multiple_install"
				pkg_multi_init -c "$*" -o ${task_owner} -n "pkg install"
				;;
		remove)
				task_owner="pkg_multiple_remove"
				pkg_multi_init -c "$*" -o ${task_owner} -n "pkg remove"
				;;
		info)
				task_owner="pkg_multiple_info"
				pkg_multi_init -c "$*" -o ${task_owner} -n "pkg info"
				;;
		query)
				task_owner="pkg_multiple_query"
				pkg_multi_init -c "$*" -o ${task_owner} -n "pkg query"
				;;
		*)
				echo "Multiple unsupported yet for ${mode}"
				;;
	esac

	err 0 "${MAGENTA}Multiple pkg: ${GREEN}done${NORMAL}"
fi

if [ -n "${jname}" ]; then
	. ${jrcconf}
	[ $? -eq 1 ] && err 1 "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"

	over="${ver}"

	# Determine stable value. Must be after buildconf
	strpos --str="${over}" --search="."

	# auto-detect for stable/release
	pos=$?
	if [ ${pos} -eq 0 ]; then
		stable=1
		ostable=1
	else
		stable=0
		ostable=0
	fi

	[ ${baserw} -eq 1 ] && path=${data}

	if [ ${jid} -eq 0 ]; then
		. ${workdir}/universe.subr
		readconf buildworld.conf
		init_target_arch
		init_srcdir
		init_basedir
		init_kerneldir
		[ ${nomount} -eq 0 ] && prepare_offline_jail
		makeresolv jname=${jname}
	fi

	if [ "${emulator}" != "jail" -a -n "${emulator}" -a "${emulator}" != "bhyve" ]; then
		. ${workdir}/emulator.subr
		init_usermode_emul
		CHROOT_EXEC="/usr/sbin/chroot ${path} /bin/${emulator}"
	else
		CHROOT_EXEC="/usr/sbin/chroot ${path}"
	fi

	PKG_PRE="${CHROOT_EXEC}"
	shift
else
	path=""
fi

if [ -n "${pkglist}" ]; then
	[ ! -s "${pkglist}" ] && err 1 "${MAGENTA}No such file or file is empty: ${GREEN}${pkglist}${NORMAL}"
	pkgtarget=$( /bin/cat ${pkglist} | /usr/bin/xargs )
else
	pkgtarget="$*"
fi

# init path and bootstrap pkg if necessary
init_path

[ -n "${repodir}" ] && PKGARGS="${PKGARGS} -R ${repodir}"
[ -n "${chroot}" ] && PKGARGS="${PKGARGS} -c ${chroot}"

res=0

case "${mode}" in
	bootstrap)
		[ -z "${jname}" ] && err 1 "${MAGENTA}bootstrap for jail only${NORMAL}"
		pkg_bootstrap
		res=$?
		;;
	clean)
		pkg_clean "${pkgtarget}"
		res=$?
		;;
	install|add)
		pkg_install "${pkgtarget}"
		res=$?
		;;
	"remove")
		pkg_remove "${pkgtarget}"
		res=$?
		;;
	"info")
		pkg_info "${pkgtarget}"
		res=$?
		;;
	"query")
		pkg_query "${pkgtarget}"
		res=$?
		;;
	"update")
		pkg_update "${pkgtarget}"
		res=$?
		;;
	"upgrade")
		pkg_upgrade "${pkgtarget}"
		res=$?
		;;
	*)
		err 1 "${MAGENTA}Unknown mode${NORMAL}"
esac

exit ${res}
