[root@nim]/root/scripts/bin# cat check_mirrorpool.sh
#!/bin/ksh93
#@(#) List Mirror pool compliance
# This script will only display if something is wrong, NOK
# detail output in log file
# Mirrorpool allows mirroring by site, on multiple disk to be sure that each site
# has a complete copy of data, and that each PP copy is located is located on one site
# generate also as cmd file with commands to relocate to be compliant (migratelp)
# v1.0 11-2016
dir=$(dirname $0)
. $dir/.env
EXCLUDE_VG="testvg"
# $configfile will contain a variable: EXCLUDE_VG which is a list of VG in egrep format
[[ -e "$configfile" ]] && { . $configfile; }
logfile=$logpath/check_mirrorpool.out
cur_date=$(date '+%d-%m-%Y %H:%M')
debug=no
#------------------------------------------------
#*****************************************************
# dmsg ()
#
# Display message
#*****************************************************
dmsg()
{
if [ $debug == "yes" ]
then
echo "$1"
fi
}
#------------------------------------------------
#*****************************************************
# usage ()
#
# Display message
#*****************************************************
usage()
{
echo "Usage: "$0
echo "\tNo parameter required"
echo "\tCheck mirroring consistency, and mirrorpool strictness"
echo "\tWill create a command file to relocate LPs in case of bad copies on mirrorpool"
exit 1
}
#------------------------------------------------
#*****************************************************
# list pv and mp ()
#
# List PV and associated Mirror Pools
#*****************************************************
list_pv_mp()
{
cat /dev/null > $logfile.pv
for i in $(lspv | grep -v None | awk '{print $1","$2","$3","$4}')
do
if [[ $(echo $i | cut -d',' -f4) != "" ]]
then
pv=$(echo $i | cut -d',' -f1)
echo "$pv $(lspv $pv | grep POOL | awk '{print $3}')" >> $logfile.pv
fi
done
list_vg_scal="" # list scalable VG that supports MIRRORPOOL
list_vg_std="" # list big and standard VG
for vg in $(lsvg -o | grep -v "caavg_private" | egrep -v "${EXCLUDE_VG}")
do
lsvg $vg | grep POOL > /dev/null 2>&1
if [ $? -eq 0 ]
then
# force to check even if VG not in strictness mode
if [ $(lsvg -P $vg | grep -v '^Physical' | awk '{print $2}' | sort -u | wc -l | awk '{print $1}') -gt 1 ]
then
# Mirror pool defined on the VG then we can check strictness
echo "###### VG: $vg scalable"
list_vg_scal=$(echo $list_vg_scal" "$vg)
else
echo "###### VG: $vg standard"
list_vg_std=$(echo $list_vg_std" "$vg)
fi
else
# Big or normal VG whithout mirror pool
echo "###### VG: $vg standard"
list_vg_std=$(echo $list_vg_std" "$vg)
fi
done
}
#------------------------------------------------
#*****************************************************
# check consistency on Mirror Pools ()
#
# List PV and associated Mirror Pools
#*****************************************************
check_mirror_pool()
{
cat /dev/null > $logfile
for vgs in ${list_vg_scal}
do
OKvg="OK"
lsvg -l $vgs | grep jfs | awk '{print $1}' | while read lv
do
OKlv="OK"
i=1
lslv $lv | grep POOL | grep -v None | cut -d':' -f2 | awk '{print $1}' | while read mp
do
lv[$i]=$mp
let i="($i +1)"
done
lslv -m $lv | awk '{print $1";"$2";"$3";"$4";"$5";"$6";"$7}' | grep -v "PP1" | grep -v "$lv:" > $logfile.map
cat $logfile.map > $logfile.1
for pv in $(lsvg -p $vgs | grep hdisk | awk '{print $1}')
do
mp_pv=$(grep "$pv " $logfile.pv | awk '{print $2}')
cat $logfile.1 | sed "s/;${pv};/;${mp_pv};/g" > $logfile
cat $logfile > $logfile.1
done
cat $logfile | while read line
do
mp1=$(echo $line | awk -F';' '{print $3}')
mp2=$(echo $line | awk -F';' '{print $5}')
lp_nb=$(echo $line | awk -F';' '{print $1}' | sed 's/^0*//g')
first=$(echo $line | awk -F';' '{print $1}')
word=$(grep "^$first;" $logfile.map)
if [[ "$mp1" != "${lv[1]}" ]]
then
OKlv="Nok"
OKvg="Nok"
dmsg $word
hd2=$(echo $word | awk -F';' '{print $5}')
echo "migratelp $lv/$lp_nb/1 $hd2" >> $logfile.cmd
fi
if [[ "$mp2" != "${lv[2]}" ]]
then
OKlv="Nok"
OKvg="Nok"
dmsg $word
hd1=$(echo $word | awk -F';' '{print $3}')
echo "migratelp $lv/$lp_nb/2 $hd1" >> $logfile.cmd
fi
done
echo "LV:$lv $OKlv"
done
strictness=$(lsvg $vgs | grep "MIRROR POOL STRICT" | cut -d':' -f2 | awk '{print $1}')
echo "VG:$vgs MIRRORPOOL: $strictness STATUS: $OKvg"
if [ "$OKvg" == "Nok" ]
then
echo "Mirroring error on host $(hostname -s) $vgs MirrorPool strictness on LV Nok" >> $logname
echo "Relocalize the wrong PP on disks with script $logfile.cmd"
fi
done
}
#------------------------------------------------
check_mirror_disks()
{
cat /dev/null > $logfile
for vgs in ${list_vg_std}
do
OKvg="OK"
copies=$(lsvg -l $vgs | awk '{print $1,$2,$3,$4}' | egrep "jfs|boot|paging" | while read a i j k
do
echo "scale=0;$k/$j" | bc
done | sort -u)
if [ $(echo $copies | tr ' ' '\n' | wc -l) -gt 1 ]
then
OKvg=Nok
echo "Mirror copies are not correct on host $(hostname -s) $vgs Nok" >> $logname
else
if [ "$copies" -gt 1 ]
then
for pvs in $(lsvg -p $vgs | grep -v '^PV_NAME' | grep -v "$vgs" | awk '{print $1}')
do
if [ $(lspv -M $pvs | awk '{print $2}' | cut -d':' -f3 | sed '/^$/d' | rev | sort -u | wc -l | awk '{print $1}') -gt 1 ]
then
echo "PV:$pvs Nok"
OKvg="Nok"
echo "Mirroring error on host $(hostname -s) $vgs $pvs has wrong LV copies" >> $logname
else
echo "PV:$pvs OK"
fi
done
fi
fi
if [ $(lsvg $vgs | grep STALE | rev | cut -d' ' -f1) != "0" ]
then
echo "VG:$vgs STATUS: Nok"
else
echo "VG:$vgs STATUS: $OKvg"
fi
done
rm $logfile.pv $logfile.1 $logfile > /dev/null 2>&1
}
#*****************************************************
# Main ()
#*****************************************************
date > $logname
main ()
{
while [ $# -gt 0 ]
do
case "$1" in
-v) debug=yes;;
-h) usage;;
esac
shift
done
cat /dev/null > $logfile.cmd
list_pv_mp
check_mirror_pool
check_mirror_disks
chmod 400 $logfile.cmd
}
main | tee -a $logname