Skip to content

Instantly share code, notes, and snippets.

@komeda-shinji
Created December 13, 2017 08:37
Show Gist options
  • Save komeda-shinji/f20acc440ca89b017947c1620c23a097 to your computer and use it in GitHub Desktop.
Save komeda-shinji/f20acc440ca89b017947c1620c23a097 to your computer and use it in GitHub Desktop.
check_reachable の mtr を使ったバージョン: mtr のバージョンは 0.84 以降が必要
#!/bin/bash
NAGIOS_OK=0
NAGIOS_WARNING=1
NAGIOS_CRITICAL=2
NAGIOS_UNKNOWN=3
PROGNAME="check_reachable"
VERSION="1.0"
MTR=/usr/bin/mtr
print_usage() {
echo "$PROGNAME $VERSION"
echo "Usage:"
echo "$PROGNAME -H TARGET -r hop:ROUTE1[,hop2:ROUTE2[,:ROUTE3]]"
echo " "
echo "Example:"
echo "$PROGNAME -H 8.8.8.8 -r 3:192.168.1.254,192.168.2.254"
}
declare -a ROUTE
while getopts C:dH:m:p:r:TW:w: OPT; do
case "$OPT" in
C) CRIT_RTT="$OPTARG";;
d) DEBUG=1;;
H) TARGET="$OPTARG";;
m) MAXTTL="$OPTARG";;
p) PORT="$OPTARG";;
r) ROUTE[${#ROUTE[@]}]="$OPTARG";;
T) METHOD="-T";;
W) WARN_RTT="$OPTARG";;
w) WAIT="$OPTARG";;
esac
done
if [ -z "$TARGET" ]; then
print_usage
exit $NAGIOS_UNKNOWN
fi
ERRCODE=3
METHOD=${METHOD:-""}
declare -a output
oIFS="$IFS"
IFS=';'
while read MTR_VERSION time OK Hostname hop name last 2>/dev/null
do
output[$hop]="$hop: $name $last"
[ -n "$DEBUG" ] && echo "$hop: $name $last"
if [ "$name" = "???" ]; then
unreachable=$hop
else
unreachable=
fi
done < <( $MTR --csv --show-ips -c 3 ${MAXTTL:+'-m'} $MAXTTL ${WAIT:+'-i'} $WAIT $METHOD ${PORT:+'-P'} $PORT $TARGET 2>&1 )
IFS="$oIFS"
if [ -n "$unreachable" ]; then
echo "ERROR $TARGET: unreachable after hop $((unreachable - 1))"
i=$((unreachable - 3))
if [ $i -le 0 ]; then
i=0
fi
while [ $i -le $unreachable ]; do
echo "${output[$i]}"
i=$((i + 1))
done
exit $NAGIOS_CRITICAL
fi
ERRCODE=$NAGIOS_OK
r=$(host "$TARGET" | awk '/has address/ {print $NF}')
h=${#output[@]}
case "${output[$h]}" in
*"$r"*) ;;
*) [ -n "$MAXTTL" ] && [ $h -eq $MAXTTL ] || { ERRCODE=$NAGIOS_WARNING; ERRMSG="does not reach $TARGET"; };;
esac
k=0
while [ $k -lt ${#ROUTE[@]} ]; do
oIFS="$IFS"
IFS=",$IFS"
set -- ${ROUTE[$k]}
IFS="$oIFS"
found=
declare -a gateways=($@)
for gw in ${gateways[@]}; do
case "$gw" in
*:*)
h=$(expr $gw : '\([1-9][0-9]*\):.*')
r=$(expr $gw : '.*:{0,1}\(.*\)')
;;
*)
r="$gw"
;;
esac
if [ -n "$h" ]; then
case "${output[$h]}" in
*$r*) found=$h;;
*) ERRCODE=$NAGIOS_WARNING; ERRMSG="$h not found in path"; break;;
esac
else
i=0
while [ $i -le ${#output[@]} ]; do
case "${output[$i]}" in
*$r*) found=$i; break;;
esac
i=$((i + 1))
done
fi
done
if [ -z "$found" ]; then
ERRCODE=$NAGIOS_WARNING
ERRMSG="${ROUTE[$k]} not found in path"
break
fi
k=$((k + 1))
done
hop=${#output[@]}
if [ "$ERRCODE" -eq "$NAGIOS_OK" ]; then
rtt=${output[$hop]##*' '}
rttms=$(expr "$rtt" : '\(.*\)...').$(expr "$rtt" : '.*\(...\)')
if [ -n "$CRIT_RTT" ] && [ $rtt -ge "$CRIT_RTT" ]; then
echo "CRITICAL ${output[$hop}]} | hop=$hop;;;; rtt=${rttms}ms;;;;"
ERRCODE=NAGIOS_CRITICAL
elif [ -n "$WARN_RTT" ] && [ $rtt -ge "$WARN_RTT" ]; then
echo "WARNING ${output[$hop]} | hop=$hop;;;; rtt=${rttms}ms;;;;"
ERRCODE=NAGIOS_WARNING
else
echo "OK ${output[$hop]} | hop=$hop;;;; rtt=${rttms}ms;;;;"
fi
else
echo "ERROR $ERRMSG | hop=;;;; rtt=;;;;"
fi
i=1
while [ $i -le ${#output[@]} ]; do
echo "${output[$i]}"
i=$((i + 1))
done
exit $ERRCODE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment