#!/bin/sh

# Original script by Freddie Cash <fjwcash@gmail.com>
# Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
# and Viktor Petersson <vpetersson@wireload.net>

# Node's current HAST role (primary/secondary)
hast_role=$( hastctl status |awk 'NR==2 {print $3}' )

# The names of the HAST resources, as listed in /etc/hast.conf
resources="test0 test1"

# delay in mounting HAST resource after becoming master
# make your best guess
delay=3

# logging
log="local0.debug"
name="carp-hast"

# end of user configurable stuff

go_master () {

    logger -p $log -t $name "Transitioning to master..."

    #ifconfig em0 vhid 1 state master

    sleep ${delay}

    # Wait for any "hastd secondary" processes to stop
    for disk in ${resources}; do

        logger -p $log -t $name "Waiting for 'hastd secondary' processes for ${disk} to stop."
        while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
            sleep 1
        done
        logger -p $log -t $name "Secondary processes for ${disk} have stopped."

        # Switch role for each disk
        logger -p $log -t $name "Switching role to primary for ${disk}."
        hastctl role primary ${disk}
        if [ $? -ne 0 ]; then
            logger -p $log -t $name "Unable to switch role to primary for ${disk}."
            exit 1
        fi
        logger -p $log -t $name "Switched role to primary for ${disk}."
    done

    # Wait for the /dev/hast/* devices to appear
    for disk in ${resources}; do
        logger -p $log -t $name "Waiting for /dev/hast/${disk}."
        for I in $( jot 60 ); do
            [ -c "/dev/hast/${disk}" ] && break
            sleep 0.5
        done

        if [ ! -c "/dev/hast/${disk}" ]; then
            logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
            exit 1
        fi
        logger -p $log -t $name "GEOM provider /dev/hast/${disk} has appeared."
    done

    for disk in ${resources}; do
        logger -p $log -t $name "Mounting disk ${disk}"

        mkdir -p /hast/${disk}

        fsck -p -y -t ufs /dev/hast/${disk}
        logger -p $log -t $name "Mounting disk ${disk}: fsck complete."

        mount /dev/hast/${disk} /hast/${disk}
        if [ $? -ne 0 ]; then
            logger -p $log -t $name "Unable to mount /dev/hast/${disk} on /hast/${disk}."
            exit 1
        fi
        logger -p $log -t $name "Mounting disk ${disk}: mount complete."

    done

    logger -p $log -t $name "Starting nfsd."
    service nfsd restart
    if [ $? -ne 0 ]; then
        logger -p $log -t $name "Unable to start nfsd."
        exit 1
    fi
    logger -p $log -t $name "Started nfsd."

    logger -p $log -t $name "Transition to master complete."
}

go_slave () {

    logger -p $log -t $name "Transitioning to slave..."

    logger -p $log -t $name "Stopping nfsd."
    service nfsd stop
    if [ $? -ne 0 ]; then
        logger -p $log -t $name "Unable to stop nfsd."
        exit 1
    fi
    logger -p $log -t $name "Stopped nfsd."

    # Switch roles for the HAST resources
    for disk in ${resources}; do

        logger -p $log -t $name "Switching role to secondary for ${disk}."

        if ! mount | grep -q "^/dev/hast/${disk} on "
        then
        else
            umount -f /hast/${disk}
        fi

        sleep $delay

        hastctl role secondary ${disk} 2>&1
        if [ $? -ne 0 ]; then
            logger -p $log -t $name "Unable to switch role to secondary ${disk}."
            exit 1
        fi
        logger -p $log -t $name "Switched role to secondary for ${disk}."

    done

    logger -p $log -t $name "Transition to slave complete."
}

logger -p $log -t carp-hast "$1 $hast_role"

case "$1" in
    MASTER)

        if [ "$hast_role" = 'secondary' ]; then
            go_master
        fi
    ;;

    INIT)

        if [ "$hast_role" = 'primary' ]; then
            go_slave
        fi
    ;;

esac
