#!/bin/bash

############################################################
# Shell script to upload file to the remote host using sftp
############################################################

TR=/usr/bin/tr
SFTP=sftp
PASSWD=""
OPTIONS=""
PORT=""
HOST=""
LOCAL_FILE=""
REMOTE_FILE="/"
USERNAME=""
sftpStatus=0

show_help()
{
	echo "Usage: $0 [--username username] [--password password] [--host host] [--port port] [--localfile filetoupload]  [--remotefile remotefile]"
}

is_ip6()
{
	regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
	var="$1"

	if [[ $var =~ $regex ]]; then
	    return 1
	fi

	return 0
}

if [ "$#" -lt 1 ]; then
    show_help
    exit
fi

while [[ $# > 1 ]]
do
i="$1"
case $i in
    -u|--username)
	USERNAME="$2"
    shift # past argument=value
    ;;
    -p|--password)
    PASSWD="$2"
    shift # past argument=value
    ;;
	-h|--host)
    HOST="$2"
    shift # past argument=value
    ;;
    -P|--port)
    PORT="$2"
    shift # past argument=value
    ;;
    -f|--localfile)
    LOCAL_FILE="$2"
    shift # past argument=value
	;;
	--help)
		show_help
	exit
    ;;
    -r|--remotefile)
    REMOTE_FILE=$2
    ;;
    *)
        # unknown option
    ;;
esac
	shift # past argument or value
done

USR_HOST=$USERNAME@$HOST
is_ip6 $HOST
if [ $? -eq 1 ]; then
	USR_HOST=$USERNAME@[$HOST]
fi

if [ -z $PORT ]; then
	OPTIONS="-oBatchMode=no -b - -o StrictHostKeyChecking=no $USR_HOST"
else
	OPTIONS="-oBatchMode=no -b - -o Port=$PORT -o StrictHostKeyChecking=no $USR_HOST"
fi

checksftpstatus()
{
    if [[ $sftpstatus -ne 0 ]]; then
	echo "Transfer failed!"
	exit $sftpstatus
    fi
}

# connect to sftp server and create dirctory on remote side
createRemoteDirHelper()
{
export SSHPASS="$PASSWD"
/bin/sshpass -e $SFTP $OPTIONS << !
mkdir $1
!
#sftpstatus=$?
#checksftpstatus
}

# function to create dirctory on remote side
createRemoteDir()
{
local REMOTEPATH=""
local DIRS=$1
local CREATE_LAST="false"

if [ "${DIRS: -1}" == "/" ]; then
    CREATE_LAST="true"
fi

IFS=' ' read -a array <<< "$(echo $DIRS | tr "/" " ")"

size=${#array[@]}
lastIndex=$(($size-1))

for index in "${!array[@]}"
do
    d="${array[index]}"
    if [ "$CREATE_LAST" == "true" ] || [ "$index" != "$lastIndex" ]; then
	if [ -z $REMOTEPATH ]; then
	    createRemoteDirHelper ${d}
	    REMOTEPATH="${d}"
	else
	    createRemoteDirHelper ${REMOTEPATH}/${d}
	    REMOTEPATH="${REMOTEPATH}/${d}"
	fi
    fi
done
}

BASE_NAME=$(basename $REMOTE_FILE)

if [ ! "$BASE_NAME" = $REMOTE_FILE ]; then
    createRemoteDir $REMOTE_FILE
fi

# do put operation

export SSHPASS="$PASSWD"
/bin/sshpass -e $SFTP $OPTIONS << !
put -r $LOCAL_FILE $REMOTE_FILE
bye
!
sftpstatus=$?
checksftpstatus

#rm ${BATCH_FILE}
echo "FINISHED"
