#! /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=""
flash_update_drv_path=""
flash_update_drv_test="" ###neverChAngeThiSbyHand
case ${currKver} in
    2.6.39*|3.10*|3.14*|3.4*|4.1*|4.4*|[3-9].* )
        case ${currKver} in
            2.6.39*) kversion="2.6.39" ;;
            3.4*) kversion="3.4" ;;
            3.10*) kversion="3.10" ;;
            3.14*) kversion="3.14" ;;
            4.1*) kversion="4.1" ;;
            4.4*) kversion="4.4" ;;
	    [3-9].*) kversion="${currKver:2}"
		     kversion="${currKver:0:2}${kversion%%.*}" ;;
        esac
        # find buildin Flash Update Tool in /lib/modules
        flash_update_drv_path="`find /lib/modules -type f -name flash_update.ko`"
        if [ -z "${flash_update_drv_path}" ] ; then
            # find external Flash Update Tool in /var
            flash_update_drv_path="`if [ -f /var/flash_update_${kversion}.ko ] ; then echo /var/flash_update_${kversion}.ko ; fi`"
        fi
        echo "install: have Kernel ${currKver} - set kversion '${kversion}' and FlashUpdateTool '${flash_update_drv_path}'";
        ;;
    *)
        echo "install: updating Kernel '${currKver}' is not supported - abort Update";
        exit $INSTALL_FIRMWARE_VERSION
        ;;
esac
if [ -n "${flash_update_drv_test}" ] && [ "${flash_update_drv_test}" = "yes" ] && [ -z "${flash_update_drv_path}" ] ; then
    # find other buildin Flash Update Tool
    echo "install: missing Flash Update Tool - abort Update.";
    exit $INSTALL_OTHER_ERROR
fi
##################################################################################
echo "install: check and install new firmware ..."
##################################################################################
need_reboot=$INSTALL_SUCCESS_NO_REBOOT
korrekt_version=0
##################################################################################
# Power LED blinken lassen
##################################################################################
/bin/update_led_on
##################################################################################
#       Die nachfolgende Installtype-Prfung darf
#       immer von der Existenz des Installtypes ausgehen! (s.o.)
#
#       ANM.: Bei alten Gerten ohne Installtype, welche mit korrekter FW geupdatet werden sollen
#       liefert die nachfolgende Installtype-Prfung via '/etc/version --install=xyz'  immer 'TRUE', 
#       da sich in /etc/version der CASE ohne default-Tag bei nichtexistentem Tag leider so verhlt.
#       Das ist bei alten FW-Versionen noch der Fall und wird hiermit toleriert.
##################################################################################
# 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
################################
# list of accepted installtypes:
################################
echo OEM=$OEM
# get annex from Kernel dep env path
if [ "${kversion}" = 24 ] ; then
    export CONFIG_ENVIRONMENT_PATH=/proc/sys/dev/adam2
else
    export CONFIG_ENVIRONMENT_PATH=/proc/sys/urlader
fi
export ANNEX=`cat ${CONFIG_ENVIRONMENT_PATH}/annex`
if [ -z "${ANNEX}" ] ; then echo ANNEX=${ANNEX} not supported ; exit $INSTALL_WRONG_HARDWARE ; fi
echo ANNEX=$ANNEX
# Fritz_Box_HW231a
if [ -z "$DISABLE_Fritz_Box_HW231a" ] ; then
   echo testing acceptance for device Fritz_Box_HW231a ...
   if /etc/version --install=arm_4GB_4eth_2ab_usb_host_dect_wlan11n_kabel_09694 ; then
       echo device has installtype arm_4GB_4eth_2ab_usb_host_dect_wlan11n_kabel_09694
           # passt der OEM ?
           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_HW231a ...
           korrekt_version=1
   fi
   echo testing acceptance for device Fritz_Box_HW231a done
