#!/bin/bash

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

SYSDIR=/sys/devices/virtual/block

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
        echo "mdadm /dev/$MD -r /dev/$dev -a$WRITE_MOSTLY /dev/$dev"
      fi
    done
  else
    echo "WARNING: $MD is not an mdadm device!"
  fi
done

echo "watch cat /proc/mdstat"

exit 0
# old code

if [ "$1" ]; then
  mds="`echo $@ | sed 's|/dev/||g'`"
else
  mds="`cat /proc/mdstat | grep ^md | cut -d' ' -f1 | sort`"
fi

for md in $mds; do
  export md
  mdadm --detail /dev/$md | awk '
    $5=="faulty" && $6=="spare" && $7=="writemostly" {
      printf "mdadm /dev/%s -r %s -a -W %s\n", ENVIRON["md"], $7, $7
      next
    }
    $5=="faulty" && $6=="spare" {
      printf "mdadm /dev/%s -r %s -a %s\n", ENVIRON["md"], $7, $7
    }
  '
done
echo "watch cat /proc/mdstat"
