#!/bin/sh

# this script is used to upgrade firmware uploaded from web-ui 

# $1: path of firmware file

DBG_LOG_DEVICE=/dev/console
NOTIFY_FILE=/tmp/log
FWFNAME="$1"
IGNORE_FWMASK="mask_check"

nvram set :ignore_fw_ver=1
nvram set :ignore_fw_mask=1

#upgrade_status = 0 or NULL, No Provision
#				= 1,  Upgrading
#				= 2,  Provision Done

. /usr/bin/provision_pub.sh

if [ $# -lt 1 ]; then
	save_msg "provision_loadfirmware fw_path"
	exit 255
fi 

if [ "`nvram get ignore_fw_mask`" = "1" ]; then
    save_msg "user requested to ignore fw mask"
    IGNORE_FWMASK="mask_ignore"
fi

firmware_key="`nvram get 242`"
if [ -z "$firmware_key" ]; then
    firmware_key="nokey"
else
    firmware_key="`echo $firmware_key |tr -d ' '`"
fi

if [ ! -f ${FWFNAME} ]; then
	FWFNAME="/tmp/$1"
	if [ ! -f ${FWFNAME} ]; then
		save_msg "FW no exist"
		echo "Firmware <$1> no exist" > ${NOTIFY_FILE}
		exit 255
	fi
fi

# Check provision instance first
lockup_provision || {
    save_msg "provision process already started"
	echo "provision process already started" > ${NOTIFY_FILE}
    exit 254
}

nvram set :upgrade_status=1
nvram set :upgrade_info="Starting"
provision_led_blink.sh &
echo 1 > /proc/gsboard/fan_cont
if [ "`nvram get :ignore_fw_ver`" = "1" ]; then
	prov_pipedec_fw $firmware_key ${FWFNAME} $IGNORE_FWMASK ignore_fw_ver
else
	prov_pipedec_fw $firmware_key ${FWFNAME} $IGNORE_FWMASK check_fw_ver
fi  

RET_VAL=$?

nvram set :upgrade_status=2
case  $RET_VAL in
	239)
        	save_msg "upgrade successfully, $3 has no backup part, no need to run prov_lastupdate"
        	echo "upgrade successfully, $3 has no backup part, no need to run prov_lastupdate"
        	;;
        240)
		save_msg "$1, Flash emmc Failed"
        	;;  
        241)
        	save_msg "$1 is skipped due to header tag not found"
        	;;
	242)
        	save_msg "$1, Bad Image CheckSum"
        	;;
        243)
        	save_msg "$1, Write Output File Failed"
        	;;
        244)
        	save_msg "$1, Read Input File Failed"
        	;;
        245)
        	save_msg "$1, No Supported Firmware"
        	;;
	246)
		save_msg "$1, Same Version"
		echo "Same Version"
        	;;
        247)
        	save_msg "$1, Image ID Mismatch"
        	;;
        248)
        	save_msg "$1, HW ID Mismatch"
        	;;
        249)
        	save_msg "$1, Read Proc Header Failed"
        	;;
        254)
        	save_msg "$1, Invalid Key Length"
        	;; 
        0)  
		prov_lastupdate "grandstream"
		save_msg "$1, Upgrade Successfully"
		echo "Upgrade Successfully" > ${NOTIFY_FILE}
            	;;
        *)
            	save_msg "$1 is not valid for upgrade"
		echo "is not valid for upgrade" > ${NOTIFY_FILE}
            	;;
esac

if [ $RET_VAL -eq 0 -o $RET_VAL -eq 246 ]; then
	nvram set :upgrade_info="Upgrade succeeded"
else
	nvram set :upgrade_info="Upgrade failed"
fi

killall provision_led_blink.sh
provision_led.sh
echo 0 > /proc/gsboard/fan_cont

if [ ! -z "`echo ${FWFNAME} | grep "tmp"`" ]; then
	rm -f ${FWFNAME}
fi
exit $RET_VAL

