#!/bin/sh 
##
## clone
##
## Takes on-line copy of the running OS to a spare "clone" disk.
## Data is copied via mirroring volumes by Volume Manager
##
## Central assumptions:
## 1) A disk in rootdg is called "clone" (case sensitive match)
## 2) No volumes are defined on "clone"
##
#
#
# 
##### number of slices #####
#tag description 
#0x00 UNASSIGNED 
#0x01 BOOT 
#0x02 ROOT 
#0x03 SWAP 
#0x04 USR 
#0x05 BACKUP 
#0x06 STAND 
#0x07 VAR 
#0x08 HOME 

#flag description 
#0x00 MOUNTABLE 
#0x01 UNMOUNTABLE 
#0x10 READ-ONLY 


# format: volume:slice:clone-volume:tag:flag
# you can add there no more 5 slices ( 0,1,5,6,7 )
VOLUMES="rootvol:0:clone-rootvol:0x01:0x00 \
	swapvol:1:clone-swapvol:0x03:0x01 \
	var:5:clone-var:0x07:0x00 \
	coredump:6:clone-coredump:0x00:0x00" 

admmail="admin@mycompany.ru"


############################
Message()
{
    echo "`date '+%d/%m/%Y %H:%M:%S'` Clonning Failed !!!"
	printf "Subject: `hostname` clone disk problem\n\n Server `hostname`\n $1\n"  | mail $admmail
    exit 1
}




echo `date '+%m/%d/%y %H:%M:%S'` --- Start create disk clone
TargetDiskEnclosure=`vxprint -g rootdg -F"%device_tag" clone`
if [ -z "$TargetDiskEnclosure" ] ; then
echo "WARNING: No disk found matching the name \"clone\"."
echo "Unable to continue."
Message "WARNING: No disk found matching the name clone"
exit 2
fi

vxdisk list ${TargetDiskEnclosure}>/tmp/disk_clone_num$
TargetDisks=`nawk '$2 == "state=enabled" {print substr($1,1,length($1)-2)}' /tmp/disk_clone_num$`
TargetDisk=`echo "$TargetDisks" | while read DISK_LINE
do echo $DISK_LINE;break;done`

PATH=/usr/sbin:/usr/bin:$PATH
echo Name of clone disk: $TargetDiskEnclosure : $TargetDisk

### Removing sundisks
vxprint -rq clone | grep "^pl" | awk '{ print "vxedit -rf rm "$2 }' | /bin/sh

### Initialize disk
echo "Initialize disk $TargetDiskEnclosure as clone"
vxdg -g rootdg rmdisk clone
/usr/lib/vxvm/bin/vxdisksetup -fi $TargetDiskEnclosure
vxdg -g rootdg adddisk clone=$TargetDiskEnclosure || Message "WARNING: Can't add disk $TargetDiskEnclosure as clone to rootdg"

for i in $VOLUMES; do
	VOL=`echo $i| cut -d: -f1`
	SL=`echo $i| cut -d: -f2`
	CVOL=`echo $i| cut -d: -f3`
	TAG=`echo $i| cut -d: -f4`
	FLAG=`echo $i| cut -d: -f5`

	date '+%m/%d/%y %H:%M:%S'

	echo "Make volume $CVOL"

	size=`vxprint -v -q -g rootdg $VOL |awk '{print $5}'`
	vxassist -g rootdg make $CVOL $size clone

	SD=`vxprint  -g rootdg  $CVOL | grep '^sd' | awk '{ print $2 }'`
	PL=`vxprint  -g rootdg  $CVOL | grep '^pl' | awk '{ print $2 }'`


	/usr/lib/vxvm/bin/vxmksdpart -g rootdg $SD $SL $TAG $FLAG

	vxplex -g rootdg -f dis $PL
	vxedit -g rootdg -rf  rm $CVOL

	if [ "$VOL" = 'swapvol' ]; then
		continue
	fi

	date '+%m/%d/%y %H:%M:%S'
	echo "Mirroring $VOL to plex $PL"
	vxplex -g rootdg cp $VOL $PL  || Message "Can't copy  $VOL to plex $PL"

	fsck -y /dev/dsk/${TargetDisk}s${SL}

	if [ $VOL = 'rootvol' ]; then
                cd /usr/platform/`uname -m`/lib/fs/ufs
		installboot bootblk /dev/rdsk/${TargetDisk}s${SL}

		mkdir -p /tmp/_clone/root
		mount /dev/dsk/${TargetDisk}s${SL} /tmp/_clone/root
	fi
done	



##### Tweak system config files #####
## /etc/system
mv /tmp/_clone/root/etc/system /tmp/_clone/root/etc/system.pre_clone
sed -e '/vol_rootdev_is_volume/d' -e '/rootdev:/d' /tmp/_clone/root/etc/system.pre_clone > /tmp/_clone/root/etc/system

## /etc/vfstab
mv /tmp/_clone/root/etc/vfstab /tmp/_clone/root/etc/vfstab.pre_clone
VFSTAB=`cat /tmp/_clone/root/etc/vfstab.pre_clone`

for i in $VOLUMES; do
	VOL=`echo $i| cut -d: -f1`
	SL=`echo $i| cut -d: -f2`
	CVOL=`echo $i| cut -d: -f3`
	TAG=`echo $i| cut -d: -f4`
	FLAG=`echo $i| cut -d: -f5`

	VFSTAB=`printf "$VFSTAB" | /usr/xpg4/bin/sed "s/\/dev\/vx\/dsk\/$VOL[ 	]/\/dev\/dsk\/${TargetDisk}s${SL}	/"  | /usr/xpg4/bin/sed "s/\/dev\/vx\/rdsk\/$VOL[ 	]/\/dev\/rdsk\/${TargetDisk}s${SL}	/"  | /usr/xpg4/bin/sed  "s/\/dev\/vx\/dsk\/rootdg\/$VOL[ 	]/\/dev\/dsk\/${TargetDisk}s${SL}	/"  | /usr/xpg4/bin/sed  "s/\/dev\/vx\/rdsk\/rootdg\/$VOL[ 	]/\/dev\/rdsk\/${TargetDisk}s${SL}	/" `
done

printf "$VFSTAB\n" >  /tmp/_clone/root/etc/vfstab

vxdctl add disk ${TargetDisk}
cp /etc/vx/volboot /tmp/_clone/root/etc/vx/
vxdctl rm disk ${TargetDisk}


### umount tmp space
umount /tmp/_clone/root

echo `date '+%m/%d/%y %H:%M:%S'` --- Create disk clone complete
exit 0


