[root@aixa001]/root/scripts> cat count_path.sh
#!/bin/bash
#set -x
#############################################
#@(#) Count the number of path on disks (multipathing)
#############################################
# version 1.0 10-2019 Manu
#############################################
VERBOSE=0
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
EXITSTATUS=$STATE_UNKNOWN # Default Exit Code as UNKNOWN.
EXITSTATUS=0
EXITOUTPUT=""
logpath=/root/scripts/logs
output=$logpath/path_count.out
cat /dev/null > $output
numberpath=8
# ($execute) && execute=true
os=$(uname -a | awk '{print $1}')
grepp() { [ $# -eq 1 ] && perl -00ne "print if /$1/i" || perl -00ne "print if /$1/i" < "$2";}
count_linux_path()
{
#for disk in $(/usr/sbin/multipath -ll | awk '{print $1}' | grep '^mpath')
#do
# echo $disk $(/usr/sbin/multipath -ll | grep -v "policy=" | grep -v "size=" | sed '/^mpath/i \\n' | grepp $disk | grep -v '^mpath' | grep active | wc -l) | sed 's/\ /;/g' | sed 's/$/;/' | sed "s/$/$numberpath;/" >> $output
#done
#for disk in $(/usr/sbin/multipath -ll | awk '{print $1}' | egrep '^[a-z]|^[A-Z]' | grep -v 'size=')
#do
# echo $disk $(/usr/sbin/multipath -ll | grep -v "policy=" | grep -v "size=" | sed '/^[a-z]/i \\n' | sed '/^[A-Z]/#i \\n' | grepp $disk | grep -v "^$disk" | grep active | wc -l) | sed 's/\ /;/g' | sed 's/$/;/' | sed "s/$/#$numberpath;/" >> $output
#done
# improvement with customized mpath name
list_disk=$(/usr/sbin/multipath -ll | grep -v "policy=" | grep -v "size=" | sed 's/\ /;/g')
for disk in $(echo ${list_disk} | tr ' ' '\n' | egrep '^[a-z]|^[A-Z]' | cut -d';' -f1)
do
echo $disk $(echo ${list_disk} | tr ' ' '\n' | sed '/^[a-z]/i \\n' | sed '/^[A-Z]/i \\n' | grepp $disk | grep -v "^$disk" | grep active | wc -l) | sed 's/\ /;/g' | sed 's/$/;/' | sed "s/$/$numberpath;/" >> $output
done
($verbose) && cat $output
}
count_aix_path()
{
for i in $(lspv | awk '{print $1}')
do
echo $i $(lspath -l $i | grep Enabled | wc -l) | sed 's/\ /;/g' | sed 's/$/;/' | sed "s/$/$numberpath;/" >> $output
done
($verbose) && cat $output
}
verbose=false #preview only
while [ $# -gt 0 ]
do
case "$1" in
-v) verbose=true ;;
esac
shift
done
if [ "$os" = "Linux" ]
then
count_linux_path
else
if [ "$os" = "AIX" ]
then
count_aix_path
else
EXITSTATUS=$STATE_UNKNOWN
EXITOUTPUT="Unknown OS"
fi
fi
if [ "$EXITOUTPUT" = "" ]
then
for line in $(cat $output)
do
curpath=$(echo $line | awk -F ';' '{print $2}')
maxpath=$numberpath
halfpath=$(echo "scale=0;$maxpath/2" | bc)
if [ "$curpath" -lt "$halfpath" ]
then
EXITSTATUS=$STATE_CRITICAL
EXITOUTPUT=$(echo "$EXITOUTPUT $line")
else
if [ "$curpath" -lt "$maxpath" ]
then
if [ "$EXITSTATUS" -lt "$STATE_WARNING" ]
then
EXITSTATUS=$STATE_WARNING
fi
EXITOUTPUT=$(echo "$EXITOUTPUT $line")
fi
fi
done
fi
case "$EXITSTATUS" in
"$STATE_OK" ) EXITOUTPUT="Paths Status OK" ;;
"$STATE_WARNING" ) EXITOUTPUT=$(echo "WARNING: Missing disk paths: $EXITOUTPUT") ;;
"$STATE_CRITICAL" ) EXITOUTPUT=$(echo "CRITICAL: Error disk paths: $EXITOUTPUT") ;;
esac
### EOF SECTION
rm -f $output 2>/dev/null
echo $EXITOUTPUT
exit $EXITSTATUS