#!/bin/bash
#
# **** License ****
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# This code was originally developed by Vyatta, Inc.
# Portions created by Vyatta are Copyright (C) 2006, 2007 Vyatta, Inc.
# All Rights Reserved.
#
# Author: Bob Gilligan <gilligan@vyatta.com>
# Date: 2008
# Description: A script to handle events from the Linux Software RAID 
#              subsystem.
#
# **** End License ****
#
# This script is called by the "mdadm" daemon running in "monitor" mode
# whenever an event occurs in in the RAID subsytem.  The script is called
# with two or three arguments: The first argument is always the name of
# the event, e.g. "RebuildFinished".  The second argument is the name of
# the RAID set device that the event pertains to, e.g. "/dev/md0".  The
# third argument is provided for some events, and gives the name of the
# RAID set member that the event pertains to, e.g. "/dev/sda2".
#
# See the mdadm(8) man page for more details on the events that it provides.
#

# Script will be called with 2 or 3 arguments, depending on the event
if [ $# -lt 2 ]; then
	logger -t "RAID" -p local0.warning "vyatta-raid-event: Error: Not enough args: $*"
	# We can't do anything if we don't know event and RAID device it
	# pertains to.
	exit 1
fi
if [ $# -gt 3 ]; then
	logger -t "RAID" -p local0.warning "vyatta-raid-event: Warning: too many args: $*"
	# Be Robust: Try to complete task with args we know about
fi

event=$1
raid_set=$2

case $event in

    RebuildFinished)
    logger -t "RAID" -p local0.warning "event ${event} ${raid_set}"

    # We need to update grub at the time that a resync completes
    # on the root filesystem so that the new member disk will be
    # bootable.
    root_dir=/
    mounted_on_root=0
    mounted_on=`mount | grep "^${raid_set}" | awk '{ print $3 }'`
    for dir in $mounted_on ; do
	if [ "$dir" = "/" -o "$dir" = "/live/image" ]; then
	    mounted_on_root=1
	    root_dir=$dir
	fi
    done

    if [ $mounted_on_root -eq 1 ]; then
	raid_set_dev=${raid_set##*/}
	if [ -e /sys/block/${raid_set_dev}/md/degraded ]; then
	    degraded=`cat /sys/block/${raid_set_dev}/md/degraded`
	else
	    degraded=0
	fi
	if [ $degraded -eq 0 ]; then
            drive=${member_to_add%%[0-9]*}
            logger -t "RAID" -p local0.warning \
		"RAID set ${raid_set} holds root filesystem. Updating grub."
	    touch /tmp/raid-grub-install-log
            grub-install --no-floppy --recheck --root-directory=${root_dir} ${raid_set} \
		>> /tmp/raid-grub-install-log 2>&1
	    if [ $? -ne 0 ]; then
		logger -t "RAID" -p local0.warning \
		    "grub-installed failed for $raid_set"
	    fi
	else
	    logger -t "RAID" -p local0.warning \
		"RAID set ${raid_set} is still degraded.  No action taken."
	fi
    else
	logger -t "RAID" -p local0.warning \
	    "RAID set ${raid_set} does not hold root filesystem.  No action taken"
    fi
    ;;

    DeviceDisappeared | RebuildStarted | Rebuild?? | NewArray | \
	DegradedArray | MoveSpare | SparesMissing | TestMessage)
    logger -t "RAID" -p local0.warning \
	"event ${event} ${raid_set}: No action taken"
    ;;

    Fail | FailSpare | SpareActive)
    member=$3
    logger -t "RAID" -p local0.warning \
	"event ${event} ${raid_set} ${member}: No action taken"
    ;;

    *)
    logger -t "RAID" -p local0.warning \
	"event ${event} unknown. No action taken"
    ;;
    
    esac
