#! /bin/sh
#
#       Based on a example file to build /etc/init.d/ scripts,
#		written by Miquel van Smoorenburg <miquels@cistron.nl>
#		and later modified by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
#       Also based on init script mountnfs.sh from initscripts package.
#
#       Modified for aoetools by David Martnez Moreno <ender@debian.org>.
#       Copyright 2006-2007.  Under GPLv2.
#
#       Support for LVM and other mount points contributed by Glen W. Mabey.
#
### BEGIN INIT INFO
# Provides:          aoe
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Should-Start:      
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Begin AoE discovery and mount related filesystems.
# Description:       Begin AoE discovery and mount filesystems residing
#                    on AoE volumes.
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=aoetools
DESC="AoE devices discovery and mounting AoE filesystems"

[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions

# Include aoetools defaults if available
if [ -f /etc/default/aoetools ] ; then
	. /etc/default/aoetools
fi

set -e

create_fs_list() {
    # We start with a list from /etc/default/aoetools.
    waitaoe="$AOEMOUNTS"

    [ -f /etc/fstab ] || return
    #
    # Read through fstab line by line. If it contains /dev/etherd, set the flag
    # for mounting file systems over AoE. 
    #

    exec 9<&0 </etc/fstab

    while read DEV MTPT FSTYPE OPTS REST
    do
        case "$OPTS" in
          noauto|*,noauto|noauto,*|*,noauto,*)
            continue
            ;;
        esac
        case "$DEV" in
          ""|\#*)
            continue
            ;;
          /dev/etherd/*)
            waitaoe="$waitaoe $MTPT"
        esac
    done

    exec 0<&9 9<&-
}

do_start() {
    # We exit if the user does not want us to try this.
    if [ "$INTERFACES" = "none" ]
    then
        log_failure_msg "not started."
        exit 0
    fi

    # Usually aoe is a module, so we will try to load it.
    if [ -n "$INTERFACES" ]
    then
        modprobe aoe aoe_iflist="$INTERFACES" >/dev/null 2>&1 || true
    else
        modprobe aoe >/dev/null 2>&1 || true
    fi

    # Also, if udev is being used, the /dev/etherd devices
    # are not created until aoe module insertion, so...
    sleep 1  # ...we give udev a chance to populate /dev/etherd/.

    if [ ! -c /dev/etherd/discover ]
    then
        log_failure_msg "Missing devices under /dev/etherd/.  Please run aoe-mkdevs /dev/etherd and try again." >&2
        exit 1
    fi

    # Try to set up interfaces for discovery, if any.
    if [ -n "$INTERFACES" ]
    then
        aoe-interfaces $INTERFACES
    fi

    aoe-discover

    create_fs_list

    if [ -n "$waitaoe" ]
    then
        echo
    fi

    if [ ! -x "/sbin/vgchange" -a -n "$LVMGROUPS" ]
    then
        log_failure_msg "The LVM2 tools are not present.  Please install lvm2 package and try again. We will not honour LVMGROUPS."
        LMVGROUPS=''
    fi

    if [ -n "$LVMGROUPS" ]
    then
	echo "Assembling LVM2 groups..."
        for vg in "$LVMGROUPS"; do
            vgchange --available=y $vg
        done
    fi

    if [ -n "$waitaoe" ]
    then
        for mountpt in $waitaoe; do
            log_action_msg "Mounting $mountpt..."
            mount $mountpt
            #log_action_begin_msg "Waiting for $mountpt."
        done
    else
    	echo "Nothing to mount."
    fi
}

do_stop() {
    create_fs_list

    if [ -n "$waitaoe" ]
    then
        for mountpt in $waitaoe; do
            log_action_msg "Unmounting $mountpt..."
            umount $mountpt
        done
    fi

    if [ -n "$LVMGROUPS" ]
    then
        for vg in "$LVMGROUPS"; do
            vgchange --available=n $vg
        done
    fi

    # Removing the module prevents LVM's "Shutting down LVM Volume Groups..."
    # from hanging when an LVM has been setup on a device in /dev/etherd/.
    modprobe --remove aoe >/dev/null 2>&1 || true
}

case "$1" in
  start|restart|reload|force-reload)
	log_daemon_msg "Starting $DESC"
    do_start
	log_end_msg 0
	;;
  stop)
	log_daemon_msg "Stopping $DESC: "
    do_stop
	log_end_msg 0
	;;
  *)
	N=/etc/init.d/$NAME
	echo  "Usage: $N {start|stop|restart|reload|force-reload}"
	exit 1
	;;
esac

exit 0
