#!/bin/sh

export TERM="cons25r"

NEED_REBOOT=true
NEED_POWEROFF=false
NEED_WRITE_TO_BOOT=false

UPDATE_LOG="/var/log/update-$(date +'%H-%M_%d-%m-%Y').log"
export UPDATE_LOG

[ `uname -r` = "2.6.37" ] && FOR_ARM=1

if [ -z $FOR_ARM ]; then
  [ -r /usr/bin/r1/r1_var.sh ] && . /usr/bin/r1/r1_var.sh
else
  if [ -f /usr/bin/r1_var.sh ]; then
    if [ ! -x /usr/bin/r1_var.sh ]; then
      chmod +x /usr/bin/r1_var.sh
    fi
    . /usr/bin/r1_var.sh
  fi
  if [ -f /sbin/preinit-var ]; then
    if [ ! -x /sbin/preinit-var ]; then
      chmod +x /sbin/preinit-var
    fi
    . /sbin/preinit-var
  fi
  if [ -f /sbin/preinit-func ]; then
    if [ ! -x /sbin/preinit-func ]; then
      chmod +x /sbin/preinit-func
    fi
    . /sbin/preinit-func
  fi
fi

[ -z "$INST_DIR" ] && INST_DIR="/opt/R1Sensor"

out_to_screen_and_log()
{
  echo "$1"
  echo "$1" > /dev/tty1
  echo "$1" >> ${UPDATE_LOG}
}

print_result()
{
  if [ $? = 0 ]; then 
    echo -n "успешно"
  else
    echo -n "ошибка"
  fi
}

is_orangeH3() {
  grep -q "^Hardware\s*:\s*.*sun8i.*$" /proc/cpuinfo
  return $?
}

is_orange3LTS() {
  grep -q ".*orangepi-3-lts.*$" /proc/device-tree/compatible
  return $?
}

beep()
{
  if [ ! -z $FOR_ARM ]; then
    buzzer 4
  else
    if is_orangeH3; then
      BEEP_PORT=198
    elif is_orange3LTS; then
      BEEP_PORT=119
    else
      BEEP_PORT=27
    fi
    
    if [ -z `ls /sys/class/gpio/ | grep ${BEEP_PORT}` ]; then
      echo "${BEEP_PORT}" > /sys/class/gpio/export
    fi
    echo "out" > /sys/class/gpio/gpio${BEEP_PORT}/direction
    echo "1" > /sys/class/gpio/gpio${BEEP_PORT}/value
    sleep $1
    echo "0" > /sys/class/gpio/gpio${BEEP_PORT}/value
    echo "${BEEP_PORT}" > /sys/class/gpio/unexport
  fi
}

clear > /dev/tty1
out_to_screen_and_log ""
out_to_screen_and_log "Время запуска: $(date +'%H-%M_%d-%m-%Y')"
out_to_screen_and_log ""

if [ ! -z $FOR_ARM ]; then
  out_to_screen_and_log "Система: ARM"
  buzzer 4
else
  if is_orange3LTS; then
    out_to_screen_and_log "Система: Orange PI 3 LTS"
  else
    out_to_screen_and_log "Система: Raspberry PI 4"
  fi
fi

cd $(dirname $0)

if [ "$(pwd)" = "/opt/Updates" ] || [ "$(pwd)" = "/opt/Updates/recovery.flash" ]; then
  LOCAL_UPDATE=true
  out_to_screen_and_log "Выполнение локального обновления"
else
  LOCAL_UPDATE=false
  out_to_screen_and_log "Выполнение обновления с внешнего диска или каталога"
fi

out_to_screen_and_log "Каталог запуска: $(pwd)"
out_to_screen_and_log "Каталог скрипта: $(dirname $0)"
out_to_screen_and_log ""

[ "$NEED_WRITE_TO_BOOT" = true ] && mount /boot -o remount,rw

# Убить crod, что бы не мешал перезапуском ПО
if [ ! -z $FOR_ARM ]; then
  out_to_screen_and_log "Остановка cron."
  killall crond
  killall R1Sensor
  killall R1CmdServer
else
  systemctl stop r1cmdserver r1loader r1wizard r1sensor r1settings-bg
  sleep 1
fi

out_to_screen_and_log "Копирование обновлений..." 

# Применение параметров клиента
[ -r /boot/r1client.conf ] && . /boot/r1client.conf

if [ "${EN_DEBUG}" -eq "1" ]; then
  sed -e 's/^EnableDebug=.*/EnableDebug=true/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^TransferLogToConsole=.*/TransferLogToConsole=true/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^EnableExtendedLog=.*/EnableExtendedLog=true/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^LogMaxEvent=.*/LogMaxEvent=0/g' -i ${INST_DIR}/Settings/R1Sensor.ini
else
  sed -e 's/^EnableDebug=.*/EnableDebug=false/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^TransferLogToConsole=.*/TransferLogToConsole=false/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^EnableExtendedLog=.*/EnableExtendedLog=false/g' -i ${INST_DIR}/Settings/R1Sensor.ini
  sed -e 's/^LogMaxEvent=.*/LogMaxEvent=1/g' -i ${INST_DIR}/Settings/R1Sensor.ini
fi

#rm /opt/R1Sensor/Data/Lic/*

if [ -f files.zip ]; then
  unzip -o files.zip -d /
fi

if [ -f files.tar ]; then
  tar xvf files.tar -C /
fi

if [ -d files ]; then
  cd files
fi

cp *.lic /opt/R1Sensor/Data/Lic/

out_to_screen_and_log "Обновление заводского номера..." 

chmod +x ./R1SNFixer2

./R1SNFixer2 > /dev/tty1 2>&1
RET_CODE=$?
if [ $RET_CODE != 0 ]; then
  out_to_screen_and_log "Ошибка обновления!"
  exit 1
else
  out_to_screen_and_log "Обновление успешно."
fi


[ "$NEED_WRITE_TO_BOOT" = true ] && mount /boot -o remount,ro
sync

sleep 1
beep 1

if [ ! -z $FOR_ARM ]; then
  if [ -x /etc/init.d/S35logo ]; then
    /etc/init.d/S35logo stop
  fi
fi

[ "$LOCAL_UPDATE" = true ] && rm -r /opt/Updates/*
sync

[ "$NEED_REBOOT" = true ] && reboot
[ "$NEED_POWEROFF" = true ] && poweroff &

exit 0
