#!/bin/sh
#
# Make sure all md mirrors are OK
# and all LVM volumes are syncd
#
HOST=`uname -n`
DEF_NMIRR=2

Excludes="
  #
  # All MD mirrors must be 2-way by default,
  # exceptions (one-way) are listed here by host/mountpoint pairs
  # Fill-wildcard "*" is allowed for hostname only
  # Wildcards in mountpoints are not supported
  #

  syb01-cal      /export/space          # Seems like forgotten to attach... but don't touch
  syb01-cor      /export/space          # Seems like forgotten to attach... but don't touch

  syb01-cor      /export/soft           # test metaset on SAN, who cares
  syb01-cor      /export/backup         # test metaset on SAN, who cares
  syb01-cor      /export/sybdata        # test metaset on SAN, who cares
  syb01-cor      /export/archive        # test metaset on SAN, who cares

"

MESS=""

case `uname` in

  SunOS)

    PATH=$PATH:/usr/sbin:/usr/opt/SUNWmd/sbin
    export PATH

    SETS=`metaset | awk '/Set name =/ {print $4}' | sed 's/,//' | sort -u`

    for i in "" $SETS; do

      [ x$i =  x ] && si="";
      [ x$i != x ] && si="-s $i";

      STAT=`metastat $si 2>/dev/null | egrep State | egrep -v 'Block|Device|Dbase|Spare|Okay'`;
      STAT="$STAT\n`metadb $si 2>/dev/null | awk '$1~/[A-Z]/ || $2~/[A-Z]/ || $3~/[A-Z]/'`"
      [ `echo "$STAT" | wc -w` -eq 0 ]  || MESS="$MESS\n$STAT\nMD metastat $si:\n`metastat $si 2>/dev/null`"

      #
      # Check that all mirrors are 2-way
      #
      for m in `metastat $si 2>/dev/null| awk '$2=="Mirror" {print $1}' | sed 's/:$//'`; do
	m=`basename $m`
	[ `metastat $si $m 2>/dev/null | awk '/Submirror of '$m'$|Submirror of '$i'\/'$m'$/ {print $1}' | wc -w` -eq $DEF_NMIRR ] || {

	  #
	  # Oops, this is not a 2-was mirror.. Check Excludes.
	  #
	  [ x$i =  x ] && MPoint=`(df -ka;echo \`swap -l | grep /md/\` swap) | awk '$1~/^\/dev\/md\/dsk\/'$m'$/ {print $NF}'`
	  [ x$i != x ] && MPoint=`df -ka | awk '$1~/^\/dev\/md\/'$i'\/dsk\/'$m'$/ {print $NF}'`

	  echo "$Excludes" | awk '($1=="*"  || $1=="'$HOST'") && $2=="'$MPoint'"' | egrep -s $MPoint  || MESS="$MESS\n\tNot mirrored: $HOST `echo $MPoint`"

	}
      done
    done

    MESS="$MESS\n`(vxprint -p) 2>/dev/null | awk '/^pl / && ( $4!~/^ENABLED$/ || $7!~/^ACTIVE$/ )'`"

    ;;


  AIX)

    MESS=`for i in \`lsvg -L\`; do lsvg -Ll $i | awk '$NF~/\// && $(NF-1)!~/syncd$/'; done`

    for i in `lsvg -L`; do

      #
      # Make sure that all volumes in the group have the same PP per LV ratio,
      # and divide $CURRENT_RESERVE by it
      # (for instance, mirrored VGs  need double reserve)
      #
      R=`for v in \`lsvg -lL $i | awk '$NF~/\// {print $1}'\`; do
	lslv -L \$v | awk '/^LPs:/ {print $4/$2}'
      done | sort -u`

      [ `echo $R | wc -w` -gt 1 ] && MESS="$MESS `uname -n` VG $i not fully mirrored\n"

      R=`echo \`echo "$R" | head -1\``

      echo $R | egrep -s '[0-9]' || "$MESS `uname -n` VG $i"

      #
      # Make sure mirrored VGs have quorum disabled,
      # and unmirrored - enabled
      #
      QUORUM=`lsvg -L $i | awk '/QUORUM:/ {print $NF}'`
      [ $R -eq 1  -a  x"$QUORUM" = x"(Enabled)"  ] || [ $R -gt 1  -a  x"$QUORUM" = x"(Disabled)" ] || { printf "Wrong QUORUM: $i\n"; RC=1; }

      #
      # Make sure that mirrored volumes have different disks in each stripe
      #
      [ $R -eq 2 ] && {
	for v in `lsvg -lL $i | awk '$NF~/\// {print $1}'`; do

	  DUPS=`
	    {
	      lslv -Lm $v | awk '$3~/^hdisk/ {print $3}' | sort -u
	      lslv -Lm $v | awk '$5~/^hdisk/ {print $5}' | sort -u
	    } | sort | uniq -c | awk '/hdisk/ && $1!=1 {print $2}'
	  `

	  [ x"$DUPS"   !=   x ] && MESS="$MESS `uname -n` VG $i same disk in both submirrors of $v \n$DUPS"

	done
      }


    done

    ;;

esac

[ `echo "$MESS" | wc -w` -eq 0 ] && exit 0
printf "Broken or missing mirrors\n$MESS\n"; exit 1
