#!/usr/bin/bash

# Usage: salpack-rebuild-md [--force|-f] [--watch|-w] [-a] [--status|-s]
#        -a is --force & --watch

SYSDIR=/sys/devices/virtual/block

for param in "$@"; do
  if [ "$param" = "--force" -o "$param" = "-f" -o "$param" = "-fw" -o "$param" = "-wf" -o "$param" = "-a" ]; then
    SALPACK_FORCE=1
  fi
  if [ "$param" = "--watch" -o "$param" = "-w" -o "$param" = "-fw" -o "$param" = "-wf" -o "$param" = "-a" ]; then
    SALPACK_WATCH=1
  fi
  if [ "$param" = "--status" -o "$param" = "-s" ]; then
    SALPACK_STATUS=1
  fi
  if [ "$param" = "--check" -o "$param" = "-c" ]; then
    SALPACK_CHECK=1
  fi
done

MDS="`echo $SYSDIR/md* | sed s:$SYSDIR/::g`"

WATCHFILES="/proc/loadavg /proc/mdstat /proc/sys/dev/raid/speed_limit_min /proc/sys/dev/raid/speed_limit_max"
if [ -f /etc/hostname ]; then
  WATCHFILES="/etc/hostname $WATCHFILES"
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 "---------------------------------------------------------------------"

if [ "$SALPACK_CHECK" ]; then
  for MD in $MDS; do
    echo check > /sys/block/$MD/md/sync_action
  done
  watch 'cat /proc/mdstat; grep ^ /sys/block/md*/md/mismatch_cnt'
  exit
fi

SLEEP=0
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 --remove /dev/$dev -a$WRITE_MOSTLY /dev/$dev"
        echo $CMD
        if [ "$SALPACK_FORCE" ]; then
          $CMD
          SLEEP=3
        fi
      fi
    done
  else
    echo "WARNING: $MD is not an mdadm device!"
  fi
done

if [ "$SALPACK_STATUS" ]; then
  sleep 1s
  uptime
  cat $WATCHFILES
fi

if [ "$SALPACK_WATCH" ]; then
  echo "Watch will start in 3 seconds ..."
  sleep $SLEEP
  watch "sed -e 's| (.*/.*)||' -e 's|[0-9]\{3\}K/sec|M/s|' $WATCHFILES"
else
  echo "watch cat $WATCHFILES"
fi
