For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

How find offline and unknown VIPs, Pools, and Pools in iRules

Problem this snippet solves:

I needed a way to search our F5s for offline and unknown VIPs. If a VIP was offline or unknown. I needed to list out the VIP, it's pool, and it's members.

Also if a VIP has an iRule configured, it will search the iRule and gather any pools defined in it and give you stats on them as well.

How to use this snippet:

simply put this script on the LTM in any directory and run it.

Open with Excel, change Excel to delimit the file on a PIPE "|" and it will format correctly.

Code :

#!/bin/bash

##########################################################################
# Find Offline and Unknown VIPs
# Gather why VIPs are down
# IF VIP is down due to pool, gather pool and pool member info
# if VIP is unknown due to iRule Get pools in iRule and gather member info
###########################################################################

##########
#FUNCTIONS
##########
getVIPArray() {
getlines="$(wc -l $1)"
linecount=$(echo $getlines | awk '{print $1}')
z=1
viparr=() # Create array

while IFS= read -r line # Read a line
do
echo -ne "$((100*$z/$linecount))% Complete\r"
viparr+=("$line") # Append line to the array
let z=$z+1
done < "$1"
viparr+=(" ")
}

getRuleArray() {
getlines="$(wc -l $1)"
linecount=$(echo $getlines | awk '{print $1}')
z=1
rulearr=() # Create array
while IFS= read -r line # Read a line
do
echo -ne "$((100*$z/$linecount))% Complete\r"
rulearr+=("$line") # Append line to the array
let z=$z+1
done < "$1"
rulearr+=(" ")
}
contains() {
  local string=$1 substring=$2
  [[ $string = *"$substring"* ]]
}
###############
#END FUNCTIONS
###############

############
#MAIN SCRIPT
############

# SETTING SOME VARIABLES FOR INPUT / OUTPUT FILES

vipfile="/tmp/vipdetails.txt"
poolfile="/tmp/pooldetails.txt"
rulefile="/tmp/ruledetails.txt"
outfile="/tmp/vipdetails-csv.txt"

#find F5 version 

# NOTE - ENABLE BEFORE DOING LIVE

version=$(tmsh show sys version | grep -v Sys::Version | grep Version | awk 'BEGIN{FS="Version"}{print $2}' | awk 'BEGIN{FS="."}{print $1}')

#get show details on VIPs and Pool, and get iRule configurations

# **************************************
# **************************************
# UNCOMMENT TMSH COMMANDS BELOW FOR THIS TO WORK LIVE
# **************************************
# **************************************


echo "*********************"
echo "***GATHERING VIP INFO"
echo "*****PLEASE WAIT*****"
echo "*********************"
echo ""

# NOTE - WRITE IF STATEMENT TO SWITCH COMMAND BASED ON VERSION
if [[ $version == *"10"* ]];then 
#v10
 $(nice tmsh -q show ltm virtual all detail field-fmt  | egrep -A1 "server.status|ltm virtual|rules {|pools {" | egrep -v "pools|rules|clientside|}|--" > /tmp/vipdetails.txt)
else
#v11
$(nice tmsh -q show ltm virtual all detail field-fmt  | egrep -A1 "status.availability-state|enabled-state|ltm virtual|rules {|pools {" | egrep -v "pools {|rules {|actual-pva|            status|--" > /tmp/vipdetails.txt)
fi

#need to put empty line at bottom of file for later use
 echo " " >> /tmp/vipdetails.txt
getVIPArray $vipfile 

echo "***********************"
echo "***GATHERING iRULE INFO"
echo "******PLEASE WAIT******"
echo "***********************"
echo ""

 tmsh -q list ltm rule > /tmp/ruledetails.txt
#need to put empty line at bottom of file for later use
 echo " " >> /tmp/ruledetails.txt
getRuleArray $rulefile


echo "********************"
echo "**SORTING VIP FILE**"
echo "****PLEASE WAIT*****"
echo "********************"
echo ""

