]> arthur.barton.de Git - netdata.git/blobdiff - plugins.d/fping.plugin
Merge pull request #1414 from ktsaou/master
[netdata.git] / plugins.d / fping.plugin
index fa3b62f577d896bec214ec9a876d5adbcd96483b..3a61ab338005f966d4d596eb67031470317db014 100755 (executable)
@@ -1,6 +1,110 @@
 #!/usr/bin/env bash
 
-me="${0}"
+# netdata
+# real-time performance and health monitoring, done right!
+# (C) 2016 Costa Tsaousis <costa@tsaousis.gr>
+# GPL v3+
+#
+# This plugin requires a latest version of fping.
+# You can compile it from source, by running me with option: install
+
+export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/sbin"
+export LC_ALL=C
+
+if [ "${1}" = "install" ]
+    then
+    [ "${UID}" != 0 ] && echo >&2 "Please run me as root. This will install a single binary file: /usr/local/bin/fping." && exit 1
+
+    run() {
+        printf >&2 " > "
+        printf >&2 "%q " "${@}"
+        printf >&2 "\n"
+        "${@}" || exit 1
+    }
+
+    [ ! -d /usr/src ] && run mkdir -p /usr/src
+    [ ! -d /usr/local/bin ] && run mkdir -p /usr/local/bin
+
+    run cd /usr/src
+
+    if [ -d fping-ktsaou.git ]
+        then
+        run cd fping-ktsaou.git
+        run git pull
+    else
+        run git clone https://github.com/ktsaou/fping.git fping-ktsaou.git
+        run cd fping-ktsaou.git
+    fi
+
+    run ./autogen.sh
+    run ./configure --prefix=/usr/local
+    run make clean
+    run make
+    if [ -f /usr/local/bin/fping ]
+        then
+        run mv -f /usr/local/bin/fping /usr/local/bin/fping.old
+    fi
+    run mv src/fping /usr/local/bin/fping
+    run chown root:root /usr/local/bin/fping
+    run chmod 4755 /usr/local/bin/fping
+    echo >&2
+    echo >&2 "All done, you have a compatible fping now at /usr/local/bin/fping."
+    echo >&2
+
+    fping="$(which fping  2>/dev/null || command -v fping 2>/dev/null)"
+    if [ "${fping}" != "/usr/local/bin/fping" ]
+        then
+        echo >&2 "You have another fping installed at: ${fping}."
+        echo >&2 "Please set:"
+        echo >&2
+        echo >&2 "  fping=\"/usr/local/bin/fping\""
+        echo >&2
+        echo >&2 "at /etc/netdata/fping.conf"
+        echo >&2
+    fi
+    exit 0
+fi
+
+# -----------------------------------------------------------------------------
+
+PROGRAM_NAME="$(basename "${0}")"
+
+logdate() {
+    date "+%Y-%m-%d %H:%M:%S"
+}
+
+log() {
+    local status="${1}"
+    shift
+
+    echo >&2 "$(logdate): ${PROGRAM_NAME}: ${status}: ${*}"
+
+}
+
+warning() {
+    log WARNING "${@}"
+}
+
+error() {
+    log ERROR "${@}"
+}
+
+info() {
+    log INFO "${@}"
+}
+
+fatal() {
+    log FATAL "${@}"
+       echo "DISABLE"
+    exit 1
+}
+
+debug=0
+debug() {
+    [ $debug -eq 1 ] && log DEBUG "${@}"
+}
+
+# -----------------------------------------------------------------------------
 
 # the frequency to send info to netdata
 # passed by netdata as the first parameter
@@ -10,76 +114,57 @@ update_every="${1-1}"
 # passed by netdata as an environment variable
 NETDATA_CONFIG_DIR="${NETDATA_CONFIG_DIR-/etc/netdata}"
 
-# -----------------------------------------------------------------------------
-
-# This plugin requires a special version of fping.
-# Get it from https://github.com/ktsaou/fping
-# and build it, like this:
-#
-# cd /usr/src
-# git clone https://github.com/ktsaou/fping.git fping-netdata.git
-# cd fping-netdata.git
-# ./autogen.sh
-# ./configure --prefix=/usr/local
-# make
-# cp src/fping /usr/local/bin/
-# chown root:root /usr/local/bin/fping
-# chmod 4755 /usr/local/bin/fping
-#
-# Then, create /etc/netdata/fping.conf
-# and set the configuration options given below
-
 # -----------------------------------------------------------------------------
 # configuration options
 # can be overwritten at /etc/netdata/fping.conf
 
 # the fping binary to use
-# we need one that can output netdata friendly info
-fping="$(which fping || command -v fping)"
+# we need one that can output netdata friendly info (supporting: -N)
+# if you have multiple versions, put here the full filename of the right one
+fping="$( which fping 2>/dev/null || command -v fping 2>/dev/null )"
 
 # a space separated list of hosts to fping
+# we suggest to put names here and the IPs of these names in /etc/hosts
 hosts=""
 
 # the time in milliseconds (1 sec = 1000 ms)
-# to ping the hosts - by default 2 pings per iteration
-ping_every="$((update_every * 1000 / 2))"
+# to ping the hosts - by default 5 pings per host per iteration
+ping_every="$((update_every * 1000 / 5))"
 
-# how many retries to make if a host does not respond
-retries=1
+# fping options
+fping_opts="-R -b 56 -i 1 -r 0 -t 5000"
 
 # -----------------------------------------------------------------------------
-
 # load the configuration file
+
 if [ ! -f "${NETDATA_CONFIG_DIR}/fping.conf" ]
 then
-       echo >&2 "${me}: configuration file '${NETDATA_CONFIG_DIR}/fping.conf' not found - nothing to do."
-       echo "DISABLE"
-       exit 1
+       fatal "configuration file '${NETDATA_CONFIG_DIR}/fping.conf' not found - nothing to do."
 fi
 
 source "${NETDATA_CONFIG_DIR}/fping.conf"
 
 if [ -z "${hosts}" ]
 then
-       echo >&2 "${me}: no hosts configued in '${NETDATA_CONFIG_DIR}/fping.conf' - nothing to do."
-       echo "DISABLE"
-       exit 1
+       fatal "no hosts configued in '${NETDATA_CONFIG_DIR}/fping.conf' - nothing to do."
 fi
 
 if [ -z "${fping}" -o ! -x "${fping}" ]
 then
-       echo >&2 "${me}: command '${fping}' is not executable - cannot proceed."
-       echo "DISABLE"
-       exit 1
+       fatal "command '${fping}' is not executable - cannot proceed."
+fi
+
+if [ ${ping_every} -lt 20 ]
+    then
+    warning "ping every was set to ${ping_every} but 20 is the minimum for non-root users. Setting it to 20 ms."
+    ping_every=20
 fi
 
 # the fping options we will use
-options=( -N -l -R -Q ${update_every} -p ${ping_every} -r ${retries} ${hosts} )
+options=( -N -l -Q ${update_every} -p ${ping_every} ${fping_opts} ${hosts} )
 
 # execute fping
 exec "${fping}" "${options[@]}"
 
 # if we cannot execute fping, stop
-echo >&2 "${me}: command '${fping} ${options[@]}' failed to be executed."
-echo "DISABLE"
-exit 1
+fatal "command '${fping} ${options[@]}' failed to be executed."