#!/bin/bash if [[ -z "$1" ]] { if [[ -d environments ]] { setglobal ENVIRONMENTS = $[ls -lt environments/*.json | wc -l] } else { echo "Usage: VIP not specified and can't find environment directory" exit } if sh-expr '$ENVIRONMENTS == 1' { setglobal VIPFILE = 'environments/*.json' } else { echo "Usage: VIP not specified and more than one environment file found" exit } } else { setglobal VIPFILE = "environments/"$1".json" } grep -i vip $VIPFILE|tr -d ':' > /tmp/vips.txt while read V IPADDRESS { setglobal VIP = $[echo $IPADDRESS | tr -d '"' | tr -d ,] if [[ ! -z `which fping` ]] { # fping fails faster than ping setglobal UP = $[fping -aq $VIP | awk '{print $1}] } else { setglobal UP = $[ping -c1 $VIP | grep ttl | awk '{print $4}] } if [[ ! -z "$UP" ]] { setglobal MAC = ''"" setglobal HOST = ''"" # try to lookup via arp, it's fast setglobal MAC = $[arp -n $VIP | grep ether | awk '{print $3}] if [[ -z $MAC ]] { echo "arp lookup of $VIP failed" } else { setglobal HOST = $[grep -i $MAC cluster.txt] } if [[ -n $HOST ]] { echo "$VIP is currently on : $HOST" } else { # current location may not be on same layer 2 network as # VIP, so search by connecting to each known hosts echo "Searching for $VIP host by host" while read HOST MAC IP IP2 DOMAIN ROLE OVERRIDE { setglobal MATCH = $[./nodessh.sh $1 $IP "ip a | grep $(VIP)] if [[ -n $MATCH && $MATCH =~ inet ]] { setglobal HOST = $[grep -i $HOST cluster.txt] echo "$VIP is currently on : $HOST" break } } < cluster.txt } } else { echo "$VIP appears to be down" } } < /tmp/vips.txt rm /tmp/vips.txt