#! /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

##################################################################################
echo "install: check and install new firmware ..."

LED_DEVICE=/proc/led_mod/led
if [ ! -f /proc/led_mod/led  ] ; then
    LED_DEVICE=/var/led 
    echo "set led: ${LED_DEVICE}"
fi

need_reboot=$INSTALL_SUCCESS_NO_REBOOT
korrekt_version=0

##################################################################################
# Power LED blinken lassen
##################################################################################
echo "set INFO led to blink (modul=7, state=4)"
echo 7,4>${LED_DEVICE}




##################################################################################
# ACHTUNG ACHTUNG ACHTUNG Memory Layout prfen Entfaellt!!!
# Ggfs. ist ein Urlader- bzw. Memorylayout-Update erforderlich!
##################################################################################
#
# ANM.: Das Handling von alten Gerten ohne Installtype ist nunmehr etwas intransparent...
#
#       Erluterung:
#           Updateversuche auf alte Gerte ohne Installtype erzeugen bereits bei der 
#           Memorylayoutprfung einen Fehler, falls diese Firmware die Falsche fr das alte Gert ist! 
#
#       Fehlerdetektion: 
#           1.) Es gibt zwei Arten von altem Memorylayout mit jeweils eindeutigem Merkmal (s.u.).
#               Wenn das Gert eines mit altem Layout ist, mu auch die fr das Merkmal erwartete 
#               "install-XMB-urlader" Datei in der ankommenden FW vorliegen. 
#           2.) Falls es daran nicht scheitert so stimmt der erwartete Urlader nicht mit 
#               dem mitgelieferten berein. (In der "install-XMB-urlader" Datei wird der erwartete
#               aus der HWRevision des alten Gertes ermittelt und als verfgbar vorausgesetzt). 
#               [ Dieser Fall knnte bei hausinternen verwendeten alten 'FRITZ!Box FON' - mit FW die 
#                 nicht aus echten Releases stammt - auftreten, da diese dasselbe Merkmal 
#                 wie alte 'FRITZ!Box' haben.]
#
#       Voraussetzung fr diese Vorgehensweise ist: 
#           Nur Gerte mit altem Memorylayout haben ggfs. keinen Installtype.
#           Das trifft auf echte Releases von 'FRITZ!Box' (< 05.02.78) und 'FRITZ!Box SL' (< 05.01.70) zu.
#           Alle echten Releases anderer Gerte haben bereits einen Installtype.
#
#       >>> Somit darf die nachfolgende Installtype-Prfung 
#       >>> immer von der Existenz des Installtypes ausgehen!
#
##################################################################################
if [ -e /dev/mtdblock/5 ] ; then
    echo "altes 4MB Memory layout, mtd5 existiert"
    exit $INSTALL_FIRMWARE_VERSION	# altes MemoryLayout wird nicht mehr untersttzt, Umweg ueber Zwischenupdate
fi 

if [ ! -e /dev/mtdblock/4 ] ; then
    echo "altes 2MB Memory layout, mtd4 existiert nicht"
    exit $INSTALL_FIRMWARE_VERSION	# altes MemoryLayout wird nicht mehr untersttzt, Umweg ueber Zwischenupdate
fi 

##################################################################################
#       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.
##################################################################################
################################
# list of accepted installtypes:
################################
echo OEM=$OEM
export ANNEX=`cat /proc/sys/dev/adam2/annex`
if [ -z "${ANNEX}" ] ; then echo ANNEX=${ANNEX} not supported ; exit $INSTALL_WRONG_HARDWARE ; fi
echo ANNEX=$ANNEX
# Fritz_Box_5012
if [ -z "$DISABLE_Fritz_Box_5012" ] ; then
   echo testing acceptance for device Fritz_Box_5012 ...
   if /etc/version --install=ar7_4MB_xilinx_isdn_nt_te_2eth_26950 ; then
       echo device has installtype ar7_4MB_xilinx_isdn_nt_te_2eth_26950
       # passt der ANNEX ?
       accept_annex=B
       echo assumed ANNEX ${accept_annex} -- found ANNEX "${ANNEX}"
       if [ "${accept_annex}" = "${ANNEX}" ] ; then
           echo device has ANNEX ${ANNEX}
           # passt der OEM ?
           if [ ! -z "${OEM}" ] ; then
               oem_found=0
               for i in  avm 1und1 ; 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_5012 ...
           korrekt_version=1
       fi
   fi
   echo testing acceptance for device Fritz_Box_5012 done
