#!/bin/bash
#   userful-storage-mount
#
#   Jason Kim <jason@userful.com>
#
#   Copyright (c) 2002-2007 by Userful Corporation
#
#   Wrapper script for hal mount program to control permission.
###############################################################

logfile="/var/log/userful-start.log"
source /etc/userful/os-info

function check_arch()
{
    case $(uname -m) in
        x86_64|ia64)
        echo "lib64"
        ;;
    *)
        echo "lib"
        ;;
    esac
}

if [ "$HAL_PROP_INFO_CATEGORY" == "storage" ]; then # Internal Floppy
    # Internal floppy is handled differently.
    ASSIGNED_SCREEN="$HAL_PROP_INFO_SCREEN"
    DRIVE_TYPE="$HAL_PROP_STORAGE_DRIVE_TYPE"
    STORAGE_BUS="$HAL_PROP_STORAGE_BUS"

elif [ "$HAL_PROP_INFO_CATEGORY" == "volume" ]; then

    # Check the filesystem type first
    if [ "$HAL_PROP_VOLUME_FSTYPE" == "" ]; then
	    echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) File System is not available." >> $logfile
	    echo "org.freedesktop.Hal.Device.Volume.UnknownFailure" >&2
	    echo "File System is not available. Please format your disk." >&2
	    exit 1
    fi

    # Internal CDROM and USB devices
    PARENT_UDI="$HAL_PROP_INFO_PARENT"

    ASSIGNED_SCREEN=`hal-get-property --udi "$PARENT_UDI" --key "info.screen"`
    DRIVE_TYPE=`hal-get-property --udi "$PARENT_UDI" --key "storage.drive_type"`
    STORAGE_BUS=`hal-get-property --udi "$PARENT_UDI" --key "storage.bus"`

else
	echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) Invalid info.category:$HAL_PROP_INFO_CATEGORY" >> $logfile
	echo "org.freedesktop.Hal.Device.Volume.UnknownFailure" >&2
	echo "$HAL_PROP_BLOCK_DEVICE has invalid info.category:$HAL_PROP_INFO_CATEGORY" >&2
	exit 1
fi

if [ "$ASSIGNED_SCREEN" == "" ]; then # info.screen is not available
	echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) info.screen is not available. Shared device." >> $logfile
	#UMASK_OPTION="umask=0077"

elif [ "$ASSIGNED_SCREEN" == "shared" ]; then # shared

	echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) Shared device." >> $logfile
	#UMASK_OPTION="umask=0077"

elif [ "$ASSIGNED_SCREEN" == "disabled" ]; then # disabled
	echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) Disabled device." >> $logfile
	echo "org.freedesktop.Hal.Device.Volume.UnknownFailure" >&2
	echo "$HAL_PROP_BLOCK_DEVICE is disabled." >&2
	exit 1
	
else # Device is assigned to a station. check permission.
	echo "call multistation-storage-permission-check.sh" >> $logfile
	/opt/userful/bin/multistation-storage-permission-check.sh mount
	RET=$?

	if [ $RET -ne 0 ]; then
		echo "org.freedesktop.Hal.Device.Volume.PermissionDenied" >&2
		echo "Current device is assigned to other station." >&2
		exit 1
	fi
fi

if [ "$DRIVE_TYPE" == "cdrom" ]; then
	UMASK_OPTION=""

elif [ "$DRIVE_TYPE" == "floppy" ]; then
	#UMASK_OPTION="umask=0077\tsync"
	UMASK_OPTION="umask=0077"

    if [ "$STORAGE_BUS" == "platform" ]; then

        if [[ "$OSNAME" == "novell" && "$OSVER" == "10" ]]; then
            # Don't set MOUNTPOINT for SLED10
            MOUNTPOINT=
        else
            MOUNTPOINT="Internal-Floppy-`basename $HAL_PROP_BLOCK_DEVICE`"
            if [ -e /media/$MOUNTPOINT ]; then
                rm -rf /media/$MOUNTPOINT
            fi
        fi

        if [[ "$OSNAME" == "novell" && "$OSVER" == "10" ]]; then
            # Don't set MOUNTTYPE for SLED10
            MOUNTTYPE=
        else
            MOUNTTYPE="vfat"
        fi
    fi

else
    if [ "$HAL_PROP_VOLUME_FSTYPE" == "vfat" -o "$HAL_PROP_VOLUME_FSTYPE" == "fat" ]; then
	    UMASK_OPTION="umask=0077"
    else
        # ext2 and ext3 don't have "umask" mount option.
	    UMASK_OPTION=""
    fi
