#! /bin/sh
##################################################################################
#. /etc/init.d/rc.conf
##################################################################################
# install results:
##################################################################################
export INSTALL_SUCCESS_NO_REBOOT=0
export INSTALL_SUCCESS_REBOOT=1
export INSTALL_WRONG_HARDWARE=2
export INSTALL_KERNEL_CHECKSUM=3
export INSTALL_FILESYSTEM_CHECKSUM=4
export INSTALL_URLADER_CHECKSUM=5
export INSTALL_OTHER_ERROR=6
export INSTALL_FIRMWARE_VERSION=7
export INSTALL_DOWNGRADE_NEEDED=8
force_update=n
force_down=n
for i in "$@" ; do
    case $i in
        -f)
            force_update=y
        ;;
        -d)
            force_down=y
        ;;
    esac
done
##################################################################################
# get Kernelversion for further handling (deny update <=2.6.32)
##################################################################################
currKver="$(uname -r)"
kversion=""
case ${currKver} in
    2.6.39*|[3-9].* )
        kversion="${currKver%%-*}"; kversion="${kversion%.*}";
        echo "install: have Kernel ${currKver} - set kversion '${kversion}'";
        ;;
    *)
        echo "install: updating Kernel '${currKver}' is not supported - abort Update";
        exit "${INSTALL_FIRMWARE_VERSION}"
        ;;
esac
##################################################################################
echo "install: check and install new firmware ..."
##################################################################################
need_reboot="${INSTALL_SUCCESS_NO_REBOOT}"
korrekt_version=0
##################################################################################
# Power LED blinken lassen
##################################################################################
/bin/update_led_on
# AVM watchdog compatibility blurb
if [ -x /sbin/avm_watchdog ]; then
    have_avm_watchdog() { /sbin/avm_watchdog --detect >/dev/null; }
    avm_watchdog() { /sbin/avm_watchdog "$@"; }
    echo_avm_watchdog_cmd() { echo "/sbin/avm_watchdog $*"; }
else
    # Old libwdt, /dev/watchdog is AVM device
    have_avm_watchdog() { test -c /dev/watchdog; }
    avm_watchdog() { echo "$*" > /dev/watchdog; }
    echo_avm_watchdog_cmd() { echo "echo $* > /dev/watchdog"; }
fi
################################
# accepted Annex / list of OEMs:
################################
echo OEM="${OEM}"
# get annex from Kernel dep env path
export CONFIG_ENVIRONMENT_PATH=/proc/sys/urlader
ANNEX=$(cat ${CONFIG_ENVIRONMENT_PATH}/annex)
export ANNEX
if [ -z "${ANNEX}" ] ; then echo "ANNEX=${ANNEX} not supported" ; exit "${INSTALL_WRONG_HARDWARE}" ; fi
echo ANNEX="${ANNEX}"
# Fritz_Box_HW220a
echo testing acceptance for device Fritz_Box_HW220a ...
    if [ ! -z "${OEM}" ] ; then
        oem_found=0
        for i in  avm ; do
            if [ "$i" = "${OEM}" ] ; then
                echo "OK - OEM ${OEM} is supported"
                oem_found=1
                break
            fi
        done
        if [ "$oem_found" = "0" ] ; then 
            echo "OEM ${OEM} not supported"
            exit $INSTALL_WRONG_HARDWARE
        fi
    fi
    echo OK - accept this update for device Fritz_Box_HW220a ...
    korrekt_version=1
echo "testing acceptance for device Fritz_Box_HW220a done"
kernel_start=0x04000000
kernel_size=8388608
filesystem_start=0x00000000
filesystem_size=67108864
newFWver=07.57
ATOM_kernel_size=8388608
ATOM_filesystem_size=67108864
# Versioninfo:	148.07.57
# CVC_Version:	120308002013 [MMDDhhmmCCYY]
# Buildnummer:	r107831
# Checkpoint:	7a4b6f6b8b71b443de382f3e4283c2c6a834d55a
# Boxinfo:	HWID=220;OEM=avm;
#! /bin/sh
#! /bin/sh
if [ "${korrekt_version}" = 0 ] ; then
    echo "error: installype not korrket"
    echo "set INFO led to off (modul=7, state=1)"
    /bin/update_led_off
    exit "${INSTALL_WRONG_HARDWARE}" # FW is not accepted for this device
