#!/bin/bash
# 
# Load and initialize the oracleasm driver
#


# Force LC_ALL=C
export LC_ALL=C
 
USAGE="[-l <manager>] [-v]"

exec 3>/dev/null

help=
verbose=
version=
usage=
while case "$#" in 0) break ;; esac
do
    case "$1" in
    -l|--manager)
        case "$#" in 1) usage=t; break ;; esac
        shift
        ORACLE_ASMMANAGER="$1"
        ;;
    -v|--verbose)
        verbose=t
        exec 3>&2
        ;;
    -V|--version)
        version=t
        ;;
    -h|--help)
        help=t
        ;;
    *)
        usage=t
        ;;
    esac
    shift
done

# Load configuration
. oracleasm-Xshlib

if [ "$help" = "t" -o "$usage" = "t" ]
then
    usage
fi

if [ "$version" = "t" ]
then
    version
fi


#
# dev_create()
#
# Create $1
#
dev_create()
{
    if [ "$#" -lt "1" -o -z "$1" ]
    then
        die "dev_create(): Requires an argument"
    fi

    DEV="$1"
    if [ -e "$DEV" ]
    then
        if [ -d "$DEV" ]
        then
            return
        fi
        die "dev_create(): File $DEV is not a directory"
    fi

    echo -n "Creating $DEV mount point: "
    mkdir "$DEV" 2>&3
    if [ $? = 0 ]
    then
        echo "$DEV"
    else
        echo "failed"
        die "Unable to create mount point $DEV"
    fi
}


#
# load_module()
#
load_module()
{
    if [ "$#" -lt "1" -o -z "$1" ]
    then
        die "load_module(): Requires an argument"
    fi

    MODNAME="$1"

    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1;exit}' < /proc/modules 2>/dev/null`"
    if [ -n "$MODOUT" ]
    then
        return
    fi

    echo -n "Loading module \"$MODNAME\": "
    modprobe -s "$MODNAME" 2>&3
    if [ "$?" = 0 ]
    then
        echo "$MODNAME"
    else
        echo "failed"
        die "Unable to load module \"$MODNAME\""
    fi

    ORACLEASM_BLK_PARM="/sys/module/oracleasm/parameters/use_logical_block_size"

    if [ -f $ORACLEASM_BLK_PARM ]
    then
	if [ "$ORACLEASM_USE_LOGICAL_BLOCK_SIZE" = "true" ]
	then
            echo "Configuring \"$MODNAME\" to use device logical block size " 
	    echo -n "Y" > $ORACLEASM_BLK_PARM
	else
            echo "Configuring \"$MODNAME\" to use device physical block size " 
	    echo -n "N" > $ORACLEASM_BLK_PARM
	fi
    fi

    return
}


#
# mount_device()
# Mount the $ORACLE_ASMMANAGER filesystem
#
mount_device()
{
    if [ "$#" -lt "1" -o -z "$1" ]
    then
        die "mount_device(): Requires an argument"
    fi

    DEV="$1"

    ORACLE_ASMMANAGERSEARCH="`echo "$DEV" | sed -e 's/\//\\\\\//g'`"
    MOUNTOUT="`awk '$2 ~ /^'$ORACLE_ASMMANAGERSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"

    if [ -n "$MOUNTOUT" ]
    then
        return
    fi

    echo -n "Mounting ASMlib driver filesystem: "
    mount $OPTS -t oracleasmfs oracleasmfs $DEV 2>&3
    if [ $? != 0 ]
    then
        echo "failed"
        die "Unable to mount ASMlib driver filesystem"
    fi

    for i in ${DEV}/.[a-z]*
    do
        if [ "$i" = ${DEV}'/.[a-z]*' ]
        then
            break
        fi
        perm_disk "$i"
        if [ $? = 1 ]
        then
            echo "failed"
            die "Unable to fix ASM driver permissions"
        fi
    done
        
    perm_disk ${DEV}/iid
    if [ $? = 1 ]
    then
        echo "failed"
        die "Unable to fix ASM driver permissions"
    fi

    chmod 0770 ${DEV}/iid
    if [ $? = 1 ]
    then
        echo "failed"
        die "Unable to fix ASM driver permissions"
    fi

    echo "$DEV"

    return
}

dev_create "${ORACLE_ASMMANAGER}"

load_module "${ORACLEASM_MODNAME}"

mount_device "${ORACLE_ASMMANAGER}"

exit 0

