#!/bin/sh # # Copyright (c) 2016 Babak Farrokhi. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # # 12-Aug-2015 @farrokhi # This script graphs ICMP RTT to remove given hosts using ping utility. # It uses all IP addresses as source address on given interface. # # Configuration sample: # [multiping_*] # user root # env.interface igb0 # env.hosts "4.2.2.4, ripe.net, 192.168.0.5, 8.8.4.4" # # Magic markers: #%# family=auto #%# capabilities=autoconf suggest SCRIPT_NAME=$(basename $0) SRC=`echo $SCRIPT_NAME | sed -n s/multiping_//p` FPING=`which fping` || exit 1 FSRC=`echo ${SRC} | sed 's/\./_/g'` IPS=`ifconfig ${interface} | awk '/inet /{print $2}' | grep -Ev '^(10|192)\.'` if [ $# -lt 1 ]; then if [ "x${SRC}" == "x" ]; then echo "should run from symlink" exit 1 fi TMPFILE=`mktemp -t multiping` DST=`echo ${hosts} | tr , " "` fname=`echo ${DST} | sed 's/\./_/g'` ${FPING} -A -q -s -i10 -c50 -p 25 -S ${SRC} -t1000 ${DST} 2>&1 | grep ':' | tr '%/,' ' ' | awk ' /xmt/ { name = $1; gsub(/\./, "_", name); printf "rtt_%s.value %0.0f\n", name, $15; printf "loss_%s.value %0.0f\n", name, $9; } ' >> ${TMPFILE} echo "multigraph rtt_${FSRC}" grep ^rtt ${TMPFILE} echo "multigraph loss_${FSRC}" grep ^loss ${TMPFILE} rm ${TMPFILE} elif [ "$1" == "suggest" ]; then for DST in ${IPS}; do echo ${DST} done elif [ "$1" == "autoconf" ]; then if [ "x${hosts}" == "x" ]; then echo "no (env.hosts is not defined)" exit 1 fi if [ "x${interface}" == "x" ]; then echo "no (env.interface is not defined)" exit 1 fi ### check env vars and return no if not set properly echo yes exit 0 elif [ "$1" == "config" ]; then if [ "x${SRC}" == "x" ]; then exit 1 fi echo "multigraph rtt_${FSRC}" echo "graph_title RTT Statistics for ${SRC}" echo "graph_args --lower-limit 0 --base 1000" echo "graph_vlabel milliseconds" echo "graph_category connectivity" echo "graph_info This graph shows ICMP RTT for {$SRC} on interface ${interface} toward multiple destination hosts" COLOR=7 for DST in `echo ${hosts} | tr , " "`; do fname=`echo ${DST} | sed 's/\./_/g'` echo rtt_${fname}.type GAUGE echo rtt_${fname}.draw LINE1 echo rtt_${fname}.min 0 echo rtt_${fname}.colour COLOUR${COLOR} echo rtt_${fname}.label ${DST} COLOR=`expr ${COLOR} + 1` done echo "multigraph loss_${FSRC}" echo "graph_title Packet Loss Statistics for ${SRC}" echo "graph_args --units-exponent 0 -r --upper-limit 100 --lower-limit 0 --base 1000" echo "graph_scale no" echo "graph_vlabel percent" echo "graph_category connectivity" echo "graph_info This graph shows ICMP Packet Loss for source address ${SRC} on interface ${interface} toward multiple destination hosts" COLOR=7 for DST in `echo ${hosts} | tr , " "`; do fname=`echo ${DST} | sed 's/\./_/g'` echo loss_${fname}.type GAUGE echo loss_${fname}.draw LINE2 echo loss_${fname}.min 0 echo loss_${fname}.max 100 echo loss_${fname}.colour COLOUR${COLOR} echo loss_${fname}.label ${DST} COLOR=`expr ${COLOR} + 1` done fi