#!/bin/bash

# Usage: salpack-rebuild-md [/dev/md0 ...]

SYSDIR=/sys/devices/virtual/block

if [ "$1" = "--force" -o "$1" = "-f" ]; then
  SALPACK_FORCE=1
  shift
fi

if [ "$1" = "--watch" -o "$1" = "-w" ]; then
  SALPACK_WATCH=1
  shift
fi

if [ "$1" ]; then
  MDS="`echo $@ | sed 's|/dev/||g'`"
else
  MDS="`echo $SYSDIR/md* | sed s:$SYSDIR/::g`"
fi

getparam() {
  cat $SYSDIR/$MD/md/$1
}

getdevs() {
  echo $SYSDIR/$MD/md/dev-* | sed s:$SYSDIR/$MD/md/dev-::g
}

hasstate() {
  grep -q "$2" $SYSDIR/$MD/md/dev-$1/state > /dev/null
}

cat /proc/mdstat
echo "---------------------------------------------------------------------"

for MD in $MDS; do
  if [ -d $SYSDIR/$MD/md ]; then
    degraded=`getparam degraded`
    devs=`getdevs`
    for dev in $devs; do
      if hasstate $dev faulty; then
        if hasstate $dev write_mostly; then
          WRITE_MOSTLY=" -W"
        else
          WRITE_MOSTLY=""
        fi
        CMD="mdadm /dev/$MD -r /dev/$dev -a$WRITE_MOSTLY /dev/$dev"
        echo $CMD
        if [ "$SALPACK_FORCE" ]; then
          $CMD
        fi
      fi
    done
  else
    echo "WARNING: $MD is not an mdadm device!"
  fi
done

if [ "$SALPACK_WATCH" ]; then
  echo "Watch will start in 3 seconds ..."
  sleep 3
  watch cat /proc/mdstat
else
  echo "watch cat /proc/mdstat"
fi
