#! /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'
PACKAGE='globus_gram_client_tools'
VERSION='11.10'
DIRT_TIMESTAMP='1473447466'
DIRT_BRANCH_ID='85'

short_usage="$PROGRAM_NAME [-help] [-version] [-f N] [-tail N] [-r <resource manager>] -out|-err <jobID>"

long_usage()
{
    cat >&2 <<EOF

Usage: ${short_usage}

    Retrieves the stdout (-out) or stderr (-err) from a job started with
    globus-job-submit and identified through the identifier <jobID>.

    If neither -out or -err is given, -out is assumed.

    A valid proxy is required for this operation to succeed.

    Options:
	-help, -usage           Display usage
	-version                Display version
	-resource         (-r)  Fetch output using the specified resource
                                manager
	-out, -err              Show stdout OR stderr of remote job
	-tail N           (-t)  Show last N lines of output
	-follow N         (-f)  Show last N lines of output and any new line

EOF
}

outopt=
erropt=
jobid=
resource=
tailopt=no
followopt=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 [ $# -lt 1 ]; 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;
            ;;
	-out | --out)
	    outopt=true
	    ;;
	-err | --err)
	    erropt=true
	    ;;
	-r | -resource | --resource)
	    if [ -z "$2" ]; then
		globus_args_option_error "$1" "need a resource contact string"
	    fi
	    resource="$2"
	    shift
	    ;;
	-t|-tail|-f|-follow|--tail|--follow)
	    if [ -z "$2" ]; then
		globus_args_option_error "$1" "need an integer argument"
	    fi
	    if expr "$2" + 1 - 1 \> 0 \
		1>/dev/null 2>/dev/null
	    then
                case "$1" in
                    -t|-tail)
                        tailopt="$2"
                        ;;
                    -f|-follow)
                        followopt="$2"
                        ;;
                esac
                shift
            else
		globus_args_option_error "$1" "need an integer argument"
	    fi
	    ;;
	--)
	    break
	    ;;
	-*)
	    globus_args_unrecognized_option "$1"
	    ;;
	*)
	    if [ $# -gt 1 ]; then
		globus_args_option_error "$1" "jobID has to be last argument"
	    fi
	    jobid="$1"
	    ;;
    esac
    shift
done

stream=stdout
if [ -n "${erropt}" ] ; then
    stream=stderr
fi

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

if [ -n "${outopt}" -a -n "${erropt}" ]; then
    echo "" >&2
    echo "ERROR: -out and -err are exclusive!" >&2
    globus_args_short_usage
    exit 1
fi

if [ "${followopt}" != no -a "${tailopt}" != no ]; then
    echo "" >&2
    echo "ERROR: -follow and -tail are exclusive!" >&2
    globus_args_short_usage
    exit 1
fi

if [ -z "${resource}" ]; then
    resource=`echo ${jobid} | awk -F: '{print $2}' | \
	sed 's|/||g'`
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

case ${tailopt}:${followopt} in
    no:no)
	# cat the file, exit
	command="\cat"
	;;
    *:no)
	# tail the file
	command="\tail -${tailopt}"
	;;
    no:*)
	# follow the file
	command="\tail -${followopt}f"
	;;
    *)
	echo "INTERNAL ERROR: tailopt:followopt = ${tailopt}:${followopt}" >&2
	;;
esac

tmpfile=${TMPDIR:-/tmp}/globus_job_get_output.${LOGNAME}.tmp.$$

# redirect stderr to file so we can see if error occurs after the fact
globusrun -s -r "$resource" 2> $tmpfile \
    "&(executable=\$(GLOBUSRUN_GASS_URL)/$bindir/globus-job-get-output-helper)
      (arguments=
            anExtraTag
            \"$jobid\"
            \"$stream\"
            \"$tailopt\"
            \"$followopt\"
            \$(GLOBUSRUN_GASS_URL))"

status=$?

if test "$status" != 0; then
    cat $tmpfile 1>&2
    rm $tmpfile
    exit $status
fi
if test -s $tmpfile; then
    cat $tmpfile 1>&2
    rm $tmpfile
    exit 1
fi
rm $tmpfile
exit 0
