#! /bin/sh
##################################################################################
INSTALL_FEATURE=SILENT_UPDATE
#. /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
# Handle silent update
# nop - don't touch the LEDs here
##################################################################################
#       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_HW226
if [ -z "$DISABLE_Fritz_Box_HW226" ] ; then
   echo testing acceptance for device Fritz_Box_HW226 ...
   if /etc/version --install=mips34_512MB_grx5_dect446_5geth_2ab_isdn_nt_te_pots_2usb_host3_2wlan11n_hw226_29616 ; then
       echo device has installtype mips34_512MB_grx5_dect446_5geth_2ab_isdn_nt_te_pots_2usb_host3_2wlan11n_hw226_29616
           # passt der OEM ?
           if [ ! -z "${OEM}" ] ; then
               oem_found=0
               for i in  avm 1und1 avme ; 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_HW226 ...
           korrekt_version=1
   fi
   echo testing acceptance for device Fritz_Box_HW226 done
fi
kernel_start=0x00500000
kernel_size=8388608
filesystem_start=0x00000000
filesystem_size=46137344
urlader_start=0x00000000
urlader_size=1048576
newFWver=07.25
flash_start=0
# Versioninfo:	154.07.25-87930 (Labor)
# Buildnummer:	r87930
# Checkpoint:	a5126ec3de373a2afabe156122907f71f9e06438
# Boxinfo:	HWID=226;OEM=avm,1und1,avme;
#! /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
if [ "$middle_currFWver" -lt "6" ] || [ "$middle_currFWver" -eq "6" ] && [ "$minor_currFWver" -lt "90" ] ; then 
    echo "error: reject update: current version '0${middle_currFWver}.${minor_currFWver}' < '06.90'"
    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
    ##################################################################################
    # TAM
    if [ -d /data ] ; then
        if [ -d /data/tam ] ; then
            rm -f /data/tam/config
            rm -f /data/tam/meta*
        fi
    fi
    # DECT (Swissvoice)
    if [ -x /bin/dectwe ] ; then
        /bin/dectwe
    fi
    #########################################
    ## Internal Memory hosted on NAND 
    ######## locate nand mtd (Internal Memory) ########
    # first hit
    install_mtd_nand=`grep 'nand-filesystem' /proc/mtd`
    for i in ${install_mtd_nand} ; do
        install_mtd_nand=$i
        break
    done
    if [ -n "${install_mtd_nand}" ] ; then
        install_mtd_nand=${install_mtd_nand#mtd}
        install_mtd_nand=${install_mtd_nand%:*}
        ## intentionally kept simple: just detect Internal Memory mtd an set the need of 'factorydefault'
        if [ -n "${install_mtd_nand}" ] ; then
                # firmware_info setzen (damit wir nach dem reboot das nachholen knnen) [factorydef: recovered=3]
                echo "[$$] [Internal Memory] INFO: 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
        fi
    fi
    ##################################################################################
    # 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=""
# skip filesystem if empty
if [ -f /var/tmp/filesystem.image ] && [ $filesystem_size -ne 0 ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/tmp/filesystem.image ; then
        echo "chksum for file /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/tmp/filesystem.image ok
    filesystem_image_size="`ls -l /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/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/tmp/filesystem.image ok
fi
if [ -f /var/tmp/kernel.image ] ; then
    if ! /var/chksum${CHKSUMEXT} /var/tmp/kernel.image ; then
        echo "chksum for file /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/tmp/kernel.image ok
    kernel_image_size="`ls -l /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/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/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
# 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
##################################################################################
# setting files to install
##################################################################################
###########################################
echo install: ${kversion} getting mtds to install...
echo install: --mtd------------------------------------------------
var_kernel_mtdnr=`cat /proc/mtd  | grep '^mtd.*reserved-kernel' | sed 's/:.*//' | sed 's/^mtd//'`
var_non_res_kernel_mtdnr=`cat /proc/mtd  | grep '^mtd.*kernel' | grep -v reserved | sed 's/:.*//' | sed 's/^mtd//'`
var_fs_mtdnr=`cat /proc/mtd  | grep '^mtd.*reserved-filesystem' | sed 's/:.*//' | sed 's/^mtd//'`
# get linux_fs_start
linux_fs_start=$(sed -nr 's/^linux_fs_start[[:space:]]([01])$/\1/p' "${CONFIG_ENVIRONMENT_PATH}/environment")
# get fallbackdefault, if linux_fs_start from env is nonexistent
if [ -z "$linux_fs_start" ] ; then
   echo "linux_fs_start nonexistent - fallback"
   if [ "$var_kernel_mtdnr" -gt "$var_non_res_kernel_mtdnr" ] ; then
      linux_fs_start=0
   else
      linux_fs_start=1
   fi
fi
# toggle slot (once only until reboot)
CURRENTLY_BOOTED_SLOT_FILE="/var/bootedslot"
if ! [ -e "${CURRENTLY_BOOTED_SLOT_FILE}" ] ; then
    echo "${linux_fs_start}" > ${CURRENTLY_BOOTED_SLOT_FILE}
fi
booted_slot=`cat ${CURRENTLY_BOOTED_SLOT_FILE}`
other_slot=$(( 1 - ${booted_slot} ))
# exit on invalid slot info
slotfail() {
 echo "Install: Error: invalid other_slot '${other_slot}' or booted_slot '${booted_slot}'. --> Abort"
 /bin/update_led_off; echo "set INFO led to off"
 exit $INSTALL_OTHER_ERROR
}
[ "${other_slot}" -eq "0" ] || [ "${other_slot}" -eq "1" ] || slotfail
[ "${booted_slot}" -eq "0" ] || [ "${booted_slot}" -eq "1" ] || slotfail
# check
var_mount_mtd=`mount | grep "/dev/mtdblock$var_fs_mtdnr"`
var_mount_mtd_kernel=`mount | grep "/dev/mtdblock$var_kernel_mtdnr"`
if test -z "$var_kernel_mtdnr" || test -z "$var_non_res_kernel_mtdnr" ; then
    echo "Install: Error: Kernel mtdblock not found. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_KERNEL_CHECKSUM
elif test -z "$var_fs_mtdnr" ; then
    echo "Install: Error: Filesystem mtdblock not found. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_FILESYSTEM_CHECKSUM
elif test -n "$var_mount_mtd_kernel" ; then
    echo "Install: Kernel mtdblock is already in use. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_KERNEL_CHECKSUM
elif test -n "$var_mount_mtd" ; then
    echo "Install: Filesystem mtdblock is already in use. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_FILESYSTEM_CHECKSUM
fi
echo install: --assert---------------------------------------------
if ! test -d "/var/tmp" ; then
    echo "Install: Error: Directory '/var/tmp' doesn't exist. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_OTHER_ERROR
elif ! test -f "/var/tmp/kernel.image" ; then
    echo "Install: Error: File 'kernel.image' doesn't exist. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_KERNEL_CHECKSUM
elif ! test -f "/var/tmp/filesystem.image" ; then
    echo "Install: Error: File 'filesystem.image' doesn't exist. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_FILESYSTEM_CHECKSUM
elif test -d "/var/tmp/fs" ; then
    echo "Install: Error: Directory '/var/tmp/fs' already exist. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_FILESYSTEM_CHECKSUM
elif test -d "/var/tmp/fs_mtd" ; then
    echo "Install: Error: Directory '/var/tmp/fs_mtd' already exist. --> Abort"
    /bin/update_led_off; echo "set INFO led to off"
    exit $INSTALL_FILESYSTEM_CHECKSUM
fi
echo install: --addr+size------------------------------------------
    kernel_image_size="`ls -l /var/tmp/kernel.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    filesystem_image_size="`ls -l /var/tmp/filesystem.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
    echo install: kernel_start=${kernel_start}
    echo install: kernel_size=${kernel_size}
    echo install: kernel_image_size=${kernel_image_size}
    echo install: filesystem_start=${filesystem_start}
    echo install: filesystem_size=${filesystem_size}
    echo install: filesystem_image_size=${filesystem_image_size}
    if [ -z "${kernel_image_size}" ] || [ "${kernel_image_size}" = "0" ]  ; then
        echo "install: Kernel Adress or Size error - Abort!"
        /bin/update_led_off; echo "set INFO led to off"
        exit $INSTALL_KERNEL_CHECKSUM
    fi
    if [ -z "${filesystem_image_size}" ] || [ "${filesystem_image_size}" = "0" ]  ; then
        echo "install: Filesystem Adress or Size error - Abort!"
        /bin/update_led_off; echo "set INFO led to off"
        exit $INSTALL_FILESYSTEM_CHECKSUM
    fi
###########################################
need_reboot=$INSTALL_SUCCESS_REBOOT
###########################################
echo install: ${kversion} writing commands to install...
#### DEBUG-EXIT ####
# echo "#### DEBUG-EXIT ####" >>/var/post_install
# echo "exit 0" >>/var/post_install
# echo "####################" >>/var/post_install
####################
# Handle silent update (flash immediate)
updateSilent=yes
updatestore=/var/updatestore
update_flash_cmd_dest=${updatestore}/update_action_flash
rm -rf ${updatestore} && mkdir -p ${updatestore}
echo "#! /bin/sh" >${update_flash_cmd_dest}
# watch update process state
echo "update_state=good" >>${update_flash_cmd_dest}
echo "sync" >> ${update_flash_cmd_dest}
# ---
# prevent leaving corrupt activated slot: 
# reset linux_fs_start to booted_slot (otherslot will be activated later again on success).
echo "echo reset linux_fs_start to booted_slot '${booted_slot}' before modifying other_slot '${other_slot}'..." >>${update_flash_cmd_dest}
echo "echo linux_fs_start ${booted_slot} > $CONFIG_ENVIRONMENT_PATH/environment" >>${update_flash_cmd_dest}
# ---
# Delete mtds
echo "echo Erase mtd partitions '$var_kernel_mtdnr' and '$var_fs_mtdnr' ..." >>${update_flash_cmd_dest}
if [ -x "/sbin/update_kernel" ] && [ -e "/dev/mtd$var_kernel_mtdnr" ] ; then
    echo "/sbin/update_kernel -o /dev/mtd$var_kernel_mtdnr" >>${update_flash_cmd_dest}
    echo "/sbin/update_kernel -o /dev/mtd$var_fs_mtdnr" >>${update_flash_cmd_dest}
else
    echo "echo mtd $var_kernel_mtdnr erase all > /proc/mtd" >>${update_flash_cmd_dest}
    echo "echo mtd $var_fs_mtdnr erase all > /proc/mtd" >>${update_flash_cmd_dest}
fi
# ---
# Copy kernel image
echo 'echo Copy kernel image...' >>${update_flash_cmd_dest}
if [ -x "/sbin/update_kernel" ] && [ -e "/dev/mtd$var_kernel_mtdnr" ] ; then
    echo "/sbin/update_kernel -i /var/tmp/kernel.image  -o /dev/mtd$var_kernel_mtdnr" >>${update_flash_cmd_dest}
else
    echo "cp /var/tmp/kernel.image /dev/mtdblock$var_kernel_mtdnr" >>${update_flash_cmd_dest}
fi
echo '[ $? -ne 0 ] && echo failed with error "$?" && update_state=bad' >>${update_flash_cmd_dest}
echo 'echo Clean up kernel image' >>${update_flash_cmd_dest}
echo 'rm -f /var/tmp/kernel.image' >>${update_flash_cmd_dest}
# ---
# Copy filesystem image
#### no wrapper
echo 'echo Copy filesystem image ...' >>${update_flash_cmd_dest}
if [ -x "/sbin/update_kernel" ] && [ -e "/dev/mtd$var_fs_mtdnr" ] ; then
    echo "/sbin/update_kernel -i /var/tmp/filesystem.image  -o /dev/mtd$var_fs_mtdnr" >>${update_flash_cmd_dest}
else
    echo "cp /var/tmp/filesystem.image /dev/mtdblock$var_fs_mtdnr" >>${update_flash_cmd_dest}
fi
echo '[ $? -ne 0 ] && echo failed with error "$?" && update_state=bad' >>${update_flash_cmd_dest}
echo 'echo ... Copy filesystem done' >>${update_flash_cmd_dest}
# ---
    ##################################################################################
    # urlader?
    # only if firmwareupdate was good
if [ -x /var/urladerupdate ] ; then
echo "install: /var/urladerupdate..."
echo 'if [ "$update_state" = "good" ] ; then' >>${update_flash_cmd_dest}
echo '    echo calling /var/urladerupdate...' >>${update_flash_cmd_dest}
echo '    /var/urladerupdate' >>${update_flash_cmd_dest}
echo 'else' >>${update_flash_cmd_dest}
echo '    echo calling /var/urladerupdate skipped due to errors...' >>${update_flash_cmd_dest}
echo 'fi' >>${update_flash_cmd_dest}
fi
# ---
# ---
##### TZ_UPDATE
    ##################################################################################
    # trustzone? 
    # 1) do it after a possible Bootloader/SBL-update
    # 2) only if firmwareupdate was good it will be activated (tz may dep. to fw)
if [ -x /var/tzupdate ] ; then
echo "install: /var/tzupdate..."
echo 'if [ "$update_state" = "good" ] ; then' >>${update_flash_cmd_dest}
echo '    echo calling /var/tzupdate' >>${update_flash_cmd_dest}
echo '    /var/tzupdate' >>${update_flash_cmd_dest}
echo 'else' >>${update_flash_cmd_dest}
echo '    echo calling /var/tzupdate skipped due to errors...' >>${update_flash_cmd_dest}
echo 'fi' >>${update_flash_cmd_dest}
fi
##### TZ_UPDATE
# ---
# set urlader field 'linux_fs_start'
echo 'if [ "$update_state" = "good" ] ; then' >>${update_flash_cmd_dest}
echo '    echo Setting linux_fs_start mirror...' >>${update_flash_cmd_dest}
# show state for testing
echo '    echo Setting linux_fs_start mirror... > /dev/console' >>${update_flash_cmd_dest}
echo "    echo linux_fs_start ${other_slot} > $CONFIG_ENVIRONMENT_PATH/environment" >>${update_flash_cmd_dest}
echo "    echo Setting linux_fs_start mirror '${other_slot}' activated" >>${update_flash_cmd_dest}
echo 'else' >>${update_flash_cmd_dest}
echo '    echo Setting linux_fs_start skipped due to errors...' >>${update_flash_cmd_dest}
echo 'fi' >>${update_flash_cmd_dest}
# ---
# Handle silent update (flash immediate)
# ---
echo 'if [ "$update_state" = "good" ] ; then return 0; else return 1; fi' >>${update_flash_cmd_dest}
chmod +x ${update_flash_cmd_dest}
# ---
# action flash
echo "update action flash at '${update_flash_cmd_dest}'"
if ${update_flash_cmd_dest} ; then
# success, proceed
echo "give update_state=good to /var/post_install"
echo "update_state=good" >>/var/post_install
# Power LED blinken lassen
echo "/bin/update_led_on" >>/var/post_install
else
# fail, abort 
echo "give update_state=bad to /var/post_install"
echo "update_state=bad" >>/var/post_install
echo "update abort - Flashcmd (silent) failed"
echo "/bin/update_led_off" >>/var/post_install
exit $INSTALL_OTHER_ERROR
fi
# ---
# ---
##################################################################################
# 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
# due to append sequence add exit to prevent accidently second run.
echo "exit 0" >>/var/post_install
chmod +x /var/post_install
# next: tail
#! /bin/sh
##################################################################################
# Spezialbehandlungen - aber nur wenn bis hierhin alles gut ist!
##################################################################################
# Handle silent update
# nop - don't touch these logs here (done later at /var/post_install)
##################################################################################
# Handle silent update
# nop - don't touch the LEDs here
##################################################################################
#  returnwerte:  0 kein reboot,  1 reboot
##################################################################################
exit $need_reboot
##################################################################################
echo "****INSTALLSCRIPT STOPPED ON DEVICE FOR TESTING (disabling watchdog)****"
if have_avm_watchdog; then
    avm_watchdog disable
fi
if [ -f /var/run/delayed_reboot.pid ] ; then
    ## Terminate any scheduled delayed reboot from firmwarecfg-CGI
    local REBOOT_PID=`cat /var/run/delayed_reboot.pid`
    rm /var/run/delayed_reboot.pid
    if [ "$REBOOT_PID" != "" ] ; then
        kill -9 $REBOOT_PID
    fi
fi
echo "****$need_reboot****"
exit 0
##################################################################################