fi

kernel_start=0x90010000
kernel_size=3866624
filesystem_start=0x90000000
filesystem_size=0
urlader_start=0x90000000
urlader_size=65536
newFWver=04.27
#! /bin/sh
if [ $korrekt_version = 0 ] ; then
    echo "error: installype not korrket"
    echo "set INFO led to off (modul=7, state=1)"
    echo 7,1>${LED_DEVICE}
    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"
##################################################################################
if [ -z "${middle_currFWver}" ] || [ -z "${minor_currFWver}" ] || [ -z "${middle_newFWver}" ] || [ -z "${minor_newFWver}" ] ; then
    echo "error: could not resolve Firmwareversion"
    echo "set INFO led to off (modul=7, state=1)"
    echo 7,1>${LED_DEVICE}
    exit $INSTALL_FIRMWARE_VERSION
fi
##################################################################################
#    BB (neu) < BB (aktuell) :   update unterbinden
#    BB (neu) = BB (aktuell) &&  CC (neu) < CC (aktuell) :   update unterbinden
##################################################################################
if [ "$middle_newFWver" -lt "$middle_currFWver" ] ; then
    echo "error: Firmware downgrade not allowed"
    echo "set INFO led to off (modul=7, state=1)"
    echo 7,1>${LED_DEVICE}
    exit $INSTALL_FIRMWARE_VERSION
else
    echo "DEBUG: $middle_newFWver >= $middle_currFWver" 
fi
if [ "$middle_newFWver" -eq "$middle_currFWver" ] ; then
    if [ "$minor_newFWver" -lt "$minor_currFWver" ] ; then
        echo "error: Firmware downgrade not allowed"
        echo "set INFO led to off (modul=7, state=1)"
        echo 7,1>${LED_DEVICE}
        exit $INSTALL_FIRMWARE_VERSION
    else
        echo "DEBUG: $minor_newFWver >= $minor_currFWver" 
    fi
else
    echo "DEBUG: $middle_newFWver > $middle_currFWver" 
fi
echo "Accept Firmware Version: xx.${newFWver}"
##################################################################################
# firmware Files pruefen
##################################################################################
if [ -f /var/tmp/filesystem.image ] ; then
    if ! /var/chksum /var/tmp/filesystem.image ; then
        echo "chksum for file /var/tmp/filesystem.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        echo 7,1>${LED_DEVICE}
        exit $INSTALL_FILESYSTEM_CHECKSUM
    fi
    echo chksum for file /var/tmp/filesystem.image ok
fi
if [ -f /var/tmp/kernel.image ] ; then
    if ! /var/chksum /var/tmp/kernel.image ; then
        echo "chksum for file /var/tmp/kernel.image failed."
        echo "set INFO led to off (modul=7, state=1)"
        echo 7,1>${LED_DEVICE}
        exit $INSTALL_KERNEL_CHECKSUM
    fi
    echo chksum for file /var/tmp/kernel.image ok
fi
##################################################################################
# prepare install
##################################################################################
rm -f /var/post_install
echo "#! /bin/sh" >/var/post_install
echo 'echo $0: start' >>/var/post_install
# LED blink
echo "echo 7,4>${LED_DEVICE}" >>/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
  echo "echo language > /proc/sys/dev/adam2/environment" >>/var/post_install
# unmittelbar vor dem Flashen den Watchdog ausschalten
if [ -e /dev/watchdog ] ; then >>/var/post_install
  echo "echo \"disable\" > /dev/watchdog" >>/var/post_install
