#! /bin/sh

TRANSFERDIR=/var/tmp
FIRMWARE_TEMPDIR=${TRANSFERDIR}/firmware.temp
FIRMWARE_TAR=firmware.tar

THIS=`basename $0`

tty >/dev/null 2>&1 || exec >/dev/console 2>&1

echo "$THIS: Start"

move_files_from_home_to_data()
{
  echo -n "Moving files to new application directories in /data ..."
  for dir in log record result metering status
  do
    newdir="/data/$dir"
    olddir="/home/$dir"
    if [ ! -d "${newdir}" ]
    then
      mkdir -p "${newdir}"
      chown system.system "${newdir}"
    fi
    if [ -d "${olddir}" ]
    then
      mv "${olddir}"/* "${newdir}"
      rmdir "${newdir}"
    fi
    echo -n "."
  done
  for i in /home/setup/Z? /home/setup/extrema.?.bin
  do
    [ -f $i ] && mv $i /data/status
  done
  [ -f /home/setup/Z? ] && mv /home/setup/Z? /data/status
  echo -n "."
  echo " done."
}

# this would allow saving kernel image over reboots
# KERNEL_IMAGE=/home/system/linuximage
# kernel image will be lost after reboot
KERNEL_IMAGE=/var/tmp/linuximage

KERNEL_FLASH_DEVICE=/dev/mtd4
FLASH_ERASE_PROGRAM=/usr/sbin/flash_eraseall
FLASH_WRITE_PROGRAM=/usr/sbin/nandwrite
QUIET_OPTION="--quiet"
LINUX_VERSION_FILE=/home/system/linuxversion.txt
LINUX_VERSION_TMP=/var/tmp/linuxversion.txt

try_update_linux_kernel()
{
  # modify BSP minor version number:
  # If minor version 3x..5x and last digit < 8
  # modify last digit by logical or with 2 to indicate libmodbus
  # If minor version == 3x and last digit < 8
  # modify last digit by logical or with 4 to indicate flash scripts
  awk '/^LINUX_VERSION_MAJOR=/ { sub(/ *$/, ""); major = substr($0, 21); }
       /^LINUX_VERSION_MINOR=/ { sub(/ *$/, ""); len = length($0);
          key = substr($0, 1, 20); number = substr($0, 21, len - 20);
          len = length(number);
          first = substr(number, 1, len - 1);
          last = substr(number, len);
          if((major == 0) && (first == 3) && (last < 8)) last = or(last,4);
          if((major == 0) && (first >= 3) && (first < 6) && (last < 8))
          { last = or(last,2); }
          if((first == 25) && (last > 5)) last = 5;
          $0 = key first last;}
       { print; }' ${LINUX_VERSION_FILE} > ${LINUX_VERSION_TMP} && mv -f ${LINUX_VERSION_TMP} ${LINUX_VERSION_FILE} 

  if [ -f "${KERNEL_IMAGE}" ] && [ -f "${FLASH_ERASE_PROGRAM}" ] && [ -f "${FLASH_WRITE_PROGRAM}" ]
  then
    echo -n "Flashing new kernel image ..."
    # erase and overwrite flash region with linux kernel and check success
    if ${FLASH_ERASE_PROGRAM} ${QUIET_OPTION} ${KERNEL_FLASH_DEVICE} && ${FLASH_WRITE_PROGRAM} --pad ${QUIET_OPTION} ${KERNEL_FLASH_DEVICE} ${KERNEL_IMAGE} && rm -f ${KERNEL_IMAGE}
    then
      # modify BSP minor version number:
      # 2. treat last digit as bit field and set bit 0 for kernel update
      awk '/^LINUX_VERSION_MAJOR=/ { sub(/ *$/, ""); major = substr($0, 21); }
           /^LINUX_VERSION_MINOR=/ { sub(/ *$/, ""); len = length($0);
              key = substr($0, 1, 20); number = substr($0, 21, len - 20);
              len = length(number);
              first = substr(number, 1, len - 1);
              last = substr(number, len);
              last = or(last, 1);
              $0 = key first last;}
           { print; }' ${LINUX_VERSION_FILE} > ${LINUX_VERSION_TMP} && mv -f ${LINUX_VERSION_TMP} ${LINUX_VERSION_FILE} 
      echo " done."
    else
      echo " failed."
    fi
  fi
}

cd ${FIRMWARE_TEMPDIR}

if [ -f ${FIRMWARE_TAR} ]
then

  echo -n "Deleting www-files ..."
  rm -f -r /var/www/*
  echo -n "Copying files to target location..."
  
  cd ${FIRMWARE_TEMPDIR}
  tar xv -C / -f ${FIRMWARE_TAR}
  echo " done."
  
  echo -n "Changing owner of application directories..."
  for i in /home/* /data/* /var/www/*
  do
    chown -R system.system $i
  done
  echo " done."

  # space  to add code for removing or renaming files if necessary

  move_files_from_home_to_data

  try_update_linux_kernel

else
  echo "Error: File ${FIRMWARE_TAR} not found in archive." >&2
fi

cd ${TRANSFERDIR}
rm -rf ${FIRMWARE_TEMPDIR}

sync
# normally we restart the system, but on manual start switch off blinking
[ -z "$1" ] && reboot || killall iotest
