123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #!/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 ioping.
- # 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
- usage="$(basename "$0") [install] [-h] [-e]
- where:
- install install ioping binary
- -e, --env path to environment file (defaults to '/etc/netdata/.environment'
- -h show this help text"
- INSTALL=0
- ENVIRONMENT_FILE="/etc/netdata/.environment"
- while :; do
- case "$1" in
- -h | --help)
- echo "$usage" >&2
- exit 1
- ;;
- install)
- INSTALL=1
- shift
- ;;
- -e | --env)
- ENVIRONMENT_FILE="$2"
- shift 2
- ;;
- -*)
- echo "$usage" >&2
- exit 1
- ;;
- *) break ;;
- esac
- done
- if [ "$INSTALL" == "1" ]
- then
- [ "${UID}" != 0 ] && echo >&2 "Please run me as root. This will install a single binary file: /usr/libexec/netdata/plugins.d/ioping." && exit 1
- source "${ENVIRONMENT_FILE}" || exit 1
- run() {
- printf >&2 " > "
- printf >&2 "%q " "${@}"
- printf >&2 "\n"
- "${@}" || exit 1
- }
- download() {
- local git="$(which git 2>/dev/null || command -v git 2>/dev/null)"
- [ ! -z "${git}" ] && run git clone "${1}" "${2}" && return 0
- echo >&2 "Cannot find 'git' in this system." && exit 1
- }
- tmp=$(mktemp -d /tmp/netdata-ioping-XXXXXX)
- [ ! -d "${NETDATA_PREFIX}/usr/libexec/netdata" ] && run mkdir -p "${NETDATA_PREFIX}/usr/libexec/netdata"
- run cd "${tmp}"
- if [ -d ioping-netdata ]
- then
- run rm -rf ioping-netdata || exit 1
- fi
- download 'https://github.com/netdata/ioping.git' 'ioping-netdata'
- [ $? -ne 0 ] && exit 1
- run cd ioping-netdata || exit 1
- INSTALL_PATH="${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ioping"
- run make clean
- run make
- run mv ioping "${INSTALL_PATH}"
- run chown root:"${NETDATA_GROUP}" "${INSTALL_PATH}"
- run chmod 4750 "${INSTALL_PATH}"
- echo >&2
- echo >&2 "All done, you have a compatible ioping now at ${INSTALL_PATH}."
- echo >&2
- 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 ioping.plugin under a different name
- # to have multiple ioping 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@"
- # the netdata directory for internal binaries
- [ -z "${NETDATA_PLUGINS_DIR}" ] && NETDATA_PLUGINS_DIR="@pluginsdir_POST@"
- # -----------------------------------------------------------------------------
- # configuration options
- # can be overwritten at /etc/netdata/ioping.conf
- # the ioping 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
- ioping="${NETDATA_PLUGINS_DIR}/ioping"
- # the destination to ioping
- destination=""
- # the request size in bytes to ping the disk
- request_size="4k"
- # ioping options
- ioping_opts="-T 1000000"
- # -----------------------------------------------------------------------------
- # 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}'."
- elif [[ $CONFIG =~ ^$NETDATA_USER_CONFIG_DIR ]]; then
- warning "Cannot find file '${CONFIG}'."
- fi
- done
- if [ -z "${destination}" ]
- then
- fatal "destination is not configured - nothing to do."
- fi
- if [ ! -f "${ioping}" ]
- then
- fatal "ioping command is not found. Please set its full path in '${NETDATA_USER_CONFIG_DIR}/${plugin}.conf'"
- fi
- if [ ! -x "${ioping}" ]
- then
- fatal "ioping command '${ioping}' is not executable - cannot proceed."
- fi
- # the ioping options we will use
- options=( -N -i ${update_every} -s ${request_size} ${ioping_opts} ${destination} )
- # execute ioping
- info "starting ioping: ${ioping} ${options[*]}"
- exec "${ioping}" "${options[@]}"
- # if we cannot execute ioping, stop
- fatal "command '${ioping} ${options[*]}' failed to be executed (returned code $?)."
|