From 8d941d04d07322751a3fa6ad0a813082b0526faa Mon Sep 17 00:00:00 2001 From: Artem Sheremet Date: Mon, 23 Jul 2012 19:29:33 +0300 Subject: [PATCH] Adding simple and useful ping plugin --- plugins/network/ping/ping | 98 +++++++++++++++++++++++++++++ plugins/network/ping/ping-year.png | Bin 0 -> 25385 bytes 2 files changed, 98 insertions(+) create mode 100755 plugins/network/ping/ping create mode 100644 plugins/network/ping/ping-year.png diff --git a/plugins/network/ping/ping b/plugins/network/ping/ping new file mode 100755 index 00000000..b56d6ac9 --- /dev/null +++ b/plugins/network/ping/ping @@ -0,0 +1,98 @@ +#!/bin/bash + +# ping revision 2 (Jul 2012) +# +# This plugin shows ping statistics for several hosts on a single graph +# +# Configuration: +# Add [ping] section with 'hosts' set to space-separated list of hostnames or addresses. +# You can prefix host name with ':' to change IP resolution mode, +# e.g. 'AAAA:domain.tld' will request IPv6 record. +# Always prefix IPv6 addresses with 'AAAA:' (internal limitation). +# +# Dependencies: +# host util is required +# +# OS: +# Linux +# +# Author: Artem Sheremet +# + +function normalize() { + echo ${1//[^a-zA-Z0-9]/_} +} + +function host_type() { + case $1 in + *:*) + echo ${1/:*/} + ;; + *) + echo A + ;; + esac +} + +function host_name() { + echo "${1/*:/}" +} + +function ipof() { + host -t $(host_type $1) $(host_name $1) | + sort | grep -Eo 'address .*' | cut -d' ' -f2 | head -1 +} + +if [[ "$1" == "config" ]]; then + echo 'graph_title Ping statistics +graph_vlabel Time,ms +graph_category network +graph_info ping statistics for several hosts' + for host in $hosts; do + echo "$(normalize $host).label $(host_name $host) ($(ipof $host))" + done + exit 0 +fi + +SYNC_FILE=/tmp/munin-ping-sync +echo -n >"$SYNC_FILE" + +COUNT=0 +for host in $hosts; do + { + case $(host_type $host) in + AAAA) + PING=ping6 + ;; + *) + PING=ping + ;; + esac + TIME=$($PING -w 1 -c 1 `host_name $host` | awk ' + BEGIN { + found = 0 + t = 0 + } + + $1 == "rtt" { found = 1; t = $4; } + + END { + if (found == 1) { + split(t, parts, "/"); + print parts[1] + } else { + print "U" + } + } + ') + + echo $(normalize $host).value $TIME + echo ok >>"$SYNC_FILE" + } & + let COUNT=$COUNT+1 +done + +# wait for background processes to finish +while [ $(wc -l <"$SYNC_FILE") -lt $COUNT ]; do + sleep 0.2 +done diff --git a/plugins/network/ping/ping-year.png b/plugins/network/ping/ping-year.png new file mode 100644 index 0000000000000000000000000000000000000000..a070224e41f1efdbe419c78973f69740c903a376 GIT binary patch literal 25385 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