#! /bin/sh

# 
# Copyright 1999-2006 University of Chicago
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 

prefix="${GLOBUS_LOCATION-/usr}"
exec_prefix="${prefix}"
sbindir="${exec_prefix}/sbin"
bindir="${exec_prefix}/bin"
includedir="${prefix}/include/globus"
datarootdir="${prefix}/share"
datadir="${datarootdir}"
libexecdir="${datadir}/globus"
sysconfdir="/etc"
sharedstatedir="/var/lib"
localstatedir="/var"

PATH="${bindir}:${sbindir}:${libexecdir}:${PATH}"


PROGRAM_NAME=${0##*/}
PROGRAM_VERSION='11.10'
# DiRT
PACKAGE='globus_gram_client_tools'
VERSION='11.10'
DIRT_TIMESTAMP='1473447466'
DIRT_BRANCH_ID='85'

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


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

long_usage()
{
    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
	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
    resourceline="-resource         (-r)  Cleanup job using the specified resource
                                manager"
    fi
    cat 1>&2 <<EOF

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

    Options:
	-help, -usage           Displays usage
        -version                Displays version
	-force            (-f)  Do not ask user to confirm ${action}
	-quiet            (-q)  Quiet ${action} (no output, implies -f)
        $resourceline
EOF
    echo "" >&2
}

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


jobid=
resource=
force=no
quiet=no

globus_args_short_usage()
{
    cat 1>&2 <<EOF

Syntax : ${short_usage}

Use -help to display full usage.

EOF
}

globus_args_option_error()
{
    cat 1>&2 <<EOF

ERROR: option $1 : $2
EOF
    globus_args_short_usage
    exit 1
}

globus_args_unrecognized_option()
{
    globus_args_option_error $1 "unrecognized option"
    exit 1
}

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

while [ -n "$1" ]; do
    case $1 in
        -help | -h | --help | -usage | --usage)
            long_usage
            exit 0
            ;;
        -version|--version)
            if [ "X${PROGRAM_NAME}" != "X" -a \
                  "X${PROGRAM_VERSION}" != "X" ]; then
                echo "${PROGRAM_NAME}: ${PROGRAM_VERSION}"
            elif [ "X${PACKAGE}" != "X" -a \
                   "X${VERSION}" != "X" ]; then
                echo "${PACKAGE}: ${VERSION}"
            else
                echo "No version information available."
            fi
            exit 0
            ;;
        -versions|--versions)
            AT=@
            if [ -n "${PACKAGE}" -a -n "${VERSION}" -a \
                 -n "${DIRT_TIMESTAMP}" -a -n "${DIRT_BRANCH_ID}" -a \
                 "X${DIRT_TIMESTAMP}" != "X${AT}DIRT_TIMESTAMP${AT}" -a \
                 "X${DIRT_BRANCH_ID}" != "X${AT}DIRT_BRANCH_ID${AT}" ];
            then
                echo "${PACKAGE}: ${VERSION} (${DIRT_TIMESTAMP}-${DIRT_BRANCH_ID})"
            else
                echo "No DiRT information available."
            fi
            exit 0;
            ;;
	-f | -force | --force)
	    force=yes
	    ;;
	-q | -quiet | --quiet)
	    force=yes
	    quiet=yes
	    ;;
        -r | -resource | --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} | awk -F: '{print $2}' | \
          sed 's|/||g')"
   fi
fi

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
	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
    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="$(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

