123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #!/usr/bin/env bash
- # SPDX-License-Identifier: GPL-3.0-or-later
- # netdata
- # real-time performance and health monitoring, done right!
- # (C) 2017 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
- [ -z "${2}" ] && fping_version="5.0" || fping_version="${2}"
- run() {
- printf >&2 " > "
- printf >&2 "%q " "${@}"
- printf >&2 "\n"
- "${@}" || exit 1
- }
- download() {
- local curl="$(which curl 2>/dev/null || command -v curl 2>/dev/null)"
- [ ! -z "${curl}" ] && run curl -s -L "${1}" && return 0
- local wget="$(which wget 2>/dev/null || command -v wget 2>/dev/null)"
- [ ! -z "${wget}" ] && run wget -q -O - "${1}" && return 0
- echo >&2 "Cannot find 'curl' or 'wget' in this system." && 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-${fping_version}" ]
- then
- run rm -rf "fping-${fping_version}" || exit 1
- fi
- download "https://github.com/schweikert/fping/releases/download/v${fping_version}/fping-${fping_version}.tar.gz" | run tar -zxvpf -
- [ $? -ne 0 ] && exit 1
- run cd "fping-${fping_version}" || exit 1
- 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 "${@}"
- }
- # -----------------------------------------------------------------------------
- # store in ${plugin} the name we run under
- # this allows us to copy/link fping.plugin under a different name
- # to have multiple fping plugins running with different settings
- plugin="${PROGRAM_NAME/.plugin/}"
- # -----------------------------------------------------------------------------
- # the frequency to send info to netdata
- # passed by netdata as the first parameter
- update_every="${1-1}"
- # the netdata configuration directory
- # passed by netdata as an environment variable
- [ -z "${NETDATA_USER_CONFIG_DIR}" ] && NETDATA_USER_CONFIG_DIR="@configdir_POST@"
- [ -z "${NETDATA_STOCK_CONFIG_DIR}" ] && NETDATA_STOCK_CONFIG_DIR="@libconfigdir_POST@"
- # -----------------------------------------------------------------------------
- # configuration options
- # can be overwritten at /etc/netdata/fping.conf
- # the fping binary to use
- # 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 5 pings per host per iteration
- ping_every="$((update_every * 1000 / 5))"
- # fping options
- fping_opts="-R -b 56 -i 1 -r 0 -t 5000"
- # -----------------------------------------------------------------------------
- # load the configuration files
- for CONFIG in "${NETDATA_STOCK_CONFIG_DIR}/${plugin}.conf" "${NETDATA_USER_CONFIG_DIR}/${plugin}.conf"
- do
- if [ -f "${CONFIG}" ]
- then
- info "Loading config file '${CONFIG}'..."
- source "${CONFIG}"
- [ $? -ne 0 ] && error "Failed to load config file '${CONFIG}'."
- else
- warning "Cannot find file '${CONFIG}'."
- fi
- done
- if [ -z "${hosts}" ]
- then
- fatal "no hosts configured - nothing to do."
- fi
- if [ -z "${fping}" ]
- then
- fatal "fping command is not found. Please set its full path in '${NETDATA_USER_CONFIG_DIR}/${plugin}.conf'"
- fi
- if [ ! -x "${fping}" ]
- then
- fatal "fping 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 -Q ${update_every} -p ${ping_every} ${fping_opts} ${hosts} )
- # execute fping
- info "starting fping: ${fping} ${options[*]}"
- exec "${fping}" "${options[@]}"
- # if we cannot execute fping, stop
- fatal "command '${fping} ${options[*]}' failed to be executed (returned code $?)."
|