fi
kernel_start=0x04000000
kernel_size=8388608
filesystem_start=0x00000000
filesystem_size=67108864
urlader_start=0x000A0000
urlader_size=131072
newFWver=07.30
flash_start=-2146828288
ATOM_kernel_size=8388608
ATOM_filesystem_size=67108864
# Versioninfo:	159.07.30
# CVC_Version:	120308002013 [MMDDhhmmCCYY]
# Buildnummer:	r107861
# Checkpoint:	0fa0a1fe153af2f06264afec6816883dff71e38b
# Boxinfo:	HWID=231;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 # warum auch immer: fr diese Gert wird die FW abgelehnt
fi
##################################################################################
# Rcksprung nur fr die 11.01.xx verhindern
#
# FW Version Muster: xx.BB.CC  --  der Nummernkreis BB muss bereinstimmen und CC grer oder gleich sein
#
##################################################################################
currFWver=`/etc/version -v`
echo "curr: ${currFWver}  new: xx.${newFWver}"
# Version AA.BB.CC zerlegen
major_currFWver=${currFWver%%.*} # bis zum ersten Punkt
middle_currFWver=${currFWver%.*}; middle_currFWver=${middle_currFWver#*.} # dazwischen
minor_currFWver=${currFWver##*.} # ab dem letzten Punkt
echo "debug: curr: ${major_currFWver}.${middle_currFWver}.${minor_currFWver}"
middle_newFWver=${newFWver%.*}; middle_newFWver=${middle_newFWver#*.} # dazwischen
minor_newFWver=${newFWver##*.} # ab dem letzten Punkt
echo "debug: new: \"XX.${middle_newFWver}.${minor_newFWver}\""
##################################################################################
#  fhrenden Nullen beseitigen damit die Werte zur Berechnung genutzt werden
#  knnen
##################################################################################
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"
##################################################################################
# update verhindern
##################################################################################
currFWreject=""
if [ -z "${middle_currFWver}" ] || [ -z "${minor_currFWver}" ] || [ -z "${middle_newFWver}" ] || [ -z "${minor_newFWver}" ] ; then
    echo "error: could not resolve Firmwareversion"
    currFWreject="y"
fi
# und raus
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 ..."
    ##################################################################################
    # factorysettings non-tffs
    ##################################################################################
    ###### NVRAM ######
    # nvram (config-space) - Puma6 has mtd, Puma7 has emmc blkdevs
    ## intentionally kept simple: 
    ## just assume it is always there an set the need of 'factorydefault' 
    ## (skip a complex test on presence with all Puma6/7 differences)
                # firmware_info setzen (damit wir nach dem reboot das nachholen knnen) [factorydef: recovered=3]
                echo "[$$] [config-nvram] INFO(`uname -m`): erasing scheduled for next bootup"
                fw_info=`grep firmware_info $CONFIG_ENVIRONMENT_PATH/environment`
                # take care on preventing multiple entrys ',recovered=*'
                fw_info=`echo ${fw_info} | sed -e "s/,recovered=[0-9]\+//g"`
                echo "$fw_info,recovered=3" >$CONFIG_ENVIRONMENT_PATH/environment
    ##################################################################################
    # factorysettings tffs: ID's erst ab 100 (0x64) loeschen
    ##################################################################################
    id=$((0x64))
    while [ $id -le 255 ] ; do
        echo "clear_id $id" >/proc/tffs
        id=$(($id + 1))
    done
    id=$((0x4000))
    while [ $id -le $((0x4040)) ] ; do
        echo "clear_id $id" >/proc/tffs
        id=$(($id + 1))
    done
    id=$((0x4400))
    while [ $id -le $((0x4440)) ] ; do
        echo "clear_id $id" >/proc/tffs
        id=$(($id + 1))
    done
    echo "Force: factorysettings done."
else
    echo "check Firmware Version: xx.${newFWver}"
    ##################################################################################
    #    BB (neu) < BB (aktuell) :   update rueckfrage anstossen
    #    BB (neu) = BB (aktuell) &&  CC (neu) < CC (aktuell) :   update rueckfrage anstossen
    ##################################################################################
    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...
##################################################################################
# firmware Files pruefen
##################################################################################
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="`ls -l /var/remote/var/tmp/x86/filesystem.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    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="`ls -l /var/remote/var/tmp/x86/kernel.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    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="`ls -l /var/remote/var/tmp/filesystem.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    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="`ls -l /var/remote/var/tmp/kernel.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    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
echo 'echo $0: start' >>/var/post_install
# LED- und Betriebsstundenzaehler- Demon stoppen
echo "sleep 1" >>/var/post_install
echo "killall run_clock" >>/var/post_install
echo "if ps | grep -v grep | grep -q telefon ; then killall telefon ; fi" >>/var/post_install
echo "if ps | grep -v grep | grep -q telnetd ; then killall telnetd ; fi" >>/var/post_install
# ueberfluessigen urlader-env eintrag entsorgen
if [ ${kversion} = 24 ] ; then
# echo "echo language > /proc/sys/dev/adam2/environment" >>/var/post_install
# darf fr zuknftige internationalisierung nicht mehr gelscht werden
  echo "echo skip deleting language from env" >>/var/post_install
else
# echo "echo language > /proc/sys/urlader/environment" >>/var/post_install
# darf fr zuknftige internationalisierung nicht mehr gelscht werden
  echo "echo skip deleting language from env" >>/var/post_install
echo "echo MODE=update > /dev/avm_power" >>/var/post_install
fi
# unmittelbar vor dem Flashen den Watchdog ausschalten
if have_avm_watchdog; then
  echo_avm_watchdog_cmd disable >> /var/post_install
fi
echo_avm_watchdog_cmd init-start 20 >> /var/post_install
# wer laeuft jetzt noch ?
echo "echo still running:" >>/var/post_install
echo "ps" >>/var/post_install
echo "lsmod" >>/var/post_install
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
if [ -z "`env | grep ^PATH= | grep /bin`" ] ; then PATH=/bin:/usr/bin:${PATH} ; fi
PUMA6myusgDBG() {
    memopt=""
    pname=""
    set -x
    if [ -n "${2}" ] && [ "${2}" = "memusg" ] ; then memopt="-m"; fi
    if [ -n "${1}" ] ; then pname="${1}" ; else return 0; fi
    echo "---->>" && top -b ${memopt} -n 1 | grep -v -E ' top| grep' | grep -E "total:|slab:|PID| ${pname}" && echo "<<----" 
    set +x
}
PUMA6installDBG() {
    while true ; do 
        date ; echo m > /proc/sysrq-trigger ; sleep 10 ; 
    done
    return 0 
}
if grep -q DBG_INSTALL /proc/cmdline ; then
    echo STD_PRINTK > /dev/debug
    echo 9 > /proc/sysrq-trigger
    tail -f /var/remote/var/tmp/install_error.log >/dev/console &
    tail -f /var/remote/var/tmp/install_out.log >/dev/console &
fi
if grep -q 'DBG_INSTALL=memusg' /proc/cmdline ; then
    memusg=yes
    (PUMA6installDBG) &
fi
ATOMflashtick() { 
    found_mydd=0; 
    while true ; do 
        mydd="`pidof dd`"; 
        if [ -n "${mydd}" ] ; then 
            echo dd[${mydd}] > /dev/console; 
            found_mydd=1; 
        fi; 
        if [ -n "${memusg}" ] && [ "${memusg}" = "yes" ] ; then PUMA6myusgDBG dd > /dev/console; PUMA6myusgDBG dd memusg > /dev/console; fi
        if [ -z "${mydd}" ] && [ "${found_mydd}" = "1" ] ; then break; fi; 
        sleep 10; 
    done;  
    return 0 
}
### start
if grep -q 'DBG_INSTALL=flashtick' /proc/cmdline ; then
    print_console "ATOM watch flash"
    (ATOMflashtick) &
fi
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=`wc -c /var/remote/var/tmp/x86/kernel.image`
    ATOM_kernel_image_size=${ATOM_kernel_image_size%%/*}
    ATOM_kernel_image_size=${ATOM_kernel_image_size// /}
    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
if grep -q 'DBG_INSTALL=flashtick' /proc/cmdline ; then
    print_console "ATOM watch flash"
    (ATOMflashtick) &
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=`wc -c /var/remote/var/tmp/x86/filesystem.image`
    ATOM_filesystem_image_size=${ATOM_filesystem_image_size%%/*}
    ATOM_filesystem_image_size=${ATOM_filesystem_image_size// /}
    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
ARMflashtick() { 
    found_myburn=0; 
    while true ; do 
       sleep 10; 
       myburn="`pidof dd`"; 
       if [ -n "${myburn}" ] ; then 
           echo dd[${myburn}] > /dev/console; 
           found_mybrun=1; 
       fi; 
       if [ -n "${memusg}" ] && [ "${memusg}" = "yes" ] ; then PUMA6myusgDBG dd; PUMA6myusgDBG dd memusg; fi
       if [ -z "${myburn}" ] && [ "${found_myburn}" = "1" ] ; then break; fi; 
    done;
    return 0 
}
if grep -q 'DBG_INSTALL=flashtick' /proc/cmdline ; then
    print_console "watch flash"
    (ARMflashtick) &
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=`wc -c /var/remote/var/tmp/kernel.image`
    kernel_image_size=${kernel_image_size%%/*}
    kernel_image_size=${kernel_image_size// /}
    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
if grep -q 'DBG_INSTALL=flashtick' /proc/cmdline ; then
    print_console "watch flash"
    (ARMflashtick) &
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=`wc -c /var/remote/var/tmp/filesystem.image`
    filesystem_image_size=${filesystem_image_size%%/*}
    filesystem_image_size=${filesystem_image_size// /}
    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=`grep linux_fs_start ${CONFIG_ENVIRONMENT_PATH}/environment`
    print_console "linux_fs_start = $linux_fs_start"
    if [ -z "$linux_fs_start" ]; then
        linux_fs_start=1
    else
        linux_fs_start="${linux_fs_start##linux_fs_start}"
        print_console "linux_fs_start: $linux_fs_start"
        if [ $linux_fs_start = 0 ]; then
            linux_fs_start=1
            print_console "set linux_fs_start=$linux_fs_start"
        else
            linux_fs_start=0
            print_console "set linux_fs_start=$linux_fs_start"
        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=`grep linux_fs_start ${CONFIG_ENVIRONMENT_PATH}/environment`
    print_console "check linux_fs_start = $linux_fs_start"
    print_console "UPDATE SUCCESS"
    /bin/update_led_on
   ##################################################################################
    # Loeschen der C+P Logs
    echo clear_id 93 >/proc/tffs
    echo clear_id 94 >/proc/tffs
    ##################################################################################
    # letzte chance zum loeschen der C+P Logs
    echo "echo clear_id 93 >/proc/tffs" >>/var/post_install
    echo "echo clear_id 94 >/proc/tffs" >>/var/post_install
    echo clear_id 95 >/proc/tffs
    echo clear_id 96 >/proc/tffs
    ##################################################################################
    # letzte chance zum loeschen der C+P Logs
    echo "echo clear_id 95 >/proc/tffs" >>/var/post_install
    echo "echo clear_id 96 >/proc/tffs" >>/var/post_install
    exit $INSTALL_SUCCESS_REBOOT
fi
    print_console "UPDATE FAIL"
    /bin/update_led_off
exit $INSTALL_OTHER_ERROR
