#!/bin/sh
################################################################################
#
# CMe3100 factory reset script.
#
################################################################################

MACHINE_INFO=/application/CMe3100/internal/machine.info
SQL_LOG_DB="/application/CMe3100/appdata/currentstorage/log_db_cme3100.sqlite"

# ------------------------------------------------------------------------------
# Log to console and insert message in log database.
#
# $1 : message to log
# ------------------------------------------------------------------------------
log() {
  echo "$1"

  NOW=$(date +%s000)
  sqlite3 $SQL_LOG_DB "INSERT INTO Log (created, severity, message, source, deviceId) VALUES ('$NOW', -1, '$1', 'System: Factory reset', -1);"
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Create new machine.info
# ------------------------------------------------------------------------------
createMachineInfo() {
  log "Creating machine info file $MACHINE_INFO"

  cp -f /application/CMe3100/internal/machine.config $MACHINE_INFO
  echo "product.sw=" >>$MACHINE_INFO
  echo "product.mac=" >>$MACHINE_INFO
  echo "product.kv=" >>$MACHINE_INFO
  sed -i '/product.password/d' $MACHINE_INFO
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Reset Linux configuration
# ------------------------------------------------------------------------------
restoreLinuxFiles() {
  log "Restoring Linux configuration"
  rm -rf /application/CMe3100/appdata/currentlinuxconfig
  cp -r /application/CMe3100/appdata/defaultlinuxconfig /application/CMe3100/appdata/currentlinuxconfig

  log "Restoring Linux files"
  cp -rf /application/CMe3100/Linux/* /
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Reset databases to default
# ------------------------------------------------------------------------------
resetDatabases() {
  log "Restoring current storage"
  rm -rf /application/CMe3100/appdata/currentstorage
  cp -r /application/CMe3100/appdata/defaultstorage /application/CMe3100/appdata/currentstorage
  # Since log just got restored, let's "duplicate" log information
  log "Current storage restored"
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Reset configurations to default
# ------------------------------------------------------------------------------
restoreConfigurations() {
  log "Restoring GPIO"
  echo 1 >/sys/class/gpio/gpio38/value
  echo 1 >/sys/class/gpio/gpio4/value
  echo 1 >/sys/class/gpio/gpio5/value

  log "Restoring current configuration"
  rm -rf /application/CMe3100/appdata/currentconfig
  cp -r /application/CMe3100/appdata/defaultconfig /application/CMe3100/appdata/currentconfig

  log "Restoring plugin configuration files"
  rm -rf /application/CMe3100/appdata/currentpluginconfig
  cp -r /application/CMe3100/appdata/defaultpluginconfig /application/CMe3100/appdata/currentpluginconfig

  log "Remove stored reports"
  rm -rf /application/CMe3100/appdata/reports

  log "Remove backups"
  rm -rf /application/backup

  log "Removing web applications"
  rm -rf /application/CMe3100/webapp/.web-apps-target
  find /application/CMe3100/webapp/ -type f ! -name '*JSP*' -exec rm -f {} +

  if [ -f /application/factory_reset.boot ]; then
    if [ $(cat /application/factory_reset.boot | grep "keep") ]; then
      log "Keeping network settings"
    else
      restoreLinuxFiles
      #Set hostname to prevent CMe3100-0016000000. refs #3700
      cat /application/CMe3100/appdata/defaultlinuxconfig/linux/linux.cfg | grep linux.net.hostname | awk -F= '{print $2}' >/etc/hostname
    fi
    rm -f /application/factory_reset.boot
  else
    restoreLinuxFiles
  fi
  echo 0 >/sys/class/gpio/gpio4/value
  echo 0 >/sys/class/gpio/gpio38/value
  reboot -f
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Resets the boot counter stored in the snmp configuration
# If no configuration exists, one is created.
# ------------------------------------------------------------------------------
resetBootCounter() {
  log "Resetting boot counter"
  snmpConfiguration="/application/CMe3100/internal/state.config"
  if [ -f $snmpConfiguration ]; then
    snmpdata=$(cat $snmpConfiguration | grep "snmp.rebootcounter")
    if [ $snmpdata ]; then
      content=$(cat $snmpConfiguration)
      reboots=$(echo $content | sed s/snmp\.rebootcounter=[0-9]\*/\snmp.rebootcounter=0/g)
      reboots=$(echo $reboots | sed s/[[:space:]]/\\n/g)
      echo "$reboots" >$snmpConfiguration
    else
      echo "snmp.rebootcounter=0" >>$snmpConfiguration
    fi
  else
    echo "snmp.rebootcounter=0" >$snmpConfiguration
  fi
}
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# $1 : command to execute. Only start is supported.
# ------------------------------------------------------------------------------
case "$1" in
start)

  gpio_value="/sys/class/gpio/gpio6/value"
  reset_flag=$(cat $gpio_value)
  seconds=0

  if [ -f /application/factory_reset.boot ]; then
    resetDatabases
    resetBootCounter
    restoreConfigurations
  elif [ "$reset_flag" = 1 ]; then
    log "Reset button pressed."
    echo 0 >/sys/class/gpio/gpio4/value
    echo 0 >/sys/class/gpio/gpio5/value
    echo 0 >/sys/class/gpio/gpio38/value
    while true; do
      reset_flag=$(cat $gpio_value)
      echo "loop $seconds"
      if [ "$reset_flag" = 0 ] && [ $seconds -lt 3 ]; then
        log "Reset button released, leaving factory reset."
        # leaving factory reset
        echo 0 >/sys/class/gpio/gpio4/value
        echo 1 >/sys/class/gpio/gpio5/value
        echo 0 >/sys/class/gpio/gpio38/value
        break
      elif [ "$reset_flag" = 1 ] && [ $seconds -lt 3 ]; then
        # still factory reset, waiting for seconds >= 3
        sleep 1
        seconds=$((seconds + 1))
      elif [ "$reset_flag" = 0 ] && [ $seconds -gt 3 ] && [ $seconds -lt 20 ]; then
        log "Factory reset initiated."
        # reset pin is released and time for factory reset!
        resetDatabases
        restoreConfigurations
      elif [ "$reset_flag" = 1 ] && [ $seconds -lt 20 ]; then
        # blinking leds, release button for factory reset
        echo 0 >/sys/class/gpio/gpio4/value
        echo 1 >/sys/class/gpio/gpio5/value
        usleep 250000
        echo 1 >/sys/class/gpio/gpio4/value
        echo 0 >/sys/class/gpio/gpio5/value
        usleep 250000
        echo 0 >/sys/class/gpio/gpio4/value
        echo 1 >/sys/class/gpio/gpio5/value
        usleep 250000
        echo 1 >/sys/class/gpio/gpio4/value
        echo 0 >/sys/class/gpio/gpio5/value
        usleep 250000
        seconds=$((seconds + 1))
      else
        log "Aborting factory reset, button held too long"
        # factory reset held > 20 seconds, aborting
        echo 0 >/sys/class/gpio/gpio4/value
        echo 1 >/sys/class/gpio/gpio5/value
        echo 0 >/sys/class/gpio/gpio38/value
        break
      fi
    done
  fi
  ;;
*)
  echo "Usage: $0 {start}"
  exit 1
  ;;
esac

exit 0
