#!/bin/sh
#

mountpoint="/lib/recovery/media"
RECOVERY_MEDIA_PATH="backup"
RECOVERY_PART_LABEL="Backup"
PLAYBOOK="$mountpoint/${RECOVERY_MEDIA_PATH}/recovery.json"

sys2dev() {
    sysdev=${1#/sys}
    echo "/dev/$(udevadm info -q name -p ${sysdev} 2>/dev/null|| echo ${sysdev##*/})"
}

get_fstype() {
    /sbin/blkid -s TYPE -o value $1 2>/dev/null
}

is_nice_device() {
    sysfs_path="${1#/sys}"
    if udevadm info --query=all --path="${sysfs_path}" | egrep -q "DEVTYPE=disk"; then
        return 0
    fi
    if echo ${sysfs_path} | grep -q "^/block/dm-"; then
        return 0
    fi
    return 1
}

is_supported_fs () {
    fstype="${1}"
    case ${fstype} in
        vfat|iso9660|udf|ext2|ext3|ext4|btrfs|ntfs|f2fs|reiserfs|xfs)
            return 0
            ;;
    esac
    return 1
}

check_dev ()
{
    sysdev="${1}"
    devname="${2}"
    if [ -z "${devname}" ]; then
        devname=$(sys2dev "${sysdev}")
    fi
    [ -e "$devname" ] || return 1
    if ! udevadm info --query=all --path="$sysdev" | egrep -q "ID_FS_LABEL=${RECOVERY_PART_LABEL}"; then
        return 1
    fi

    fstype=$(get_fstype "${devname}")
    if is_supported_fs ${fstype}; then
        devuid=$(blkid -o value -s UUID "$devname")
        #try to mount twice when failed
        if ! mount -t ${fstype} -o rw,noatime "${devname}" $mountpoint; then
            mount "${devname}" $mountpoint || return 1
        fi
        if is_recovery_path $mountpoint; then
            return 0
        else
            umount $mountpoint
        fi
    fi
    return 1
}

is_recovery_path() {
    path=$1
    if [ -d "$path/$RECOVERY_MEDIA_PATH" ]; then
        if [ -e ${PLAYBOOK} ];then
            return 0
        fi
    fi
    return 1
}

subdevices() {
    sysblock=$1
    r=""
    for dev in "${sysblock}" "${sysblock}"/*; do
        if [ -e "${dev}/dev" ]; then
            r="${r} ${dev}"
        fi
    done
    echo ${r}
}

find_recoveryfs() {
    # or do the scan of block devices
    for sysblock in $(echo /sys/block/* | tr ' ' '\n' | egrep -v "/(ram|fd|md)"); do
        devname=$(sys2dev "${sysblock}")
        [ -e "$devname" ] || continue
        fstype=$(get_fstype "${devname}")
        if is_nice_device "${sysblock}" ; then
            for dev in $(subdevices "${sysblock}"); do
                if check_dev "${dev}"; then
                    return 0
                fi
            done
        fi
    done
    return 1
}

main() {
    mkdir -p ${mountpoint}
    find_recoveryfs ${PLAYBOOK}
    ret=$?
    if [ ${ret} = 0 ];then
        echo ${PLAYBOOK}
    fi
    return ${ret}
}

main
