#!/bin/sh
# CTM-500 python upgrade
# Cypress Solutions (c) 2020
VER=1.0.0
REPOSITORY="https://demo.cypress.bc.ca/files/fw"
RSYSLOG_ID="iot"
RSYSLOG_LVL="alert"
RSYSLOG_FACILITY="local0"
PYTHON_VER_STR="3.8"

WGET_ARGS="--tries=3"
TMP_PYTHON_IMG="/var/data/upgrade_python_tmp_img.tar"
PYTHON_UPGRADE_RUNNING_FLAG="/tmp/python_upgrade"
LOCAL_FW_UPGRADE_JOB_ID="LOCAL_FW_UPGRADE"

err_cleanup_and_exit()
{
    rm ${TMP_PYTHON_IMG} &> /dev/null
    rm ${PYTHON_UPGRADE_RUNNING_FLAG} &> /dev/null
    /usr/bin/cmd pwr override 0
    if [ -f "/var/volatile/ctm/FW_JOBID" ]; then
       jobId=`cat /var/volatile/ctm/FW_JOBID`
    else
       jobId=${LOCAL_FW_UPGRADE_JOB_ID}
    fi
    payload='{"jobId":"'
    payload+=$jobId
    payload+='","rc":-1}'

    /usr/bin/mosquitto_pub -h 'localhost' -t 'v1/device/job/'$jobId'/update' -m $payload 
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} ERROR:$1
    exit $1
}

/usr/bin/cmd pwr override 1
touch ${PYTHON_UPGRADE_RUNNING_FLAG}

# strip everything until the last slash
pythonimg=$(echo $1 | awk -F'/' '{print $NF}')
logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Start (${pythonimg})"
if [ -z ${pythonimg} ];then
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "No python image specified"
    echo "No python image specified."
    err_cleanup_and_exit 1
fi

url=$2
if [ -z ${url} ];then
    echo "No repository URL specified, using default"
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "No repository URL specified, using default"
    url=${REPOSITORY}
fi

dload=1
br=""
if [ "${url}" = "local-web" ];then
    echo "Installing python from local webif"
    dload=0
elif [ "${url}" = "localhost" ];then
    echo "Installing python from local console"
    dload=0
fi

# if only user is given, it's token for iot server
user=$3

# may be provided if target URL is a ftp server
pw=$4

# download the python image .tar file
cd /var/data
if [ "${dload}" = "1" ];then
    echo "downloading python image:" ${url}/${pythonimg}
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "downloading python image: ${url}/${pythonimg}"
    if [ -n "$user" -a -n "$pw" ]; then
        action=$(/usr/bin/wget ${WGET_ARGS} --ftp-user=$user --ftp-password=$pw -q ${url}/${pythonimg} -O ${TMP_PYTHON_IMG})
    elif [ -z ${user} ];then
        action=$(/usr/bin/wget ${WGET_ARGS} -q ${url}/${pythonimg} -O ${TMP_PYTHON_IMG})
    else
        action=$(/usr/bin/wget --no-check-certificate ${WGET_ARGS} -q ${url}/${pythonimg}?token=${user} -O ${TMP_PYTHON_IMG})
    fi
    if [ $? -ne 0 ]; then
        echo "Error downloading python image"
        logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Error downloading python image"
        err_cleanup_and_exit 1
    fi
else
    mv ${pythonimg} ${TMP_PYTHON_IMG}
fi

# extract tar
# /var/data dir for payload
rm -rf /var/data/.py_upgrade >/dev/null
mkdir /var/data/.py_upgrade
echo "Extracting python image files" 
logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Extracting python image files"
action=$(tar xvf ${TMP_PYTHON_IMG} -C /var/data/.py_upgrade)

# calculate md5 of downloaded img file
#cd /var/data/.py_upgrade
#echo "Verifying python image"
#logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Verifying firmware image"
#retval=$(md5sum -c md5sum.txt)
#if [ $? -eq 0 ];then
#    echo "Checksum OK"
#    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Checksum OK"
#else
#    echo "Checksum FAIL"
#    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Checksum FAIL"
#    err_cleanup_and_exit 1
#fi

# verify the signature
#cmd signature fw_image.sha256.base64 cypress-image-ctm-500.tar.xz

#if [ $? -eq 0 ];then
#    echo "Signature OK"
#    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Signature OK"
#else
#    echo "Signature FAIL"
#    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Signature FAIL"
#    err_cleanup_and_exit 1
#fi

cd /var/data/.py_upgrade
opkg remove *python3*
opkg install *.ipk -d pydir --force-reinstall --nodeps
ret=$?

# clean out all the .pyc files
find /var/data/python/usr/lib/python${PYTHON_VER_STR} -name *.pyc -type f -delete

cd /var/data
rm ${TMP_PYTHON_IMG} &> /dev/null
rm -rf /var/data/.py_upgrade

if [ "$ret" = "0" ]; then
    echo "Python update completed successfully"
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} Success
    ln -sf /var/data/python/usr/lib/libpython${PYTHON_VER_STR}.so.1.0 /usr/lib/libpython${PYTHON_VER_STR}.so.1.0
    sync
    sleep 2
    /usr/bin/cmd pwr override 0
else
    echo "Python installation failed with return code "$ret
    logger -p ${RSYSLOG_FACILITY}.${RSYSLOG_LVL} -t ${RSYSLOG_ID} "Python installation failed with return code: $ret"
    err_cleanup_and_exit 1
fi


