#!/bin/bash


function display_help() {
        echo "${0} Usage :"
        echo -e "\t-u --user\tSpecify the username"
        echo -e "\t-p --password\tSpecify the password"
        echo -e "\t-i --ip\tSpecify the IP Address of the Huawei router"
        echo -e "\t-n --number\tSpecify Tel number to text"
        echo -e "\t-h or --help\tThis help"
        echo ""
        echo "Examples :"
	echo -e "\tSend \"My message\" to your mobile phone :"
        echo -e "\t\t${0} -i 192.168.0.1 -u myuser -p mypassword -n 0612345678 My message"
	echo -e "\tSend content from STDIN to your mobile phone :"
        echo -e "\t\t${0} -i 192.168.0.1 -u myuser -p mypassword -n 0612345678 -"
}

GET_OPT=`getopt -o hu:p:i:n: --long help,user:,password:,ip:,number: -n "${0} parameters" -- "${@}"`
if [ ! "${?}" == "0" ] ; then
        display_help
        exit 1
fi
eval set -- "$GET_OPT"
while true ; do
        case ${1} in
                -u|--user)
                        NAME="${2}"
                        shift 2
                        ;;
                -p|--password)
                        PASS="${2}"
                        shift 2
                        ;;
		-i|--ip)
			IP="${2}"
                        shift 2
                        ;;
		-n|--number)
			NUMBER="${2}"
                        shift 2
                        ;;
                -h|--help)
                        display_help
			shift
                        exit 0
                        ;;
		--)
		       MESSAGE="`echo ${@} | sed 's|^-- ||g'`"
                       shift
                       break
                       ;;
		*)
			display_help >&2
			exit 1
			;;
        esac
done

if [ -z "${NAME}" -o -z "${PASS}" -o -z "${IP}" -o -z "${NUMBER}" ] ; then
        echo "You need to specify Username,Password,IP and Number" >&2
        display_help >&2
        exit 1
fi

if [ "${MESSAGE}" == "-" ] ; then
	MESSAGE=$(cat -)
fi

if [ -z "${MESSAGE}" ] ; then
	echo "You need to specify the message to send" >&2
	display_help >&2
	exit 1
fi

if ! which which > /dev/null 2>&1 ; then
	echo "which is not installed"
	exit 1
elif which curl > /dev/null 2>&1 ; then
	echo using curl
	BIN="curl --silent"
else
	echo "curl is not installed" >&2
	exit 1
fi

TMP_HEADER_FILE=`mktemp -t $(basename ${0}).XXXXXX`

ProcessRouterResponseHeader()
{
	# Get token from header
	NEWTOKEN=`cat ${TMP_HEADER_FILE} | grep "__RequestVerificationTokenone: " | awk -F' ' '{print $2}'`
	if [ ! -z "${NEWTOKEN}" ]; then TOKEN=${NEWTOKEN}; fi
	NEWTOKEN=`cat ${TMP_HEADER_FILE} | grep "__RequestVerificationToken: " | awk -F' ' '{print $2}'`
	if [ ! -z "${NEWTOKEN}" ]; then TOKEN=${NEWTOKEN}; fi
	NEWSESSIONID=`cat ${TMP_HEADER_FILE} | grep "Set-Cookie: SessionID=" | awk -F' ' '{print $2}' | cut -b 1-138`
	if [ ! -z "${NEWSESSIONID}" ]; then SESSIONID=${NEWSESSIONID}; fi
echo ${NEWTOKEN}
}

GetRouterData() # Param1: Relative URL
{
	#echo "GET on http://$ROUTER_IP$1"
	RESPONSE=`${BIN} --request GET http://${IP}${1} \
       		--dump-header ${TMP_HEADER_FILE} \
        	-H "Cookie: ${SESSIONID}" -H "__RequestVerificationToken: ${TOKEN}" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
       		`
	ProcessRouterResponseHeader
}

GetSessionToken() # No parameters
{
	# Get SessionID and RequestVerificationToken
	GetRouterData '/api/webserver/SesTokInfo'
        SESSIONID="SessionID="`echo "${RESPONSE}"| grep -oPm1 "(?<=<SesInfo>)[^<]+"`
        TOKEN=`echo "${RESPONSE}"| grep -oPm1 "(?<=<TokInfo>)[^<]+"`
}

PostRouterData() # Param1: RelativeUrl, Param2: Data, Param3:bAskNewToken
{
	# Get new token if necessary
	if [ ! -z $3 ]; then
		GetSessionToken
	fi

	#echo "POST on http://$ROUTER_IP$1 :" $2
	RESPONSE=`${BIN} --request POST http://${IP}${1} \
	       --dump-header ${TMP_HEADER_FILE} \
	       -H "Cookie: ${SESSIONID}" -H "__RequestVerificationToken: ${TOKEN}" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
	       --data "${2}"`
	ProcessRouterResponseHeader
}

# Get initial SessionID and RequestVerificationToken
GetSessionToken

# Login
CREDENTIALS=`printf ${PASS} | sha256sum | head -c64 | base64 -w0`
CREDENTIALS=`printf "%s%s%s" ${NAME} ${CREDENTIALS} ${TOKEN} | sha256sum | head -c64 | base64 -w0`
DATA=`printf "<request><Username>%s</Username><Password>%s</Password><password_type>4</password_type></request>" ${NAME} ${CREDENTIALS}`
PostRouterData "/api/user/login" "${DATA}"

# Send SMS
DATA="<?xml version='1.0' encoding='UTF-8'?><request><Index>-1</Index><Phones><Phone>${NUMBER}</Phone></Phones><Sca></Sca><Content>${MESSAGE}</Content><Length>${#MESSAGE}</Length><Reserved>1</Reserved><Date>`date +'%F %T'`</Date></request>"
PostRouterData "/api/sms/send-sms" "${DATA}" 1

# Logout
PostRouterData "/api/user/logout" "<request><Logout>1</Logout></request>"

rm ${TMP_HEADER_FILE}
