[root@rhldaph1 ~]# cat collect_lparinfo_linux.sh
#!/bin/bash
#set -x
#@(#) Collect LPAR info on Linux servers
########################################################################
# verion 1.1 10-03-2016 Manu
dir=`dirname $0`
#. $dir/.env
logpath=/tmp
#log_serial=$logpath/list_serial_disk_lpar.txt
listvg=$logpath/map_disk
host_name=$(hostname -s)
rm -f $logpath/map_disk* $logpath/lshw.txt
lshw > $logpath/lshw.txt
serialsrv=$(cat $logpath/lshw.txt | grep serial | grep IBM | head -1 | sed "s/.*IBM,//" | rev | cut -c1-7 | rev)
lpar_id=$(lparstat -i | grep "Partition Number" | cut -d':' -f2- | awk '{print $1}')
delim=':' # Field delimiter
#------------------------------------------------
analyse_uuid ()
{
diskfull=$(echo $1 | cut -d':' -f2- | sed -e 's/;//g' -e 's/://g' | cut -c5-)
manufacturer=$(echo $diskfull | sed 's/fcp//' | rev | sed 's/[0-9]/\ /g' | awk '{print $1}' | rev)
if [ "$manufacturer" == "HITACHI" ]
then
serial=$(echo $diskfull | cut -c1-8)
hexadiskid=$(echo $diskfull | cut -c9-12)
diskid=$(printf "%04d\n" 0x$hexadiskid)
else
if [ "$manufacturer" == "IBM" ]
then
serial=$(echo $diskfull | cut -c2-29)
diskid=$(echo $diskfull | cut -c30-33)
else
if [ "$manufacturer" == "DataCore" ]
then
serial="NA" # $(lscfg -vpl $hdisk | grep "Device Specific" | grep "(Z0)" | sed 's/\./\ /g' | rev | awk '{print $1}' | rev)
diskid="NA"
else
if [ "$manufacturer" == "NVDISK" ]
then
unset diskid
serial="NA"
diskid=$(echo $diskfull | cut -c1-32 | tr 'A-Z' 'a-z')
else
serial="NA"
diskid="NA"
fi
fi
fi
fi
}
#------------------------------------------------
listvgs ()
{
# List zpool and disks
if [ -e /sbin/zpool ]
then
zpool status 2> /dev/null | awk '{print $1";"$2}' | sed '/^;/ s//\n/' | egrep "^sd|^mpath|^pool" > $listvg.tmp
for line in $(cat $listvg.tmp | egrep -v "^NAME;|^errors:|^state:|^state:|^scan:|^config:" | sed '/^$/d')
do
if [ $(echo $line | grep -q '^pool:'; echo $?) -eq 0 ]
then
poolname=$(echo $line | cut -d':' -f2- | sed 's/;//g')
else
if [ $(echo $line | grep -vq "^$poolname;"; echo $?) -eq 0 ]
then
hdisk=$(echo $line | cut -d';' -f1)
device=$(ls /dev/$hdisk /dev/mapper/$hdisk 2>/dev/null)
echo ";$device;:"$poolname
fi
fi
done
fi
# List VG and disks
pvs 2> /dev/null | awk '{print $1,$2}' | grep -v '^PV ' | while read dsk vg
do
hdisk=$(echo $dsk | cut -d '-' -f1 | sed 's/[0-9-]//g')
echo ";"$hdisk";:"$vg
done
}
#------------------------------------------------
listmapth ()
{
for line in $(multipath -ll | egrep -v "size=|policy=" | awk '{print $1";"$2";"$3}')
do
if [ $(echo $line | grep -q '^mpath' ; echo $?) -eq 0 ]
then
mpathname=$(echo $line | cut -d';' -f1)
else
dsk=$(echo $line | cut -d';' -f3)
echo ";/dev/mapper/"$mpathname";/dev/"$dsk";"
fi
done
}
#------------------------------------------------
listhw ()
{
for line in $(cat $logpath/lshw.txt | tr '\*\-' '\n' | awk -v RS='' -v ORS='\n\n' '/disk/' | egrep 'disk|description|bus|logical|serial|size' | awk '{print $1,$2,$3,$4}' | sed 's/\ /\;/g' | sed 's/$/:/')
do
begin=$(echo $line | cut -d':' -f1 | sed 's/;//g')
case "$begin" in
"disk" ) hdisk=$(echo $line | cut -d':' -f1 | sed 's/;//g') ;;
"businfo" ) type=$(echo $line | cut -d':' -f2- | cut -d'@' -f1 | sed -e 's/://' -e 's/;//g' | sed 's/scsi/vscsi/')
address=$(echo $line | cut -d':' -f2- | cut -d'@' -f2 | sed 's/;//g') ;;
"logicalname") sdisk=$(echo $line | cut -d':' -f2- | sed -e 's/;//g' -e 's/://g') ;;
"serial" ) diskuuid=$(echo $line | cut -d':' -f2- | sed 's/;//g')
analyse_uuid $line ;;
"size" ) size=$(echo $line | cut -d';' -f2)
if [ $(echo $size | grep -q GiB; echo $?) -eq 0 ]
then
sz=$(echo $size | sed 's/GiB//')
(( disksz = sz * 1024 ))
fi ;;
esac
if [ $(echo $line | grep -q '^size:'; echo $?) -eq 0 ]
then
pvid=NA
if [ $(grep -q ";$sdisk;" $listvg.disks_vgs; echo $?) -eq 0 ]
then
vg=$(grep ";$sdisk;" $listvg.disks_vgs | rev | cut -d':' -f1 | rev)
else
vg=novg
fi
hdisk=$(grep ";$sdisk;" $listvg.disks_vgs | cut -d';' -f2 | rev | cut -d'/' -f1 | rev)
if [ "$hdisk" = "" ]
then
hdisk=$(grep ";$sdisk;" $listvg.mpaths | cut -d';' -f2 | rev | cut -d'/' -f1 | rev)
fi
if [ "$hdisk" != "" ]
then
echo "$host_name${delim}$serialsrv${delim}$lpar_id${delim}$hdisk${delim}$pvid${delim}$vg${delim}$serial${delim}$diskid${delim}$type${delim}$manufacturer${delim}$disksz${delim}$serial$diskid"
fi
fi
done
}
#------------------------------------------------
mergevg ()
{
for line in $(cat $listvg.poolvgs)
do
hdisk=$(echo $line | cut -d':' -f1)
vg=$(echo $line | cut -d':' -f2)
if [ $(grep -q "$hdisk" $listvg.mpaths; echo $?) -eq 0 ]
then
alldsk=$(cat $listvg.mpaths | grep "$hdisk" | sed 's/;/\ /g' | tr ' ' '\n' | awk '{print $1}' | sed '/^$/d' | sort -u | tr '\n' ';' | sed 's/^/;/')
echo $alldsk":"$vg
else
echo $hdisk":"$vg
fi
done
}
#------------------------------------------------
suppress_multiples ()
{
for line in $(cat $listvg.disks | cut -d':' -f1-4 | sort -u)
do
if [ $(grep "^$line:" $listvg.disks | wc -l) -gt 1 ]
then
if [ $(grep "^$line:" $listvg.disks | grep -v ':novg:' | wc -l) -ge 1 ]
then
grep "^$line:" $listvg.disks | grep -v ':novg:' | head -1
else
grep "^$line:" $listvg.disks | head -1
fi
else
grep "^$line:" $listvg.disks
fi
done
}
###########################################################################
#
# main ()
#
###########################################################################
listmapth > $listvg.mpaths
listvgs > $listvg.poolvgs
mergevg > $listvg.disks_vgs
listhw | sort -u > $listvg.disks
suppress_multiples | tee $listvg.final