#!/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 "(?<=)[^<]+"` TOKEN=`echo "${RESPONSE}"| grep -oPm1 "(?<=)[^<]+"` } 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 "%s%s4" ${NAME} ${CREDENTIALS}` PostRouterData "/api/user/login" "${DATA}" # Send SMS DATA="-1${NUMBER}${MESSAGE}${#MESSAGE}1`date +'%F %T'`" PostRouterData "/api/sms/send-sms" "${DATA}" 1 # Logout PostRouterData "/api/user/logout" "1" rm ${TMP_HEADER_FILE}