#!/bin/bash
# 
# Return a disk to the operating system
#


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

exec 3>/dev/null

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


# Load configuration
. oracleasm-Xshlib

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

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



verify_usable()
{
    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
    then
        die "verify_usable(): Requires an argument"
    fi

    DISKNAME="$1"
    DEV="$2"

    OUTPUT="$(oracleasm-candidate-p -v "${DEV}" 2>&1)"
    if [ $? != 0 ]
    then
        echo "$OUTPUT" | sed -e 's/^[^:]*: *//' >&2
        [ "$force" != "t" ] && die

        oracleasm-candidate-p -v -f "${DEV}" 2>&3
        [ $? != 0 ] && die
        echo "Forced - continuing anyway" >&2
    fi

    INFO="$(oracleasm-read-label "${DEV}" 2>&3)"
    if [ $? != 0 ]
    then
        die "Unable to access device \"${DEV}\"" >&2
    fi

    if [ -n "$INFO" ]
    then
        LABEL="$(echo "$INFO" | cut -f1 -d:)"
        die "Device \"$DEV\" is already labeled for ASM disk \"${LABEL}\"" >&2
    fi

    if oracleasm-querydisk -l "${ORACLE_ASMMANAGER}" "${DISKNAME}" 1>&3 2>&3
    then
        die "Disk \"${DISKNAME}\" already exists"
    fi

    return 0
}

create_disk()
{
    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
    then
        die "create_disk(): Requires an argument"
    fi

    DISKNAME="$1"
    DEV="$2"

    echo -n "Writing disk header: "
    oracleasm-write-label -c "${DEV}" "${LABEL}" 2>&3
    if [ $? != 0 ]
    then
        echo "failed"
        die "Unable to label device \"${DEV}\""
    fi
    echo "done"

    echo -n "Instantiating disk: "
    oracleasm-instantiate-disk -l "${ORACLE_ASMMANAGER}" "${DEV}" "${LABEL}" 2>&3
    if [ $? != 0 ]
    then
        echo "failed"
        echo -n "Clearing disk header: "
        oracleasm-write-label -d "${DEV}" 2>&3
        if [ "$?" != 0 ]
        then
            echo "failed"
            die "Unable to clear disk \"${DEV}\""
        fi
        echo "done"
        die
    fi

    perm_disk "$(asm_disk_path "${ORACLE_ASMMANAGER}" "${DISKNAME}")"
    if [ $? = 1 ]
    then
        echo "failed"
        die "Unable to change ownership of disk \"${DISKNAME}\""
    fi

    echo "done"

    return 0
}


if [ $# != 2 -o -z "$1" -o -z "$2" ]
then
    usage
fi

LABEL="$(upper_disk "$1")"
shift
if [ -z "$LABEL" ]
then
    exit 1
fi

DEV="$1"
shift

verify_usable "$LABEL" "$DEV"
create_disk "$LABEL" "$DEV"

exit 0
