[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