#!/bin/bash
#
# VERSION=5
# CHANGES="use the VERSION source file to have the appfs VERSION installed"

BEROCONF=/usr/fallback/beroconf
URL_SERVER=appliance.beronet.com
PATH_FIRMWARE_LIST=/beronet_gateway/
FIRMWARE_LIST_FILE=firmware_TLS.list

function log () {
	echo "[init_checkavailablefirmware] ${1}"
}

# wget sometimes get stuck, if it is still running after 10 seconds, just kill it
function kill_stuck_wget () {
	sleep 10
	wgetpid=$(ps aux|grep '/usr/bin/wget'|grep "$URL_SERVER"|awk '{print $1}'|head -1)
	if [ -n "$wgetpid" ]; then
		kill -9 "$wgetpid"
	fi
}

# get the appfs version installed
source /usr/local/VERSION
if [ -z ${MINOR} ];
then
	## appfs build locally. not a stable / rc / fix release
	exit 0
fi

# check the internet connection
/bin/ping  -c 1 ${URL_SERVER} >/dev/null
if [ ! $? -eq 0 ]; then
	log "connection error: DNS error or server offline"
	${BEROCONF} set root new-app-image-available 0
	exit 0
fi

# download the firmware version (save the file into the tmp directory)
cd /tmp
kill_stuck_wget&
/usr/bin/wget -q ftp://${URL_SERVER}${PATH_FIRMWARE_LIST}${FIRMWARE_LIST_FILE} >/dev/null
if [ ! $? -eq 0 ]; then
	log "downloading error: impossible to download the firmware list"
	${BEROCONF} set root new-app-image-available 0
	exit 0
fi

# get the appfs version available
firmware_available=$(/bin/sed -n 's/^.*Firmware //p' /tmp/${FIRMWARE_LIST_FILE} | /usr/bin/cut -d ';' -f 1 | /usr/bin/head -n 1) 
major_version_available=$(echo ${firmware_available} | /usr/bin/cut -d '.' -f 0)
minor_version_available=$(echo ${firmware_available} | /usr/bin/cut -d '.' -f 2)
fix_version_available=$(echo ${firmware_available} | /usr/bin/cut -d '.' -f 3)

# compare the major version
if [ "${APPFS}" -lt "${major_version_available}" ]; then
	log "new app-image available; root db updated"
	${BEROCONF} set root new-app-image-available 1
	exit 0
fi

# compare minor version
if [ "${APPFS}" -eq "${major_version_available}" ] && [ "${MINOR}" -lt "${minor_version_available}" ]; then
	log "new app-image available; root db updated"
	${BEROCONF} set root new-app-image-available 1
	exit 0
fi

# if no fix version installed but fix version available
if [ "${APPFS}" -eq "${major_version_available}" ] && [ "${MINOR}" -eq "${minor_version_available}" ] && [ -z "${FIX}" ] && [ ! -z "${fix_version_available}" ]; then
	log "new app-image available; root db updated"
	${BEROCONF} set root has-major-issue "FIRMWARE_UPDATE_FIX_MAJOR_ISSUE"
	exit 0
fi

# compare fix version if both exist
if [ "${APPFS}" -eq "${major_version_available}" ] && [ "${MINOR}" -eq "${minor_version_available}" ] && [ ! -z "${FIX}" ] && [ ! -z "${fix_version_available}" ]; then
	if [ "${FIX}" -lt "${fix_version_available}" ]; then
		log "new app-image available; root db updated"
		${BEROCONF} set root has-major-issue "FIRMWARE_UPDATE_FIX_MAJOR_ISSUE"
		exit 0
	fi
fi

# the major and minor versions must be equal when rc and no fix version available
if [ ! -z "${RC}" ] && [ "${APPFS}" -eq "${major_version_available}" ] && [ "${MINOR}" -eq "${minor_version_available}" ] && [ -z "${FIX}" ]; then
    log "new app-image available; root db updated"
    ${BEROCONF} set root new-app-image-available 1
    exit 0
fi

# the major, minor and fix version must be equal when rc
if [ ! -z "${RC}" ] && [ "${APPFS}" -eq "${major_version_available}" ] && [ "${MINOR}" -eq "${minor_version_available}" ] && [ ! -z "${FIX}" ] && [ ! -z "${fix_version_available}" ]; then
    if [ "${FIX}" -eq "${fix_version_available}" ]; then 
        log "new app-image available; root db updated"
        ${BEROCONF} set root new-app-image-available 1
        exit 0
    fi
fi

# no firmware available
/bin/rm /tmp/${FIRMWARE_LIST_FILE}
log "no new app-image available; root db updated"
${BEROCONF} delete root has-major-issue
${BEROCONF} set root new-app-image-available 0