fi

LANG=en_US.UTF-8

read GIVEN_MOUNTPOINT
GIVEN_MOUNTPOINT=${GIVEN_MOUNTPOINT//[^[:alnum:]_=[:space:]:.,+-]/@}
if [ "$GIVEN_MOUNTPOINT" == "" -a "$MOUNTPOINT" != "" ]; then
    GIVEN_MOUNTPOINT="$MOUNTPOINT"
fi

read GIVEN_MOUNTTYPE
GIVEN_MOUNTTYPE=${GIVEN_MOUNTTYPE//[^a-zA-Z0-9_=]/_}
if [ "$GIVEN_MOUNTTYPE" == "" -a "$MOUNTTYPE" != "" ]; then
    GIVEN_MOUNTTYPE="$MOUNTTYPE"
fi

read GIVEN_MOUNTOPTIONS
GIVEN_MOUNTOPTIONS=${GIVEN_MOUNTOPTIONS//[^a-zA-Z0-9_=-[:space:]]/_}

echo "`date +"%b %d %T"` (mount $HAL_PROP_BLOCK_DEVICE) Mount Point:$GIVEN_MOUNTPOINT, Type:$GIVEN_MOUNTTYPE, Option:$GIVEN_MOUNTOPTIONS $UMASK_OPTION" >> $logfile

LIB=$(check_arch)

##
## Find hal-storage-mount and run it.
##
HAL_MOUNT_COMMAND=
if [[ -e ./hal-storage-mount ]]; then
    HAL_MOUNT_COMMAND="./hal-storage-mount"

elif [[ -e ./hal-system-storage-mount ]]; then
    HAL_MOUNT_COMMAND="./hal-system-storage-mount"

elif [[ -e /usr/$LIB/hal/scripts/hal-storage-mount ]]; then
    HAL_MOUNT_COMMAND="/usr/$LIB/hal/scripts/hal-storage-mount"

elif [[ -e /usr/$LIB/hal/scripts/hal-system-storage-mount ]]; then
    HAL_MOUNT_COMMAND="/usr/$LIB/hal/scripts/hal-system-storage-mount"

elif [[ -e /usr/libexec/hal-storage-mount ]]; then
    HAL_MOUNT_COMMAND="/usr/libexec/hal-storage-mount"

elif [[ -e /usr/libexec/hal-system-storage-mount ]]; then
    HAL_MOUNT_COMMAND="/usr/libexec/hal-system-storage-mount"
fi

echo -e "$GIVEN_MOUNTPOINT\n$GIVEN_MOUNTTYPE\n$GIVEN_MOUNTOPTIONS\t$UMASK_OPTION\n" | $HAL_MOUNT_COMMAND

RET=$?
if [ $RET -eq 0 ]; then
    SCREEN_NUM=`cat /opt/userful/locks/screen.$HAL_METHOD_INVOKED_BY_UID`

    # Don't show unmount message for CD/DVD 
    if [[ "$HAL_PROP_VOLUME_IS_DISC" == "false" || "$HAL_PROP_INFO_CATEGORY" == "storage" ]] && \
       [[ -f /opt/userful/bin/multistation-storage-mount.py ]]; then

        export DISPLAY=:$SCREEN_NUM.0

        DEVICE_NAME=`hal-get-property --udi "$PARENT_UDI" --key "info.vendor" 2> /dev/null`
        if [[ "$DEVICE_NAME" == "" ]]; then
            if [[ "$HAL_PROP_INFO_VENDOR" != "" ]]; then
                DEVICE_NAME=$HAL_PROP_INFO_VENDOR
            elif [[ "$HAL_PROP_INFO_PRODUCT" != "" ]]; then
                DEVICE_NAME=$HAL_PROP_INFO_PRODUCT
            else
                DEVICE_NAME=Unkown
            fi
        fi

        # Launch unmount message dialog for shared device
        # Launching message dialog as backgound process cause another error dialog in SLED11.
        #/opt/userful/bin/multistation-storage-mount.py "$DEVICE_NAME" > /dev/null 2>&1 &
        /opt/userful/bin/multistation-storage-mount.py "$DEVICE_NAME" > /dev/null 2>&1

        # Kill gnome-mount to prevent launching "Opening <device> Cancel dialog"
        # Fix bug #261
        #pkill -n -U $HAL_METHOD_INVOKED_BY_UID gnome-mount
    fi
fi
