#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin
SYSTEM_RECOVERY="/usr/libexec/system-recovery/system-recovery"
SYSTEM_RECOVERY_GUI="/usr/bin/system-recovery_gui"
FAKE_ROOT=/system

MOUNT="/usr/bin/mount"
BLKID="/usr/sbin/blkid"
REBOOT="/usr/libexec/initrd-recovery/minireboot"
SYNC="/usr/bin/sync"
UMOUNT="/usr/bin/umount"
CUT="/usr/bin/cut"
LS="/usr/bin/ls"
MKDIR="/usr/bin/mkdir"
RMDIR="/usr/bin/rmdir"
TR="/usr/bin/tr"

#------------------------------------------------
#       get partition id
#------------------------------------------------
get_partition_id() {
    PART_ROOTFS=$("$BLKID" --match-token PARTLABEL=ROOTFS -o device || "$BLKID" --match-token LABEL=rootfs -o device)
    PART_SYSTEM_DATA=$("$BLKID" --match-token PARTLABEL=SYSTEM-DATA -o device || "$BLKID" --match-token LABEL=system-data -o device)
    PART_USER=$("$BLKID" --match-token PARTLABEL=USER -o device || "$BLKID" --match-token LABEL=user -o device)
}

#------------------------------------------------
#       mount_usb_partitions
#------------------------------------------------
USB_MOUNTPOINT_PREFIX=${FAKE_ROOT}/opt/media/USBDrive
mount_usb_partitions() {
    echo "mount USB partitions"
    DEVICE_TYPE_LIST=(
        ext4
        vfat
    )

    LAST_MOUNTED_DEVICE=""
    for DEVICE_TYPE in ${DEVICE_TYPE_LIST[@]}
    do
        DEVICES=""
        for ((i=0; i<10; i++))
        do
            DEVICES=$("$BLKID" /dev/sd* -t TYPE="${DEVICE_TYPE}" -o device)
            if [ ! -z "${DEVICES}" ]
            then
                for DEVICE in ${DEVICES}
                do
                    USB_MOUNTPOINT_INDEX=$(echo ${DEVICE} | "$CUT" -b 8- | "$TR" '[:lower:]' '[:upper:]')
                    USB_MOUNTPOINT=${USB_MOUNTPOINT_PREFIX}${USB_MOUNTPOINT_INDEX}
                    "$MKDIR" -p ${USB_MOUNTPOINT}
                    "$MOUNT" -t ${DEVICE_TYPE} ${DEVICE} ${USB_MOUNTPOINT}

                    LAST_MOUNTED_DEVICE=${DEVICE}
                done
                break
            fi

            sleep 1
        done
    done

    if [ -z "${LAST_MOUNTED_DEVICE}" ]
    then
        echo "WARNING : USB not mounted"
    fi
}

#------------------------------------------------
#       mount_partitions
#------------------------------------------------
mount_partitions() {
    echo "mount partitions"
    get_partition_id

    "$MOUNT" -t ext4 ${PART_ROOTFS} ${FAKE_ROOT} -o ro
    "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/opt
    "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/opt/usr

    "$MOUNT" -t proc none ${FAKE_ROOT}/proc
    "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys
    "$MOUNT" -t smackfs smackfs ${FAKE_ROOT}/sys/fs/smackfs
    "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev
    "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts
    "$MOUNT" -t tmpfs tmpfs ${FAKE_ROOT}/tmp -o mode=1777,smackfsroot=*

    mount_usb_partitions
}

check_debug_file() {
    echo "check debug files"
    DEBUG_MODE_FILE=${FAKE_ROOT}/opt/usr/.recovery_debug
    if [ -f ${DEBUG_MODE_FILE} ]; then
        DEBUG_MODE_FILE_OWNER=$(${LS} -l ${DEBUG_MODE_FILE} | ${CUT} -d " " -f 3)
        if [ "${DEBUG_MODE_FILE_OWNER}" = "0" ]; then
            echo "Enter recovery debug mode"
            echo "If you want to continue recovery, please remove ${DEBUG_MODE_FILE}"
            # Wait until debug mode file is removed
            while [ -f ${DEBUG_MODE_FILE} ]; do
                sleep 3
            done
        else
            echo "Warning: somebody make non-root debug mode file... ignore it"
        fi
    fi
}

#------------------------------------------------
#       umount_usb_partitions
#------------------------------------------------
umount_usb_partitions() {
    echo "umount USB partitions"
    USB_MOUNTPOINTS=$("$LS" -d ${USB_MOUNTPOINT_PREFIX}*)
    for USB_MOUNTPOINT in ${USB_MOUNTPOINTS}
    do
        "$UMOUNT" ${USB_MOUNTPOINT}
        "$RMDIR" ${USB_MOUNTPOINT}
    done
}

#------------------------------------------------
#       umount_partitions
#------------------------------------------------
umount_partitions() {
    echo "umount partitions"
   "$SYNC"

    umount_usb_partitions

    "$UMOUNT" ${FAKE_ROOT}/opt/usr
    "$UMOUNT" ${FAKE_ROOT}/opt
    "$UMOUNT" ${FAKE_ROOT}
}

#------------------------------------------------
#       do_reboot
#------------------------------------------------
do_reboot() {
    echo "Reboot"
    "$SYNC"
    "$REBOOT"
    while [ 1 ]
    do
        sleep 1
        echo "."
    done
}

#------------------------------------------------
#       system-recovery initrc
#------------------------------------------------
echo "Starting system recovery."
mount_partitions

# For debugging - It should be deleted on Release
/sbin/agetty -l /bin/sh -n --keep-baud 115200,38400,9600 ttyS0 linux &

check_debug_file

[ -x "${SYSTEM_RECOVERY_GUI}" ] && "${SYSTEM_RECOVERY_GUI}" &
[ -x "${SYSTEM_RECOVERY}" ] && "${SYSTEM_RECOVERY}"

umount_partitions
do_reboot