fi >>/var/post_install
# wer luft 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
##################################################################################
# setting files to install
##################################################################################
if [ -f /var/tmp/kernel.image ] ; then
    echo "install: /var/tmp/kernel.image to mtd1"
    echo "update_parameter=flash_update_file0=\"/var/tmp/kernel.image,$kernel_start,$kernel_size,crc=1\"" >>/var/post_install
    need_reboot=$INSTALL_SUCCESS_REBOOT
fi
# skip filesystem if empty
if [ -f /var/tmp/filesystem.image ] && [ $filesystem_size -ne 0 ] ; then
    echo "install: /var/tmp/filesystem.image to mtd0"
    echo "update_parameter=\"\$update_parameter flash_update_file1=\"/var/tmp/filesystem.image,$filesystem_start,$filesystem_size,crc=1\"\"" >>/var/post_install
    need_reboot=$INSTALL_SUCCESS_REBOOT
fi
echo "insmod /var/flash_update.o \$update_parameter " >>/var/post_install
chmod +x /var/post_install
##################################################################################
# Spezialbehandlungen - aber nur wenn bis hierhin alles gut ist!
##################################################################################
if [ $need_reboot -eq $INSTALL_SUCCESS_REBOOT ] ; then
    ##################################################################################
    # suche & entferne _alte_ persistente Debugsettings um CAPIoTCP zu starten (/var/flash/debug.cfg, /var/rc.user)
    echo "install: check for old settings ..."
    OLD_SETTINGS_FILE="#! /bin/sh major=\`grep tffs /proc/devices\` tffs_major=\${major%%tffs} telnetd -l /sbin/ar7login killall capiotcp_server sleep 5 /usr/bin/capiotcp_server -p5031 -m3 &"
    cmp_file(){
        for i in $OLD_SETTINGS_FILE; do
            if [ ! "$1" = "$i" ] ; then echo "'$1' differs from '$i' - abweichung und raus ..."; return 1; fi
            shift
        done
        if [ ! -z "$1" ] ; then echo "'$1' following last member '$i' - abweichung und raus ..."; return 1; fi
        return 0;
    }
    if [ -f /var/rc.user ] ; then
        if cmp_file `cat /var/rc.user` ; then
            echo +++ nodes 61,62 komplett entsorgen 
            echo clear_id $((0x61)) >/proc/tffs
            echo clear_id $((0x62)) >/proc/tffs
            rm -rf /var/rc.user
        fi
    fi
    ##################################################################################
    # Wahlregel-Konverter
    ##################################################################################
    if [ -x /var/regelex ] && [ -e /var/flash/fx_lcr ] ; then
      case ${OEM} in
          1und1)
              if [ -f /etc/default.${Country}/fx_lcr.${OEM} ] ; then
                  echo konvertiere Wahlregeln: ./var/regelex 2 /var/flash/fx_lcr /etc/default.${Country}/fx_lcr.${OEM} /var/flash/fx_lcr
                  /var/regelex 2 /var/flash/fx_lcr /etc/default.${Country}/fx_lcr.${OEM} /var/flash/fx_lcr 2>/dev/null
              fi
              ;;
      esac
    fi
fi
##################################################################################
if [ $need_reboot -eq $INSTALL_SUCCESS_REBOOT ] ; then
    echo "set INFO led to blink (modul=7, state=4)"
    echo 7,4>${LED_DEVICE}
else
    echo "set INFO led to off (modul=7, state=1)"
    echo 7,1>${LED_DEVICE}
fi
##################################################################################
#  returnwerte:  0 kein reboot,  1 reboot
##################################################################################
exit $need_reboot
##################################################################################
echo "****INSTALLSCRIPT STOPPED ON DEVICE FOR TESTING (disabling watchdog)****"
if [ -e /dev/watchdog ] ; then 
    echo "disable" > /dev/watchdog
fi 
exit 0
##################################################################################
