#!/bin/sh
#
# (C) aryzhov@excite.com
#
# Find a good candidate for a second root mirror
# Resync rootdisk to it
# Kill original rootdisk
# Resync back to original and create a nice VTOC
# on both disks, with all volumes visible as disk slices
#

RESYNC_CHECK_SLEEP=240

[ -z "$SI_ROOTDISK"   -o  "$SI_ROOTDISK" = "." ] && {
  echo "
     Can not determine SI_ROOTDISK - exiting
  "
  exit 1
}

[ -d /var/vxvm/tempdb ] || mkdir -p /var/vxvm/tempdb || exit 1
[ -f /var/vxvm/tempdb/rootdg ] ||\
  cp /a/var/vxvm/tempdb/* /var/vxvm/tempdb || echo No TempDB Files

chroot /a /usr/sbin/vxdctl stop 2>&-

VxImportRootdg  >/dev/null 2>&1
vxprint -v | expand | egrep '^v *rootvol *root *ENABLED' || {
  echo "
    Failed to import rootdg - giving up
  "
  exit 0
}

echo
echo Saving the bootblk
cp /a/usr/platform/`uname -i`/lib/fs/ufs/bootblk /a/usr/sbin/installboot /tmp

echo
echo Looking for a root mirror candidate
#
# Better options go later and overwrite the previous ones.
# Ideal is same target on next controller
#
C=`echo $SI_ROOTDISK | cut -dc -f2- | cut -dt -f1`
T=`echo $SI_ROOTDISK | cut -dt -f2- | cut -dd -f1`
D=`echo $SI_ROOTDISK | cut -dd -f2- | cut -ds -f1`
RDISKSZ=`prtvtoc -h /dev/rdsk/${SI_ROOTDISK} | expand | awk '{if($1 == 2  &&  $2 == 5) print $5}'`
RBASE=`echo $SI_ROOTDISK | sed 's/s.$//'`
DISKS="`echo "0\nq\nq" | format | egrep 'c[0-9]*t[0-9]*d[0-9]* *' | grep cyl | grep sec | awk '{print $2}' | grep -v $RBASE`"

echo Installing bootblocks before resync
/tmp/installboot /tmp/bootblk /dev/rdsk/${RBASE}s0

DLIST=""
for DSK in $DISKS ; do
  SZ=`prtvtoc -h /dev/rdsk/${DSK}s2 | expand | awk '{if($1 == 2  &&  $2 == 5) print $5}'`
  [ "$SZ" -eq "$RDISKSZ" ] && DLIST="$DLIST\n$DSK"
done

DISK2=`{
  echo "$DLIST" | egrep -v c"$C"t | grep t"$T"d$D ||\
  echo "$DLIST" | egrep -v c"$C"t | grep t"$T"    ||\
  echo "$DLIST" | egrep -v c"$C"t | grep      d$D ||\
  echo "$DLIST" | egrep -v c"$C"t | grep '0-9]'   ||\
  echo "$DLIST"                   | grep      d$D ||\
  echo "$DLIST"
} | sort -nu | head -1`

[ -z "$DISK2" ] && {
  echo "
    Can not choose the disk for a second root mirror - giving up
  "
  exit 0
}

#
# umount everything under /a which is still on physical disks
#
for i in `mount | grep '^/a' | awk '{print $1}' | sort -ru` ; do
  sleep 5
  umount $i || {
    echo "
      Failed to unmount $i

    "
    # start_shell
    # exit 0
  }
done

for i in `swap -l | grep '^/dev' | awk '{print $1}' | sort -ru` ; do
  sleep 5
  swap -d $i || {
    echo "
      Failed to demove swap on $i
    "
    # exit 0
  }
done

BASE1=`echo $SI_ROOTDISK | cut -ds -f1`
BASE2=`echo $DISK2       | cut -ds -f1`

VOLCOUNT=`vxprint -g rootdg -v | grep '^v' | wc -l`

for ARGS in "rootdisk rootmirr $BASE2 00" "rootmirr rootdisk $BASE1 01" ; do
  echo
  CMD="VxRootMirrMake $ARGS"
  echo Running $CMD ; $CMD

  TMPCOUNT=`vxprint -g rootdg -p | grep '^pl' | grep TEMP | wc -l`
  [ $TMPCOUNT -lt $VOLCOUNT ] && {
    echo "
	ERROR: None or too few plexes resyncing
	exiting
    "
    exit 1
  }

  while ( date ; vxprint | grep TEMP ) ; do
    echo Resynching...
    sleep $RESYNC_CHECK_SLEEP ; echo
  done
  sleep 30
  /etc/vx/bin/vxbootsetup
  [ `echo $ARGS | awk '{print $1}'` = rootdisk ] && {
    echo Killing the original submirror
    VxRootMirrKill rootdisk
  }
  echo
done

vxprint
for d in $SI_ROOTDISK ${BASE2}s2 ; do echo === $d === ; prtvtoc -h /dev/rdsk/$d ; done

echo Checking rootvol ...
for i in `vxprint -v -g rootdg | egrep 'root|fsgen' | awk '{print $2}'` ; do
  fsck  -y /dev/vx/rdsk/rootdg/$i
  # mount -r /dev/vx/dsk/rootdg/$i
done

echo Installing bootblocks after resync
for d in $RBASE $BASE2 ; do /tmp/installboot /tmp/bootblk /dev/rdsk/${d}s0 ; done

