#!/usr/local/bin/cbsd
#v11.1.0
MYARG="mode"
MYOPTARG="logfile notify autoflush nodetask owner after client_id jname jconf exclusive"
MYDESC="Task queue management"
CBSDMODULE="taskd"
ADDHELP="mode=new <cmd>, mode=cancel <jobid>, mode=cancelall, mode=flushall\n\
notify=0 for prevent notification of result to email\n\
autoflush=0,1,2 (0 - all jobs stored in base, 1 - autoflush completed cmd, 2 - autoflush for all cm)\n\
after=X - shedule a new task to run only after job with id X will be successfully completed\n\
exclusive= prevent multiple task running by cmd,jname,owner params. When 1 - is exclusive job\n"

EXTHELP="wf_taskd.html"

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

# for init: disable double args initialization
double_args=0

init $*

[ -z "${exclusive}" ] && exclusive=0

try_remote()
{
	local _ip node="${nodetask}"

	. ${nodes}

	_ip=$( cbsdsql nodes SELECT ip FROM nodelist WHERE nodename=\"${node}\" 2>/dev/null )
	[ -z "${_ip}" ] && err 1 "${MAGENTA}No such ip for node: ${GREEN}${node}${NORMAL}"

	if ! check_locktime ${ftmpdir}/shmux_${_ip}.lock > /dev/null 2>&1; then
		err 1 "${MAGENTA}Node is offline: ${GREEN}${node}${NORMAL}"
	fi

	rexe node=${node} cbsd task mode=new owner=${nodename} $@
	echo "NODE: ${node}"
	echo "TASK STR: $@"
	owner="${nodename}"
	echo "OWNER: ${owner}"

	exit 0
}


## MAIN
[ -n "${logfile}" ] && shift
[ -n "${notify}" ] && shift
[ -n "${autoflush}" ] && shift
[ -n "${node}" ] && shift
[ -n "${owner}" ] && shift
[ -n "${after}" ] && shift
[ -n "${client_id}" ] && shift

[ -n "${jconf}" -a -r "${jconf}" ] && . ${jconf}

shift ## mode=xxx

## place for default of all variables for remote node?
[ -z "${notify}" ] && notify=1
[ -z "${after}" ] && after=0
[ -z "${client_id}" ] && client_id=0
[ -z "${owner}" ] && owner=$( /usr/bin/whoami )
[ -n "${nodetask}" ] && try_remote $@

case "${mode}" in
	"new")
		[ -z "$1" ] && err 1 "${MAGENTA}Command required${NORMAL}"

		# test for exclusive
		if [ ${exclusive} -eq 1 ]; then
			_excl_test=$( cbsdsql cbsdtaskd "SELECT id FROM taskd WHERE cmd=\"$@\" AND status != 2 AND owner=\"${owner}\" AND jname=\"${jname}\" ORDER BY id DESC LIMIT 1" )
			[ -n "${_excl_test}" ] && err 1 "${MAGENTA}This job is exclusive, waiting to complete: ${GREEN}${_excl_test}${NORMAL}"
		fi

		if [ -n "${logfile}" ]; then
			_err=$( cbsdsql cbsdtaskd "INSERT INTO taskd ( cmd,status,logfile,logtype,notify,autoflush,owner,after,client_id,jname ) VALUES ( \"$@\", 0, \"$logfile\", 0, \"$notify\", \"$autoflush\", \"$owner\", \"$after\", \"$client_id\", \"${jname}\" )" )
		else
			_err=$( cbsdsql cbsdtaskd "INSERT INTO taskd ( cmd,status,notify,autoflush,owner,after,client_id,jname ) VALUES ( \"$@\", 0, \"$notify\", \"$autoflush\", \"$owner\", \"$after\", \"$client_id\", \"${jname}\" )" )
		fi

		[ $? -ne 0 ] && err 1 "${MAGENTA}Error: ${_err}${NORMAL}"
		tid=$( cbsdsql cbsdtaskd "SELECT id FROM taskd WHERE cmd=\"$@\" AND status=0 ORDER BY id DESC LIMIT 1" )
		[ -z "${tid}" ] && err 1 "${MAGENTA}Error: ${_err}${NORMAL}"
		echo "${tid}"
		;;
	"cancel")
		;;
	"cancelall")
		;;
	"flushall")
		for i in $( cbsdsql cbsdtaskd SELECT logfile FROM taskd WHERE status='2' ); do
			[ -f "${i}" ] && /bin/rm -f "${i}"
		done
		cbsdsql cbsdtaskd DELETE FROM taskd WHERE status='2'
		x=$( cbsdsql cbsdtaskd "SELECT COUNT(id) FROM taskd" )
		# reset SQLITE_SEQUENCE
		[ "${x}" = "0" ] && cbsdsql cbsdtaskd "UPDATE sqlite_sequence SET seq=0 WHERE name=\"taskd\""
		;;
esac