newvip=()
count=${#viparr[@]}

i=0
z=1
while [ $i -le $count ];
do
echo -ne "$((100*$z/$count))% Complete\r"
if [[ ${viparr[$i]} == *"ltm virtual"* ]];then
newvip+=("${viparr[$i]}")
t=$i+1
until [[ ${viparr[$t]} == *"ltm virtual"* ]] || [[ ${viparr[$t]} == " " ]];
do
newvip+=("${viparr[$t]}")
let t=$t+1
done

newvip+=(" ")
fi
let i=$i+1
let z=$z+1
done

echo "**********************"
echo "**SORTING iRULE FILE**"
echo "*****PLEASE WAIT******"
echo "**********************"
echo ""

newrule=()
count=${#rulearr[@]}
i=0
z=1
while [ $i -le $count ];
do
echo -ne "$((100*$z/$count))% Complete\r"
if [[ ${rulearr[$i]} == *"ltm rule"* ]];then
newrule+=("${rulearr[$i]}")
t=$i+1
until [[ ${rulearr[$t]} == *"ltm rule"* ]] || [[ ${rulearr[$t]} == " " ]];
do
newrule+=("${rulearr[$t]}")
let t=$t+1
done

newrule+=(" ")
fi
let i=$i+1
let z=$z+1
done


rulecount=${#newrule[@]}

echo "********************************"
echo "FINDING OFFLINE AND UNKNOWN VIPS"
echo "***********PLEASE WAIT**********"
echo "********************************"
echo ""

count=${#newvip[@]}

i=0
z=1
offline=()
unknown=()
while [ $i -le $count ];
do
echo -ne "$((100*$z/$count))% Complete\r"
#find offline VIPs and put them into offline array
if [[ ${newvip[$i]} == *"ltm virtual"* ]];then
if [[ ${newvip[$i+1]} == *"availability-state offline"* ]] || [[ ${newvip[$i+2]} == *"availability-state offline"* ]] || [[ ${newvip[$i+3]} == *"availability-state offline"* ]];then
t=$i
until [[ ${newvip[$t]} == " " ]];
do
offline+=("${newvip[$t]}")
let t=$t+1
done
offline+=(" ")
fi
fi 
#find unknown VIPs and put them into unknown array
if [[ ${newvip[$i]} == *"ltm virtual"* ]];then
if [[ ${newvip[$i+1]} == *"availability-state unknown"* ]] || [[ ${newvip[$i+2]} == *"availability-state unknown"* ]] || [[ ${newvip[$i+3]} == *"availability-state unknown"* ]];then
t=$i
until [[ ${newvip[$t]} == " " ]];
do
unknown+=("${newvip[$t]}")
let t=$t+1
done
unknown+=(" ")
fi
fi 
let i=$i+1
let z=$z+1
done


echo "**********************"
echo "SEARCHING OFFLINE VIPS"
echo "*****PLEASE WAIT******"
echo "**********************"
echo ""

count=${#offline[@]}
i=0
z=1
while [ $i -le $count ];
do
echo -ne "$((100*$z/$count))% Complete\r"
if [[ ${offline[$i]} == *"ltm virtual"* ]];then

#find vip name
vip=$(echo ${offline[$i]} | awk 'BEGIN{FS="{"}{print $1}' | awk 'BEGIN{FS="ltm virtual"}{print $2}')
#find reason
t=$i
until [[ ${offline[$t]} == *"-reason"* ]];
do
let t=$t+1
done
reason=$(echo ${offline[$t]} | awk 'BEGIN{FS="-reason"}{print $2}')
#write out vip down and reason
state=$(echo ${offline[$t-1]} | awk 'BEGIN{FS="-state"}{print $2}')
echo "$vip|OFFLINE|$state|$reason" >> $outfile

#find if vip has rule and pool
t=$i
hasrule=0
haspool=0
until [[ ${offline[$t]} == " " ]];
do
if [[ ${offline[$t]} == *"ltm virtual"* ]];then
if [[ ${offline[$t+1]} != *":"* ]] && [[ ${offline[$t+1]} != *"-state"* ]];then
haspool=1
fi
elif [[ ${offline[$t]} == *":"* ]];then
hasrule=1
else
:

fi

let t=$t+1
done

#if VIP has both pool and rule
if [[ $haspool == 1 ]] && [[ $hasrule == 1 ]];then
### POOL SECTION ###
pool=$(echo ${offline[$i+1]} | awk 'BEGIN{FS="{"}{print $1}')
#strip spaces
pool=$(echo $pool | sed -e 's/^[ \t]*//')
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(tmsh show ltm pool $pool detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$pool|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
### END POOL SECTION ###
### RULE SECTION ###
if [[ ${offline[$i+1]} == *":"* ]] || [[ ${offline[$i+2]} == *":"* ]];then
if [[ ${offline[$i+1]} == *":"* ]];then
rule=$(echo ${offline[$i+1]} | awk 'BEGIN{FS=":"}{print $1}')
fi
if [[ ${offline[$i+2]} == *":"* ]];then
rule=$(echo ${offline[$i+2]} | awk 'BEGIN{FS=":"}{print $1}')
fi
#strip spaces
rule=$(echo $rule | sed -e 's/^[ \t]*//')
echo "|$rule|iRULE" >> $outfile
#search newrule array for iRule config
a=0
while [ $a -le $rulecount ];
do
if contains "${newrule[$a]}" "$rule";then
t=$a+1
#find all unique pool names in rule
rulepool=()
until [[ ${newrule[$t]} == *"ltm rule"* ]] || [[ ${newrule[$t]} == *"END OF RULE FILE"* ]];
do
if [[ ${newrule[$t]} == *"pool "* ]];then
#ignore commented lines
if [[ ${newrule[$t]} == *"# "* ]];then
:
else
#extract pool name from line
pool=$(echo ${newrule[$t]} | awk 'BEGIN{FS="pool "}{print $2}' | awk '{print $1}' )
if [[ $pool == *"}"* ]];then
pool=$(echo $pool | awk 'BEGIN{FS="}"}{print $1}')
fi
#strip spaces
rulepool+=($(echo $pool | sed -e 's/^[ \t]*//'))
fi
fi
let t=$t+1
done

#find unique pool names

uniqpools=($(for p in  "${rulepool[@]}" ; do  echo "$p" ; done | sort -u))
rulepoolcount=${#uniqpools[@]}
echo "|RULE HAS $rulepoolcount UNIQUE POOLS" >> $outfile
for helper in "${uniqpools[@]}";
do
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q show ltm pool $helper detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$helper|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
done
fi
let a=$a+1
done
fi
### END RULE SECTION ###

elif [[ $haspool == 0 ]] && [[ $hasrule == 1 ]];then
### RULE SECTION ###
if [[ ${offline[$i+1]} == *":"* ]] || [[ ${offline[$i+2]} == *":"* ]];then
if [[ ${offline[$i+1]} == *":"* ]];then
rule=$(echo ${offline[$i+1]} | awk 'BEGIN{FS=":"}{print $1}')
fi
if [[ ${offline[$i+2]} == *":"* ]];then
rule=$(echo ${offline[$i+2]} | awk 'BEGIN{FS=":"}{print $1}')
fi
#strip spaces
rule=$(echo $rule | sed -e 's/^[ \t]*//')
echo "|$rule|iRULE" >> $outfile
#search newrule array for iRule config
a=0
while [ $a -le $rulecount ];
do
if contains "${newrule[$a]}" "$rule";then
t=$a+1
#find all unique pool names in rule
rulepool=()
until [[ ${newrule[$t]} == *"ltm rule"* ]] || [[ ${newrule[$t]} == *"END OF RULE FILE"* ]];
do
if [[ ${newrule[$t]} == *"pool "* ]];then
#ignore commented lines
if [[ ${newrule[$t]} == *"# "* ]];then
:
else
#extract pool name from line
pool=$(echo ${newrule[$t]} | awk 'BEGIN{FS="pool "}{print $2}' | awk '{print $1}' )
if [[ $pool == *"}"* ]];then
pool=$(echo $pool | awk 'BEGIN{FS="}"}{print $1}')
fi
#strip spaces
rulepool+=($(echo $pool | sed -e 's/^[ \t]*//'))
fi
fi
let t=$t+1
done

#find unique pool names

uniqpools=($(for p in  "${rulepool[@]}" ; do  echo "$p" ; done | sort -u))
rulepoolcount=${#uniqpools[@]}
echo "|RULE HAS $rulepoolcount UNIQUE POOLS" >> $outfile
for helper in "${uniqpools[@]}";
do
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q show ltm pool $helper detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$helper|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
done
fi
let a=$a+1
done
fi
### END RULE SECTION ###

elif [[ $haspool == 1 ]];then
### POOL SECTION ###
pool=$(echo ${offline[$i+1]} | awk 'BEGIN{FS="{"}{print $1}')
#strip spaces
pool=$(echo $pool | sed -e 's/^[ \t]*//')
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q  show ltm pool $pool detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$pool|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
### END POOL SECTION ###

else
echo "|HAS NO POOL DEFINED" >> $outfile
fi
fi
let i=$i+1
let z=$z+1
done


echo "**********************"
echo "SEARCHING UNKNOWN VIPS"
echo "*****PLEASE WAIT******"
echo "**********************"
echo ""

count=${#unknown[@]}
i=0
z=1
while [ $i -le $count ];
do
echo -ne "$((100*$z/$count))% Complete\r"
if [[ ${unknown[$i]} == *"ltm virtual"* ]];then

#find vip name
vip=$(echo ${unknown[$i]} | awk 'BEGIN{FS="{"}{print $1}' | awk 'BEGIN{FS="ltm virtual"}{print $2}')
#find reason
t=$i
until [[ ${unknown[$t]} == *"-reason"* ]];
do
let t=$t+1
done
reason=$(echo ${unknown[$t]} | awk 'BEGIN{FS="-reason"}{print $2}')
#write out vip down and reason
state=$(echo ${unknown[$t-1]} | awk 'BEGIN{FS="-state"}{print $2}')
echo "$vip|UNKNOWN|$state|$reason" >> $outfile

#find if vip has rule and pool
t=$i
hasrule=0
haspool=0
until [[ ${unknown[$t]} == " " ]];
do
if [[ ${unknown[$t]} == *"ltm virtual"* ]];then
if [[ ${unknown[$t+1]} != *":"* ]] && [[ ${unknown[$t+1]} != *"-state"* ]];then
haspool=1
fi
elif [[ ${unknown[$t]} == *":"* ]];then
hasrule=1
else
:

fi

let t=$t+1
done

#if VIP has both pool and rule
if [[ $haspool == 1 ]] && [[ $hasrule == 1 ]];then
### POOL SECTION ###
pool=$(echo ${unknown[$i+1]} | awk 'BEGIN{FS="{"}{print $1}')
#strip spaces
pool=$(echo $pool | sed -e 's/^[ \t]*//')
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q show ltm pool $pool detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$pool|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
### END POOL SECTION ###
### RULE SECTION ###
if [[ ${unknown[$i+1]} == *":"* ]] || [[ ${unknown[$i+2]} == *":"* ]];then
if [[ ${unknown[$i+1]} == *":"* ]];then
rule=$(echo ${unknown[$i+1]} | awk 'BEGIN{FS=":"}{print $1}')
fi
if [[ ${unknown[$i+2]} == *":"* ]];then
rule=$(echo ${unknown[$i+2]} | awk 'BEGIN{FS=":"}{print $1}')
fi
#strip spaces
rule=$(echo $rule | sed -e 's/^[ \t]*//')
echo "|$rule|iRULE"  >> $outfile
#search newrule array for iRule config
a=0
while [ $a -le $rulecount ];
do
if contains "${newrule[$a]}" "$rule";then
t=$a+1
#find all unique pool names in rule
rulepool=()
until [[ ${newrule[$t]} == *"ltm rule"* ]] || [[ ${newrule[$t]} == *"END OF RULE FILE"* ]];
do
if [[ ${newrule[$t]} == *"pool "* ]];then
#ignore commented lines
if [[ ${newrule[$t]} == *"#"* ]];then
:
else
#extract pool name from line
pool=$(echo ${newrule[$t]} | awk 'BEGIN{FS="pool "}{print $2}' | awk '{print $1}' )
if [[ $pool == *"}"* ]];then
pool=$(echo $pool | awk 'BEGIN{FS="}"}{print $1}')
fi
#strip spaces
rulepool+=($(echo $pool | sed -e 's/^[ \t]*//'))
fi
fi
let t=$t+1
done

#find unique pool names

uniqpools=($(for p in  "${rulepool[@]}" ; do  echo "$p" ; done | sort -u))
rulepoolcount=${#uniqpools[@]}
echo "|RULE HAS $rulepoolcount UNIQUE POOLS" >> $outfile
for helper in "${uniqpools[@]}";
do
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(tnice tmsh -q show ltm pool $helper detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$helper|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
done
fi
let a=$a+1
done
fi
### END RULE SECTION ###

elif [[ $haspool == 0 ]] && [[ $hasrule == 1 ]];then
### RULE SECTION ###
if [[ ${unknown[$i+1]} == *":"* ]] || [[ ${unknown[$i+2]} == *":"* ]];then
if [[ ${unknown[$i+1]} == *":"* ]];then
rule=$(echo ${unknown[$i+1]} | awk 'BEGIN{FS=":"}{print $1}')
fi
if [[ ${unknown[$i+2]} == *":"* ]];then
rule=$(echo ${unknown[$i+2]} | awk 'BEGIN{FS=":"}{print $1}')
fi
#strip spaces
rule=$(echo $rule | sed -e 's/^[ \t]*//')
echo "|$rule|iRULE" >> $outfile
#search newrule array for iRule config
a=0
while [ $a -le $rulecount ];
do
if contains "${newrule[$a]}" "$rule";then
t=$a+1
#find all unique pool names in rule
rulepool=()
until [[ ${newrule[$t]} == *"ltm rule"* ]] || [[ ${newrule[$t]} == *"END OF RULE FILE"* ]];
do
if [[ ${newrule[$t]} == *"pool "* ]];then
#ignore commented lines
if [[ ${newrule[$t]} == *"# "* ]];then
:
else
#extract pool name from line
pool=$(echo ${newrule[$t]} | awk 'BEGIN{FS="pool "}{print $2}' | awk '{print $1}' )
if [[ $pool == *"}"* ]];then
pool=$(echo $pool | awk 'BEGIN{FS="}"}{print $1}')
fi
#strip spaces
rulepool+=($(echo $pool | sed -e 's/^[ \t]*//'))
fi
fi
let t=$t+1
done

#find unique pool names

uniqpools=($(for p in  "${rulepool[@]}" ; do  echo "$p" ; done | sort -u))
rulepoolcount=${#uniqpools[@]}
echo "|RULE HAS $rulepoolcount UNIQUE POOLS" >> $outfile
for helper in "${uniqpools[@]}";
do
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q show ltm pool $helper detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$helper|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
done
fi
let a=$a+1
done
fi
### END RULE SECTION ###

elif [[ $haspool == 1 ]];then
### POOL SECTION ###
pool=$(echo ${unknown[$i+1]} | awk 'BEGIN{FS="{"}{print $1}')
#strip spaces
pool=$(echo $pool | sed -e 's/^[ \t]*//')
#search issue tmsh command for pool and find pool stats
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(nice tmsh -q show ltm pool $pool detail | grep -A5 "Ltm::Pool")
commandout+=(" ")
commandcount=0
hasmembers="0"
until [[ ${commandout[$commandcount]} == " " ]];
do
if [[ ${commandout[$commandcount]} == *"Ltm::Pool:"* ]];then
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
echo "|$pool|$state|$reason" >> $outfile
fi
if [[ ${commandout[$commandcount]} == *"Ltm::Pool Member:"* ]];then
hasmembers="1"
state=$(echo ${commandout[$commandcount+4]} | awk 'BEGIN{FS=":"}{print $2}' )
reason=$(echo ${commandout[$commandcount+5]} | awk 'BEGIN{FS=":"}{print $2}' )
ipport=$(echo ${commandout[$commandcount]} | awk 'BEGIN{FS=" "}{print $NF}')
echo "|$ipport|$state|$reason" >> $outfile
fi
let commandcount=$commandcount+1
done
if [[ $hasmembers == "0" ]];then
echo "|NO POOL MEMBERS" >> $outfile
fi
### END POOL SECTION ###

else
echo "|HAS NO POOL DEFINED" >> $outfile
fi
fi
let i=$i+1
let z=$z+1
done

echo "**********************"
echo "CLEANING UP TEMP FILES"
echo "*****PLEASE WAIT******"
echo "**********************"
echo ""

rm -f /tmp/vipdetails.txt
rm -f /tmp/ruledetails.txt


echo "************************************"
echo "*******   SCRIPT COMPLETE    *******"
echo "*****  OUTPUT FILE IS LOCATED ******"
echo "***** /tmp/vipdetails-csv.txt ******"
echo "************************************"
echo ""
Published Aug 19, 2017
Version 1.0

1 Comment

  • Works like charm, you can use the sed to replace PIPE with comma and save the file directly in csv format.

    sed 's/|/,/g' /tmp/vipdetails-csv.txt > /tmp/vipdetails-new.csv