#!/usr/local/bin/bash

## Some default values
devid=`isi_nodes -n \`hostname | awk -F- '{print $NF}'\` %{devid}`
echo Devid: $devid
node=`hostname | sed -E "s/-[0-9]*$//"`-$devid
echo Node: $node

## Argument parsing

usage() {
	echo "Usage: isi_restore_meta [-c <source cluster>] <source directory>"
	exit 1
}

args=`getopt c: $*`
if [ $? != 0 ]; then
	usage
fi

set -- $args

for i; do
	case "$i" in
	-c)
		node="$2-$devid"; shift;
		shift;;
	--)
		shift; break;;
	esac
done

if [ $# != 1 ]; then
	usage
fi

# Sort src and dest drives
## 8 or 12-port twe detection and adjustment
srcdrvs=(`find $1 -name ${node}_\*s1e | awk -F_ '{print $NF}' | sed s/s1e// | sort`)
echo Source Drives: ${srcdrvs[*]}
destdrvs=(`isi_drivenum -D | grep -v "N/A" | sort`)
echo Dest Drives: ${destdrvs[*]}

## Test run -- ensure everything is here before copying over anything
fail=0
for f in drives.xml mnv0.gz; do
	if [ ! -f $1/${node}_$f ]; then fail=1; fi
done

if [ $fail = 1 ]; then
	echo Error: Image of $node is incomplete, check cluster name and devid
	usage
fi

if [ ${#srcdrvs[*]} != ${#destdrvs[*]} ]; then
	echo "Error: Cannot restore ${#srcdrvs[*]} source drives to" \
	     "${#destdrvs[*]} destination drives"
        exit 1
fi

## Body of script
status_file="/tmp/.restore_meta"
cp $1/${node}_drives.xml /etc/ifs/drives.xml 
echo $? > $status_file

for ((i = 0; i < ${#srcdrvs[*]}; i++)); do
	echo "restoring disk meta for /dev/${destdrvs[$i]}s1e"
	echo "from ${node}_${srcdrvs[$i]}s1e..."
	(
	    isi_save_disk_meta -w /dev/${destdrvs[$i]}s1e \
		-i $1/${node}_${srcdrvs[$i]}s1e -v
	    echo $? >> $status_file
	) &
done

# XXXJMH this doesn't work on Graham for some reason.
# In any case, it will corrupt if we're doing CRC mangling.
#(
#    gunzip -c $1/${node}_mnv0.gz | dd of=/dev/mnv0 bs=1m 2> /dev/null
#    echo $? >> $status_file
#) &

# Just newjournal instead and hope we were clean.
(
    JDEV=`/usr/bin/isi_hwtools/isi_hal_predicate getJournalDevicePath`
    retval=${?}
    JDEV=`echo ${JDEV} | tail -n 1`
    if [ ${retval} -eq 1 ]; then
        isi_newjournal -f ${JDEV} --force
    else
        false
    fi
    echo $? >> $status_file
) &

wait

exit_status=0
errors=`grep -c -v ^0$ $status_file`

if [ $errors -gt 1 ]; then
	echo "isi_restore_meta encountered $errors errors"
	exit_status=1
elif [ $errors -eq 1 ]; then
	echo "isi_restore_meta encountered an error"
	exit_status=1
else
	echo "isi_restore_meta completed successfully"
fi

rm $status_file

exit $exit_status
