#!/bin/sh
#
# Volume check service
#

# 'data+ubi' partition
DATA_MTD_NAME='"data+ubi"'
DATA_MTD_NO=

# 'rootfs' on /dev/ubi0
# 'data+ubi' on /dev/ubi1
DATA_UBI_NO=1

# eMMC support
DATA_MMC_NAME="data+ext4"

USER_NAME=user
CONFIG_NAME=config

CONFIG_SIZE=16MiB
USER_SIZE=0
BADBLOCK_FILE=/tmp/gpio/ledcontrol/flash_bad_blocks


check_mtd()
{
  local a b c d e
  cat /proc/mtd |
  while read a b c d; do
    # convert 'mtdxx:' to 'xx'
    e=${a%:*}
    [ $d = $1 ] && echo "${e#mtd}"
  done
}

check_mmc()
{
  local result=
  sgdisk -p /dev/mmcblk0 >/tmp/mmcpart
  while read number start end size unit code name; do
    if [ "$name" = "$1" ]; then
      result=$number
    fi
  done </tmp/mmcpart
  rm -f /tmp/mmcpart
  [ -n "$result" ] && echo "$result"
}


fail()
{
  echo "$(basename $0):" "$@" >&2
  [ -f $BADBLOCK_FILE ] || echo "" >$BADBLOCK_FILE
}


recover_volume()
{
  # Format MTD device and mount UBI volumes.
  # $1 - MTD device number
  # $2 - UBI device number

  echo "Failed to mount ubifs on mtd$1, formatting..."

  # umount UBI volumes detach UBI devices
  umount_ubifs $2

  # format MTD partition
  ubiformat /dev/mtd$1 -y

  # attach UBI devices and mount UBI volumes
  mount_ubifs $1 $2
}


mount_ubifs()
{
  # Attach MTD device to UBI device.
  # $1 - MTD device number
  # $2 - UBI device number

  #echo "Attach mtd$1 to /dev/ubi$2"
  # If UBI device failed to attach, return 1 to call 'recover_volume()':
  # 1. detach UBI devices
  # 2. erase MTD partition
  # 3. format MTD partition
  # 4. attach UBI devices and mount UBI volumes again
  ubiattach -m $1 -d $2
  if [ $? -eq 0 ]; then
    mount_volumes $1 $2 || return 1
  else
    echo "Failed to attach mtd$1 to /dev/ubi$2"
    return 1
  fi
}


mount_volumes()
{
  # Mount UBI volumes.
  # $1 - MTD device number
  # $2 - UBI device number

  if [ $1 -eq ${DATA_MTD_NO} ]; then
    # mount UBI 'config' volume
    mount_volume ${CONFIG_NAME} $2 ${CONFIG_SIZE} || return 1

    # mount UBI 'user' volume
    mount_volume ${USER_NAME} $2 ${USER_SIZE} || return 1
  fi
}


mount_volume()
{
  # Mount UBI volume.
  # $1 - UBI volume name
  # $2 - UBI device number
  # $3 - UBI volume size

  # make UBI volume
  make_volume $1 $2 $3 || return 1

  # mount UBI volume
  [ ! -d /$1 ] && mkdir -p /$1
  if ! mount -t ubifs ubi$2:$1 /$1; then
    echo "Failed to mount '$1' volume"
    return 1
  fi
}


make_volume()
{
  # Make UBI volume.
  # $1 - UBI volume name
  # $2 - UBI device number
  # $3 - UBI volume size

  # get UBI volume name and remove 'space' characters
  if ubinfo -d $2 -N $1; then
    echo "UBI volume '$1' exists"
    return 0
  fi

  # echo "Make '$1' volume on /dev/ubi$2 (size:$3)"
  if [ $3 -eq "0" ]; then
    size_args="-m"
  else
    size_args="-s $3"
  fi

  if ! ubimkvol /dev/ubi$2 ${size_args} -N $1; then
    echo "Failed to make '$1' volume"
    return 1
  fi
}


umount_ubifs()
{
  # Umount UBI volumes.
  # $1 - UBI device number

  if [ $1 -eq ${DATA_UBI_NO} ]; then
    [ -d /${USER_NAME} ] && umount /${USER_NAME}
    [ -d /${CONFIG_NAME} ] && umount /${CONFIG_NAME}
  else
    return 1
  fi

  sleep 1
  ubidetach -d $1
}


mount_ext4fs()
{
  mount -t ext4 -o defaults,noatime,discard,data=writeback $1 /user || return 1
  [ ! -d /user/config ] && mkdir -p /user/config
  mount --bind /user/config /config || return 1
}

recover_ext4fs()
{
  e2fsck $1 || mkfs.ext4 -E discard -m 2 -L ${DATA_MMC_NAME} $1
  mount_ext4fs $1
}


case "$1" in
  start)
    # Get MTD partition number
    DATA_MTD_NO=$(check_mtd ${DATA_MTD_NAME})

    # Log bbinfo at boot
    BBT=""
    cat /proc/sys/dev/repartition/bbinfo |
    while read a b ; do
      BBT="$BBT$a$b "
    done
    echo "Bad Blocks: $BBT"

    if [ ! -z "${DATA_MTD_NO}" ]; then
      mount_ubifs ${DATA_MTD_NO} ${DATA_UBI_NO} || \
        recover_volume ${DATA_MTD_NO} ${DATA_UBI_NO}
    else
      DATA_MMC_NO=$(check_mmc ${DATA_MMC_NAME})
      DATA_BLK_NAME=/dev/mmcblk0p${DATA_MMC_NO}
      if [ -b ${DATA_BLK_NAME} ]; then
        mount_ext4fs ${DATA_BLK_NAME} || recover_ext4fs ${DATA_BLK_NAME}
      fi
    fi

    [ ! -d /user/rw ] && mkdir -p /user/rw
    [ ! -d /user/bsa ] && mkdir -p /user/bsa
    [ ! -d /user/netflix ] && mkdir -p /user/netflix
    [ ! -d /user/vudu ] && mkdir -p /user/vudu
    [ ! -d /user/drm ] && mkdir -p /user/drm
    [ ! -d /user/widevine ] && mkdir -p /user/widevine
    [ ! -d /user/ytlb ] && mkdir -p /user/ytlb
    [ ! -d /tmp/vudu ] && mkdir -p /tmp/vudu

    rm -rf /user/diag/diagdb.bin /user/diag/*.tmp /user/diag/log

    # /config must be writeable by non-root
    chown bin.sys /config
    chmod 775 /config

    if [ -e /dev/sda ]; then
      (
        smartctl -t short /dev/sda
        sleep 60
        smartctl -l selftest /dev/sda
      ) 2>&1 | logos smartctl &
    fi

    if [ -e /config/DEBUG ]; then
      echo "Enabling DEBUG mode because /config/DEBUG is set." >&2
      echo >/tmp/DEBUG
    fi
    ;;
  stop)
    # Get MTD partition number
    DATA_MTD_NO=$(check_mtd ${DATA_MTD_NAME})

    umount_ubifs ${DATA_UBI_NO}
    ;;
  restart|reload)
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}" >&2
    exit 1
esac
