#!/bin/bash
# vim: expandtab:tabstop=4:shiftwidth=4


function usage() {
    cat << EOF
Usage: opscp [OPTIONS] local remote

Options:
  --version             show program's version number and exit
  --help                show this help message and exit
  -l USER, --user=USER  username (OPTIONAL)
  -p PAR, --par=PAR     max number of parallel threads (OPTIONAL)
  --outdir=OUTDIR       output directory for stdout files (OPTIONAL)
  --errdir=ERRDIR       output directory for stderr files (OPTIONAL)
  -c CLUSTER, --cluster CLUSTER
                        which cluster to use
  -e ENV, --env ENV     which environment to use
  --v3                  When working with v3 environments.  v2 by default
  -t HOST_TYPE, --host-type HOST_TYPE
                        which host type to use
  --list-host-types     list all of the host types
  --timeout=TIMEOUT     timeout (secs) (0 = no timeout) per host (OPTIONAL)
  -O OPTION, --option=OPTION
                        SSH option (OPTIONAL)
  -v, --verbose         turn on warning and diagnostic messages (OPTIONAL)
  -A, --askpass         Ask for a password (OPTIONAL)
  -x ARGS, --extra-args=ARGS
                        Extra command-line arguments, with processing for
                        spaces, quotes, and backslashes
  -X ARG, --extra-arg=ARG
                        Extra command-line argument
  -r, --recursive       recusively copy directories (OPTIONAL)

Example: opscp -t ex-srv -e stg -l irb2 foo.txt /home/irb2/foo.txt

EOF
}

if [ $# -eq 0 ] || [ "$1" == "--help" ]
then
    usage
    exit 1
fi

# See if ohi is installed
if ! which ohi &>/dev/null ; then
    echo "ERROR: can't find ohi (OpenShift Host Inventory) on your system, please either install the openshift-ansible-bin package, or add openshift-ansible/bin to your path."

    exit 10
fi

PAR=200
USER=root
TIMEOUT=0
ENV=""
HOST_TYPE=""

while [ $# -gt 0 ] ; do
    case $1 in
        -t|--host-type)
            shift # get past the option
            HOST_TYPE=$1
            shift # get past the value of the option
            ;;

        -c)
            shift # get past the option
            CLUSTER=$1
            shift # get past the value of the option
            ;;

        -e)
            shift # get past the option
            ENV=$1
            shift # get past the value of the option
            ;;

        --v3)
            OPENSHIFT_VERSION="--v3 --ip"
            shift # get past the value of the option
            ;;

        --timeout)
            shift # get past the option
            TIMEOUT=$1
            shift # get past the value of the option
            ;;

        -p|--par)
            shift # get past the option
            PAR=$1
            shift # get past the value of the option
            ;;

        -l|--user)
            shift # get past the option
            USER=$1
            shift # get past the value of the option
            ;;

        --list-host-types)
            ohi --list-host-types
            exit 0
            ;;

        -h|--hosts|-H|--host|-o)
            echo "ERROR: unknown option $1"
            exit 20
            ;;

        *)
            args+=("$1")
            shift
            ;;
    esac
done

# Get host list from ohi
CMD=""
if [ -n "$CLUSTER" ] ; then
  CMD="$CMD -c $CLUSTER"
fi

if [ -n "$ENV" ] ; then
  CMD="$CMD -e $ENV"
fi

if [ -n "$HOST_TYPE" ] ; then
  CMD="$CMD -t $HOST_TYPE"
fi

if [ -n "$OPENSHIFT_VERSION" ] ; then
  CMD="$CMD $OPENSHIFT_VERSION"
fi

if [ -n "$CMD" ] ; then
    HOSTS="$(ohi $CMD 2>/dev/null)"
    OHI_ECODE=$?
fi

if [ $OHI_ECODE -ne 0 ] ; then
    echo
    echo "ERROR: ohi failed with exit code $OHI_ECODE"
    echo
    echo "This is usually caused by a bad value passed for host-type or environment."
    echo
    exit 25
fi

exec pscp.pssh -t $TIMEOUT -p $PAR -l $USER -h <(echo "$HOSTS") "${args[@]}"