#! /bin/sh

. ${GLOBUS_LOCATION}/libexec/globus-script-initializer
globus_source ${libexecdir}/globus-sh-tools.sh

#  CVS Information:
#     $Source: /home/globdev/CVS/globus-packages/gram_client_tools/source/globus-job-clean.in,v $
#     $Date: 2003/03/20 20:43:11 $
#     $Revision: 1.4 $
#     $Author: bester $


PROGRAM_NAME=`echo $0 | ${GLOBUS_SH_SED-sed} -e 's|.*/||g'`
PROGRAM_VERSION='3.6'
# DiRT
PACKAGE='globus_gram_client_tools'
VERSION='3.6'
DIRT_TIMESTAMP='1059418471'
DIRT_BRANCH_ID='42'

case "$PROGRAM_NAME" in
    *-cancel)
	action=cancel
	;;
    *-clean)
	action=cleanup
	;;
esac


short_usage="${PROGRAM_NAME} [-help] [-version] [-force] jobid"

long_usage()
{
    ${GLOBUS_SH_CAT-cat} 1>&2 <<EOF

${short_usage}

    Kills a job identified with "jobid" (if it is still running),
    started with globus-job-submit.
EOF
    if [ ${action} = cleanup ]; then
	${GLOBUS_SH_CAT-cat} 1>&2 <<EOF

    Also cleans up the cached output on the remote machine (unless
    you have specifically stated to save that in another file but
    the default).
EOF
    fi
    ${GLOBUS_SH_CAT-cat} 1>&2 <<EOF

    A valid proxy certificate is required for this operation to succeed.

    Options:
	-help, -usage           Displays usage
        -version                Displays version
        -resource         (-r)  Cleanup job using the specified resource
                                manager
	-force            (-f)  Do not ask user to confirm ${action}
	-quiet            (-q)  Quiet ${action} (no output, implies -f)
EOF
    echo "" >&2
}

globus_source ${libexecdir}/globus-args-parser-header $*

cancelJob()
{
    status=`${bindir}/globusrun -status "$1"`
    xxx=$?
    if [ ${xxx} -eq 0 ]; then
	if [ ${status} != "DONE" ]; then
	    ${bindir}/globusrun -kill "$1"
	    xxx=$?
	fi
    fi
    return ${xxx}
}


if [ $# -eq 0 ]; then
    globus_args_short_usage
    exit 1
fi

jobid=
resource=
force=no
quiet=no

while [ -n "$1" ]; do
    case $1 in
	-f | -force)
	    force=yes
	    ;;
	-q | -quiet)
	    force=yes
	    quiet=yes
	    ;;
        -r | -resource)
            if [ -z "$2" ]; then
                globus_args_option_error "$1" "need a resource contact string"
            fi
            resource="$2"
            shift
            ;;
	--)
	    break
	    ;;
	-*)
	    globus_args_unrecognized_option $1
	    ;;
	*)
	    if [ $# -gt 1 ]; then
		globus_args_unrecognized_option $1
	    fi
	    jobid="$1"
	    ;;
    esac
    shift
done

if [ -z "${jobid}" ]; then
    echo "" >&2
    echo "ERROR: jobID string is missing" >&2
    globus_args_short_usage
    exit 1
fi

if [ ${action} = cleanup ]; then
   if [ -z "${resource}" ]; then
      resource=`echo ${jobid} | ${GLOBUS_SH_AWK} -F: '{print $2}' | \
          ${GLOBUS_SH_SED-sed} 's|/||g'`
   fi
fi

${bindir}/grid-proxy-info -exists
if [ $? -ne 0 ]; then
    echo "" >&2
    echo "ERROR: unable to locate a valid proxy" >&2
    globus_args_short_usage
    exit 1
fi


if [ ${force} = yes ]; then
    answer="Yes"
else
    if [ ${action} = cleanup ]; then
	${GLOBUS_SH_CAT-cat} <<EOF

    WARNING: Cleaning a job means:
        - Kill the job if it still running, and
        - Remove the cached output on the remote resource
EOF
    fi
    ${GLOBUS_SH_CAT-cat} <<EOF

    Are you sure you want to ${action} the job now (Y/N) ?
EOF
    read answer
fi


case "${action}:${answer}" in
    cancel:y* | cancel:Y* )

	cancelJob "${jobid}"
	if [ $? -ne 0 ] ; then
	    exit 1
	fi
	if [ ${quiet} = no ]; then
	    echo ""
	    echo "Job canceled."
	    echo "NOTE: You still need to clean files associated with the"
	    echo "job by running globus-job-clean <jobID>"
	    echo ""
	fi
	;;

    cleanup:y* | cleanup:Y* )

	cancelJob "${jobid}"
	if [ $? -ne 0 ]; then
	    exit 1
	fi

	# Eeeech... ugly...
	#
	myrsl="&(executable=\$(GLOBUS_LOCATION)/bin/globus-sh-exec)(arguments=-exec \"bad=0; \$bindir/globus-gass-cache -cleanup-url x-gass-cache://${jobid}stdout >/dev/null 2>/dev/null; if test \$? != 0; then bad=1; fi ; \$bindir/globus-gass-cache -cleanup-url x-gass-cache://${jobid}stderr  >/dev/null 2>/dev/null; if test \$? != 0; then bad=1; fi; echo \$bad;\")"
	output=`${bindir}/globusrun -o -r "${resource}" "${myrsl}"`
	status=$?

	if [ $status -ne 0 ] || [ "$output" = "1" ]; then
	    echo "Could not clean up job."
	    exit 1
	fi
	if [ ${quiet} = no ]; then
	    echo ""
	    echo "Cleanup successful."
	    echo ""
	fi
	;;
    *)
	if [ ${quiet} = no ]; then
	    echo ""
	    echo "The ${action} operation was NOT performed."
	    echo ""
	fi
	exit 1
	;;
esac

exit 0

