#!/bin/bash

#    Copyright (c) 2011-2016 Ericsson AB.
#    All rights reserved.
#
# Objective    : Automatically mount the external USB disk on boot &  hot-plug.
# Location     : /etc/udev/scripts/rpsw-flash-mgmt
# Version      : 0.2 Oct 24, 2011
# Developed by : Dhirender Rathi(dhirender.rathi@ericsson.com)
#
# A file is created/updated to entertain application requirements. See
# target/nhk/libsrc/rboslib/sysdeps/src/target_disk.c

STAT_FILE=/dev/.ext_disk

# %k from udev rule
DISK=$2

# %n from udev rule
PART=$3

EXTERNAL_FLASH="/devices/pci0000:00/0000:00:14.0/usb"

###############################
## Find Logical name of disk ##
###############################
find_disk() {

   # Find the disk
   for i in `echo /sys/block/sd[abcd]`; do
      ls -ld $i | grep $1 >/dev/null 2>&1
      if [[ $? -eq 0 ]]; then
         HDD=`echo $i | sed -e "s#^/.*/##"`
         break
      fi
   done
   echo $HDD
}

verify_ext_disk() {
    if [[ "$product_code" == "W050" ]]; then
        # RPSW2 external usb is sdb
        USB_DISK=`find_disk ${EXTERNAL_FLASH}`
        USB_DISK_PART="${USB_DISK}1"
    fi
    # Do not mount/umount any other partition or disk
    if [[ "$DISK" != "$USB_DISK_PART" ]]; then
        exit 0
    fi
    logger -s -t udev -p kern.notice "External USB Disk verified by udev-rules"
}

mount_flash() {

    # Internal disks are mounted before start of udev, so ignore those.
    grep /dev/$DISK /proc/mounts >/dev/null
    if [ $? -eq 0 ]; then
        exit 0
    fi

    # Find FS type, and mount only first partition
    if [[ $product_code == "W050" ]]; then
        # in Jarvis, /lib/udev/vol_id is symlink to blkid
        FS_TYPE=$(/sbin/blkid -p -s TYPE -o value /dev/$DISK 2>&1)
    fi

    if [ $? -ne 0 ]; then
        logger -s -t udev -p kern.notice "Error: $FS_TYPE"
        /usr/bin/flock -x $STAT_FILE -c "printf 'time = 0\nerrors = 1\n' >$STAT_FILE"
        exit 0
    fi

    verify_ext_disk

    [ -d /media/flash ] ||  mkdir -p /media/flash
    sed -i '\/media\/flash/d' /etc/mtab

    MOUNT_OPTS="rw,noauto,nodev,nosuid,noexec,noatime"
    # IPOS users with SystemAdministrator role are allowed
    # to write external USB device. For fat based filesystem,
    # setup gid=SystemAdministrator and for ext based file system
    # setup acl during mount and apply facl on mount point.

    acl_support=0
    case $FS_TYPE in
    *fat* | ntfs)
        MOUNT_OPTS+=",uid=root,gid=SystemAdministrator,fmask=0113,dmask=0002"
        ;;
    ext* )
        MOUNT_OPTS+=",acl"
        acl_support=1
        ;;
    esac

    mount -t ${FS_TYPE} -o ${MOUNT_OPTS} /dev/${DISK} /media/flash

    if [ $acl_support = "1" ]; then
        # Group facl to work, the base group permission shall
        # have rw set.
        chmod g=rwX /media/flash/
        # default facl on /media/flash folder.
        /usr/bin/setfacl -R -n -m d:g:SystemAdministrator:rwX /media/flash
        # Apply facl for already existing contents.
        /usr/bin/setfacl -R -n -m g:SystemAdministrator:rwX /media/flash
    fi

    # No idling before write
    #echo "0" > /sys/block/sdc/queue/iosched/slice_idle
    echo "0" > /sys/block/$USB_DISK/queue/iosched/slice_idle

    logger -s -t udev -p kern.notice "External device /dev/$DISK is mounted."

    if [ $? -eq 0 ]; then
        TIME=$(date +%s)
        /usr/bin/flock -x $STAT_FILE -c "printf 'time = $TIME\nerrors = 0\n' >$STAT_FILE"
    else
        /usr/bin/flock -x $STAT_FILE -c "printf 'time = 0\nerrors = 1\n' >$STAT_FILE"
    fi
}

unmount_flash() {
    if [[ $product_code == "W050" ]];  then
        logger -s -t udev -p kern.notice "Trying to unmount external device /dev/$DISK."
        grep "/media/flash" /proc/mounts >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            exit 0
        fi

        umount /media/flash
        if [ $? -eq 0 ]; then
            logger -s -t udev -p kern.notice "Unmount of external device /dev/$DISK succeeded."
        else
            umount -l /media/flash
            logger -s -t udev -p kern.notice "Unmount of external device /dev/$DISK failed."
        fi
        sed -i '\/media\/flash/d' /etc/mtab
    fi
}

# Main starts here
logger -s -t udev kern.notice "Script $0 called with arguments $0 $1 $2 $3."
product_code=$(cat /sys/firmware/rbn/nvenv/chosen/board-product-code)
case "$1" in
    mount) mount_flash;;
    unmount) unmount_flash;;
    *) exit;;
esac