fi
##################################################################################
#
# FW Version Pattern: xx.BB.CC  --  BB must match, CC must be greater or equal
#
##################################################################################
currFWver=$(/etc/version -v)
echo "curr: ${currFWver}  new: xx.${newFWver}"
# Split Version AA.BB.CC
major_currFWver=${currFWver%%.*} # until first dot
middle_currFWver=${currFWver%.*}; middle_currFWver=${middle_currFWver#*.} # inbetween
minor_currFWver=${currFWver##*.} # since last dot
echo "debug: curr: ${major_currFWver}.${middle_currFWver}.${minor_currFWver}"
middle_newFWver=${newFWver%.*}; middle_newFWver=${middle_newFWver#*.} # inbetween
minor_newFWver=${newFWver##*.} # since last dot
echo "debug: new: \"XX.${middle_newFWver}.${minor_newFWver}\""
##################################################################################
#  skip trailing Zeros for calculation with these values
##################################################################################
major_currFWver=${major_currFWver##0}
middle_currFWver=${middle_currFWver##0}
minor_currFWver=${minor_currFWver##0}
major_newFWver=${major_newFWver##0}
middle_newFWver=${middle_newFWver##0}
minor_newFWver=${minor_newFWver##0}
echo "major_currFWver=$major_currFWver"
echo "middle_currFWver=$middle_currFWver"
echo "minor_currFWver=$minor_currFWver"
echo "middle_newFWver=$middle_newFWver"
echo "minor_newFWver=$minor_newFWver"
##################################################################################
# prevent update
##################################################################################
currFWreject=""
if [ -z "${middle_currFWver}" ] || [ -z "${minor_currFWver}" ] || [ -z "${middle_newFWver}" ] || [ -z "${minor_newFWver}" ] ; then
    echo "error: could not resolve Firmwareversion"
    currFWreject="y"
fi
# abort update
if [ -n "$currFWreject" ] ; then
   echo "set INFO led to off (modul=7, state=1)"
   /bin/update_led_off
   exit "${INSTALL_FIRMWARE_VERSION}"
fi
##################################################################################
# Downgrade with or w/o factorysettings or normal update ?
##################################################################################
if [ "${force_update}" = "y" ] ; then
    echo "Force: Accept Firmware Version: xx.${newFWver} "
    echo "Force: Downgrade with factorysettings ..."
    /bin/setfactorydefaults
    echo "Force: factorysettings done."
else
    echo "check Firmware Version: xx.${newFWver}"
    ##################################################################################
    #    BB (new) < BB (current) :   trigger update interaction
    #    BB (new) = BB (current) &&  CC (new) < CC (current) :   trigger update interaction
    ##################################################################################
    if [ "$middle_newFWver" -lt "$middle_currFWver" ] ; then
        echo "warning: Firmware downgrade detected"
        # behaviour for devices which basically are downgradable
        if [ "${force_down}" = "y" ] ; then
            echo "Force: Downgrade w/o factorysettings ..."
            # proceed (ignore downgrade, do not trigger interaction) 
        else
            echo "set INFO led to off (modul=7, state=1)"
            /bin/update_led_off
            exit "${INSTALL_DOWNGRADE_NEEDED}"
        fi
    else
        echo "DEBUG: $middle_newFWver >= $middle_currFWver"
    fi
    if [ "$middle_newFWver" -eq "$middle_currFWver" ] ; then
        if [ "$minor_newFWver" -lt "$minor_currFWver" ] ; then
            # behaviour for devices which basically are downgradable
            if [ "${force_down}" = "y" ] ; then
                echo "Force: Downgrade w/o factorysettings ..."
                # proceed (ignore downgrade, do not trigger interaction) 
            else
                echo "set INFO led to off (modul=7, state=1)"
                /bin/update_led_off
                exit "${INSTALL_DOWNGRADE_NEEDED}"
            fi
        else
            echo "DEBUG: $minor_newFWver >= $minor_currFWver"
        fi
    else
        echo "DEBUG: $middle_newFWver > $middle_currFWver"
    fi
    echo "Accept Firmware Version: xx.${newFWver}"
fi
# next: check_files
#! /bin/sh
echo "install: ${kversion} check files..."
##################################################################################
# check files
##################################################################################
CHKSUMEXT=""
PUMA6_ARCH=$(uname -m)
if [ "${PUMA6_ARCH}" = "i686" ] ; then
   CHKSUMEXT=".x86"
fi
# begin workaround defect 10304
if [ -d /var/remote/var/tmp/unpack ] ; then
   mv -f /var/remote/var/tmp/unpack/* /var/remote/var/tmp/
   rmdir /var/remote/var/tmp/unpack
fi
# end workaround defect 10304
# skip filesystem if empty
if [ -f /var/remote/var/tmp/x86/filesystem.image ] && [ "${ATOM_filesystem_size}" -ne 0 ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/remote/var/tmp/x86/filesystem.image ; then
        echo "chksum for file /var/remote/var/tmp/x86/filesystem.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_CHECKSUM}"
    fi
    echo chksum for file /var/remote/var/tmp/x86/filesystem.image ok
    ATOM_filesystem_image_size="$(stat -c %s /var/remote/var/tmp/x86/filesystem.image)"
    if [ "${ATOM_filesystem_image_size}" -gt "${ATOM_filesystem_size}" ] ; then
        echo "Size of file /var/remote/var/tmp/x86/filesystem.image bigger than MTD-Size (${ATOM_filesystem_image_size} > ${ATOM_filesystem_size})."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_CHECKSUM}"
    fi
    echo size for file /var/remote/var/tmp/x86/filesystem.image ok
fi
if [ -f /var/remote/var/tmp/x86/kernel.image ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/remote/var/tmp/x86/kernel.image ; then
        echo "chksum for file /var/remote/var/tmp/x86/kernel.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    echo chksum for file /var/remote/var/tmp/x86/kernel.image ok
    ATOM_kernel_image_size="$(stat -c %s /var/remote/var/tmp/x86/kernel.image)"
    if [ "${ATOM_kernel_image_size}" -gt "${ATOM_kernel_size}" ] ; then
        echo "Size of file /var/remote/var/tmp/x86/kernel.image bigger than MTD-Size (${ATOM_kernel_image_size} > ${ATOM_kernel_size})."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    echo size for file /var/remote/var/tmp/x86/kernel.image ok
fi
# skip filesystem if empty
if [ -f /var/remote/var/tmp/filesystem.image ] && [ $filesystem_size -ne 0 ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/remote/var/tmp/filesystem.image ; then
        echo "chksum for file /var/remote/var/tmp/filesystem.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_CHECKSUM}"
    fi
    echo chksum for file /var/remote/var/tmp/filesystem.image ok
    filesystem_image_size="$(stat -c %s /var/remote/var/tmp/filesystem.image)"
    if [ "${filesystem_image_size}" -gt "${filesystem_size}" ] ; then
        echo "Size of file /var/remote/var/tmp/filesystem.image bigger than MTD-Size (${filesystem_image_size} > ${filesystem_size})."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_CHECKSUM}"
    fi
    echo size for file /var/remote/var/tmp/filesystem.image ok
fi
if [ -f /var/remote/var/tmp/kernel.image ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/remote/var/tmp/kernel.image ; then
        echo "chksum for file /var/remote/var/tmp/kernel.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    echo chksum for file /var/remote/var/tmp/kernel.image ok
    kernel_image_size="$(stat -c %s /var/remote/var/tmp/kernel.image)"
    if [ "${kernel_image_size}" -gt "${kernel_size}" ] ; then
        echo "Size of file /var/remote/var/tmp/kernel.image bigger than MTD-Size (${kernel_image_size} > ${kernel_size})."
        echo "set INFO led to off (modul=7, state=1)"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    echo size for file /var/remote/var/tmp/kernel.image ok
fi
# next: prepare_update
#! /bin/sh
##################################################################################
# prepare install
##################################################################################
# do no longer overwrite/remove /var/post_install
if [ ! -f /var/post_install ] ; then
# create, if not present
  echo "#! /bin/sh" >/var/post_install
fi
# append sequence to /var/post_install
# stop Deamons:
#   - LED- and Operating hours counter
#   - telefon, telnetd
{
echo 'echo $0: start'
echo "sleep 1"
echo "killall run_clock"
echo "if pidof telefon &>/dev/null ; then killall telefon ; fi"
echo "if pidof telnetd &>/dev/null ; then killall telnetd ; fi"
echo "echo MODE=update > /dev/avm_power"
} >>/var/post_install
# disable Watchdog immediately before flashing
if have_avm_watchdog; then
  echo_avm_watchdog_cmd disable >> /var/post_install
fi
# still running ?
{
echo "echo still running:"
echo "ps"
echo "lsmod"
echo "sleep 1"
} >>/var/post_install
# next: prepare_update_flash
#! /bin/sh
##################################################################################
# KABEL BOX
##################################################################################
print_console() {
    echo "$0 [$$]: +++++++++++++ $*" >/dev/console
}
if have_avm_watchdog; then
    avm_watchdog disable
fi
print_console "update start"
### Get partition-info
AvmPartitionInfo="/proc/avm_partitions"
if [ ! -e "${AvmPartitionInfo}" ]; then
    print_console "update abort - missing PartitionInfo (${AvmPartitionInfo})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
dest_Kmtd=$(grep '^kernel_reserved_ARM=' ${AvmPartitionInfo}); dest_Kmtd=${dest_Kmtd#*=}
dest_Kmtd_size=$(grep '^kernel_reserved_ARM_SIZE=' ${AvmPartitionInfo});dest_Kmtd_size=${dest_Kmtd_size#*=}
dest_Kmtd_erasesize=$((0x1000))
dest_Fmtd=$(grep '^filesystem_reserved_ARM=' ${AvmPartitionInfo}); dest_Fmtd=${dest_Fmtd#*=}
dest_Fmtd_size=$(grep '^filesystem_reserved_ARM_SIZE=' ${AvmPartitionInfo});dest_Fmtd_size=${dest_Fmtd_size#*=}
dest_Fmtd_erasesize=$((0x1000))
if [ -z "${dest_Kmtd}" ] || [ -z "${dest_Fmtd}" ] || [ -z "${dest_Kmtd_size}" ] || [ -z "${dest_Fmtd_size}" ] || [ ! -e "${dest_Kmtd}" ] || [ ! -e "${dest_Fmtd}" ] ; then
    print_console "update abort - missing reserved ARM Partitions from (${AvmPartitionInfo})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
if [ ! -b "${dest_Kmtd}" ] || [ ! -b "${dest_Fmtd}" ] ; then
    print_console "update abort - at least one reserved ARM Partition is no blockdev (${dest_Kmtd},${dest_Fmtd})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
dest_Kmtd_ATOM=$(grep '^kernel_reserved_ATOM=' ${AvmPartitionInfo}); dest_Kmtd_ATOM=${dest_Kmtd_ATOM#*=}
dest_Kmtd_ATOM_size=$(grep '^kernel_reserved_ATOM_SIZE=' ${AvmPartitionInfo});dest_Kmtd_ATOM_size=${dest_Kmtd_ATOM_size#*=}
dest_Kmtd_ATOM_erasesize=$((0x1000))
dest_Fmtd_ATOM=$(grep '^filesystem_reserved_ATOM=' ${AvmPartitionInfo}); dest_Fmtd_ATOM=${dest_Fmtd_ATOM#*=}
dest_Fmtd_ATOM_size=$(grep '^filesystem_reserved_ATOM_SIZE=' ${AvmPartitionInfo});dest_Fmtd_ATOM_size=${dest_Fmtd_ATOM_size#*=}
dest_Fmtd_ATOM_erasesize=$((0x1000))
if [ -z "${dest_Kmtd_ATOM}" ] || [ -z "${dest_Fmtd_ATOM}" ] || [ -z "${dest_Kmtd_ATOM_size}" ] || [ -z "${dest_Fmtd_ATOM_size}" ] || [ ! -e "${dest_Kmtd_ATOM}" ] || [ ! -e "${dest_Fmtd_ATOM}" ] ; then
    print_console "update abort - missing reserved ATOM Partitions from (${AvmPartitionInfo})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
if [ ! -b "${dest_Kmtd_ATOM}" ] || [ ! -b "${dest_Fmtd_ATOM}" ] ; then
    print_console "update abort - at least one reserved ATOM Partition is no blockdev (${dest_Kmtd_ATOM},${dest_Fmtd_ATOM})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
# exit "${INSTALL_SUCCESS_NO_REBOOT}"
##################################################################################
# Flashen
##################################################################################
MD5SUMARCH=""
PUMA6_ARCH=$(uname -m)
if [ "${PUMA6_ARCH}" = "i686" ] ; then
   MD5SUMARCH=".x86"
fi
### Test on flash-tools (need dd)
flashtool_dd=$(find . -name dd -xdev 2>/dev/null)
if [ -z "${flashtool_dd}"  ] || [ ! -e "${flashtool_dd}" ]; then
    print_console "update abort - missing Flashtool 'dd'"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
print_console "FlashCMDs (to be executed):"
KcmdATOM="if=/var/remote/var/tmp/x86/kernel.image of=${dest_Kmtd_ATOM} count=$((dest_Kmtd_ATOM_size/dest_Kmtd_ATOM_erasesize)) bs=${dest_Kmtd_ATOM_erasesize} conv=sync"
FcmdATOM="if=/var/remote/var/tmp/x86/filesystem.image of=${dest_Fmtd_ATOM} count=$((dest_Fmtd_ATOM_size/dest_Fmtd_ATOM_erasesize)) bs=${dest_Fmtd_ATOM_erasesize} conv=sync"
print_console "ATOM Kernel     FlashCMD: dd ${KcmdATOM}"
print_console "ATOM Filesysten FlashCMD: dd ${FcmdATOM}"
Kcmd="if=/var/remote/var/tmp/kernel.image of=${dest_Kmtd} count=$((dest_Kmtd_size/dest_Kmtd_erasesize)) bs=${dest_Kmtd_erasesize} conv=sync"
Fcmd="if=/var/remote/var/tmp/filesystem.image of=${dest_Fmtd} count=$((dest_Fmtd_size/dest_Fmtd_erasesize)) bs=${dest_Fmtd_erasesize} conv=sync"
print_console "ARM Kernel     FlashCMD: dd ${Kcmd}"
print_console "ARM Filesysten FlashCMD: dd ${Fcmd}"
# exit "${INSTALL_SUCCESS_NO_REBOOT}"
### start
print_console "ATOM flash kernel"
if dd ${KcmdATOM} ; then
    print_console "ATOM check kernel"
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        ATOM_md5sum_kernel_image=$(/var/md5sumext${MD5SUMARCH} -i /var/remote/var/tmp/x86/kernel.image)
    else
        ATOM_md5sum_kernel_image=$(md5sum /var/remote/var/tmp/x86/kernel.image)
    fi
    ATOM_md5sum_kernel_image=${ATOM_md5sum_kernel_image%%/*}
    print_console "ATOM md5sum of kernel image: $ATOM_md5sum_kernel_image"
    ATOM_kernel_image_size=$(stat -c %s /var/remote/var/tmp/x86/kernel.image)
    print_console "ATOM size of kernel image: $ATOM_kernel_image_size"
    rm -f /var/remote/var/tmp/x86/kernel.image
    sync
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        ATOM_md5sum_mtd=$(/var/md5sumext${MD5SUMARCH} -i "${dest_Kmtd_ATOM}" -l "$ATOM_kernel_image_size")
        ATOM_md5sum_mtd=${ATOM_md5sum_mtd%%/*}
    else
        ATOM_md5sum_mtd=$(dd if="${dest_Kmtd_ATOM}" count=1 bs="$ATOM_kernel_image_size" | md5sum)
        ATOM_md5sum_mtd=${ATOM_md5sum_mtd%%-*}
    fi
    print_console "ATOM md5sum of kernel mtd : $ATOM_md5sum_mtd"
    if [ ! "$ATOM_md5sum_mtd" = "$ATOM_md5sum_kernel_image" ]; then
        print_console "ATOM firmware update failed wrong kernel MD5sum"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    
    print_console "ATOM write to $dest_Kmtd_ATOM done"
else
    print_console "ATOM UPDATE FAIL  (dd ${KcmdATOM})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
print_console "ATOM flash filesystem"
if dd ${FcmdATOM} ; then
    print_console "ATOM check filesystem"
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        ATOM_md5sum_filesystem_image=$(/var/md5sumext${MD5SUMARCH} -i /var/remote/var/tmp/x86/filesystem.image)
    else
        ATOM_md5sum_filesystem_image=$(md5sum /var/remote/var/tmp/x86/filesystem.image)
    fi
    ATOM_md5sum_filesystem_image=${ATOM_md5sum_filesystem_image%%/*}
    print_console "ATOM md5sum of filesystem image: $ATOM_md5sum_filesystem_image"
    ATOM_filesystem_image_size=$(stat -c %s /var/remote/var/tmp/x86/filesystem.image)
    print_console "ATOM size of filesystem image: $ATOM_filesystem_image_size"
    rm -f /var/remote/var/tmp/x86/filesystem.image
    sync
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        ATOM_md5sum_mtd=$(/var/md5sumext${MD5SUMARCH} -i "${dest_Fmtd_ATOM}" -l "$ATOM_filesystem_image_size")
        ATOM_md5sum_mtd=${ATOM_md5sum_mtd%%/*}
    else
        ATOM_md5sum_mtd=$(dd if="${dest_Fmtd_ATOM}" count=1 bs="$ATOM_filesystem_image_size" | md5sum)
        ATOM_md5sum_mtd=${ATOM_md5sum_mtd%%-*}
    fi
    print_console "ATOM md5sum of filesystem mtd : $ATOM_md5sum_mtd"
    if [ ! "$ATOM_md5sum_mtd" = "$ATOM_md5sum_filesystem_image" ]; then
        print_console "ATOM firmware update failed wrong filesystem MD5sum"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_CHECKSUM}"
    fi
    
    print_console "ATOM write to $dest_Fmtd_ATOM done"
else
    print_console "ATOM UPDATE FAIL  (dd ${FcmdATOM})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
print_console "ARM flash kernel"
if dd ${Kcmd} ; then
    print_console "ARM check kernel"
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        md5sum_kernel_image=$(/var/md5sumext${MD5SUMARCH} -i /var/remote/var/tmp/kernel.image)
    else
        md5sum_kernel_image=$(md5sum /var/remote/var/tmp/kernel.image)
    fi
    md5sum_kernel_image=${md5sum_kernel_image%%/*}
    print_console "ARM md5sum of kernel image: $md5sum_kernel_image"
    kernel_image_size=$(stat -c %s /var/remote/var/tmp/kernel.image)
    print_console "ARM size of kernel image: $kernel_image_size"
    rm -f /var/remote/var/tmp/kernel.image
    sync
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        md5sum_mtd=$(/var/md5sumext${MD5SUMARCH} -i "${dest_Kmtd}" -l "$kernel_image_size")
        md5sum_mtd=${md5sum_mtd%%/*}
    else
        md5sum_mtd=$(dd if="${dest_Kmtd}" count=1 bs="$kernel_image_size" | md5sum)
        md5sum_mtd=${md5sum_mtd%%-*}
    fi
    print_console "ARM md5sum of kernel mtd : $md5sum_mtd"
    if [ ! "$md5sum_mtd" = "$md5sum_kernel_image" ]; then
        print_console "ARM firmware update failed wrong kernel MD5sum"
        /bin/update_led_off
        exit "${INSTALL_KERNEL_CHECKSUM}"
    fi
    
    print_console "ARM write to $dest_Kmtd done"
else
    print_console "ATOM UPDATE FAIL  (dd ${Kcmd})"
    /bin/update_led_off
    exit "${INSTALL_OTHER_ERROR}"
fi
print_console "ARM flash filesystem"
if dd ${Fcmd} ; then
    print_console "ARM check filesystem"
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        md5sum_filesystem_image=$(/var/md5sumext${MD5SUMARCH} -i /var/remote/var/tmp/filesystem.image)
    else
        md5sum_filesystem_image=$(md5sum /var/remote/var/tmp/filesystem.image)
    fi
    md5sum_filesystem_image=${md5sum_filesystem_image%%/*}
    print_console "ARM md5sum of filesystem image: $md5sum_filesystem_image"
    filesystem_image_size=$(stat -c %s /var/remote/var/tmp/filesystem.image)
    print_console "ARM size of filesystem image: $filesystem_image_size"
    rm -f /var/remote/var/tmp/filesystem.image
    sync
    if [ -f /var/md5sumext${MD5SUMARCH} ] ; then
        md5sum_mtd=$(/var/md5sumext${MD5SUMARCH}  -i "${dest_Fmtd}" -l "$filesystem_image_size")
        md5sum_mtd=${md5sum_mtd%%/*}
    else
        md5sum_mtd=$(dd if="${dest_Fmtd}" count=1 bs="$filesystem_image_size" | md5sum)
        md5sum_mtd=${md5sum_mtd%%-*}
    fi
    print_console "ARM md5sum of filesystem mtd : $md5sum_mtd"
    if [ ! "$md5sum_mtd" = "$md5sum_filesystem_image" ]; then
        print_console "ARM firmware update failed wrong filesystem MD5sum"
        /bin/update_led_off
        exit "${INSTALL_FILESYSTEM_ERROR}"
    fi
    
    print_console "ARM write to $dest_Fmtd done"
    if [ -x /var/ewnw_check_install ] ; then
        print_console "ARM Calling additional procedure (ewnw_check_install)"
        /var/ewnw_check_install
        ret=$?
        if [ "$ret" -ne "0" ] ; then
            print_console "ARM Calling additional procedure failed: UPDATE FAIL (${ret})"
            /bin/update_led_off
            exit "${INSTALL_OTHER_ERROR}"
        fi
    fi
    linux_fs_start=$(sed -nr 's/^linux_fs_start[[:space:]]([01])$/\1/p' "${CONFIG_ENVIRONMENT_PATH}/environment")
    print_console "linux_fs_start = $linux_fs_start"
    if [ -z "$linux_fs_start" ]; then
        linux_fs_start=1
    else
        if [ "${linux_fs_start}" = "0" ]; then
            linux_fs_start=1
        else
            linux_fs_start=0
        fi
    fi
    print_console "set linux_fs_start = $linux_fs_start"
    echo linux_fs_start ${linux_fs_start} > "${CONFIG_ENVIRONMENT_PATH}/environment"
    linux_fs_start=$(sed -nr 's/^linux_fs_start[[:space:]]([01])$/\1/p' "${CONFIG_ENVIRONMENT_PATH}/environment")
    print_console "check linux_fs_start = $linux_fs_start"
    print_console "UPDATE SUCCESS"
    /bin/update_led_on
    exit "${INSTALL_SUCCESS_REBOOT}"
fi
    print_console "UPDATE FAIL"
    /bin/update_led_off
exit "${INSTALL_OTHER_ERROR}"
