diff options
Diffstat (limited to 'plugins-scripts/utils.sh.in')
-rw-r--r-- | plugins-scripts/utils.sh.in | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/plugins-scripts/utils.sh.in b/plugins-scripts/utils.sh.in new file mode 100644 index 0000000..031c035 --- /dev/null +++ b/plugins-scripts/utils.sh.in @@ -0,0 +1,111 @@ +#! /bin/sh + +STATE_OK=0 +STATE_WARNING=1 +STATE_CRITICAL=2 +STATE_UNKNOWN=3 +STATE_DEPENDENT=4 + +print_revision() { + echo "$1 v$2 (@PACKAGE@ @VERSION@)" + printf '%b' "@WARRANTY@" +} + +support() { + printf '%b' "@SUPPORT@" +} + +# +# check_range takes a value and a range string, returning successfully if an +# alert should be raised based on the range. Range values are inclusive. +# Values may be integers or floats. +# +# Example usage: +# +# Generating an exit code of 1: +# check_range 5 2:8 +# +# Generating an exit code of 0: +# check_range 1 2:8 +# +check_range() { + local v range yes no err decimal start end cmp match + v="$1" + range="$2" + + # whether to raise an alert or not + yes=0 + no=1 + err=2 + + # regex to match a decimal number + decimal="-?([0-9]+\.?[0-9]*|[0-9]*\.[0-9]+)" + + # compare numbers (including decimals), returning true/false + cmp() { awk "BEGIN{ if ($1) exit(0); exit(1)}"; } + + # returns successfully if the string in the first argument matches the + # regex in the second + match() { echo "$1" | grep -E -q -- "$2"; } + + # make sure value is valid + if ! match "$v" "^$decimal$"; then + echo "${0##*/}: check_range: invalid value" >&2 + unset -f cmp match + return "$err" + fi + + # make sure range is valid + if ! match "$range" "^@?(~|$decimal)(:($decimal)?)?$"; then + echo "${0##*/}: check_range: invalid range" >&2 + unset -f cmp match + return "$err" + fi + + # check for leading @ char, which negates the range + if match $range '^@'; then + range=${range#@} + yes=1 + no=0 + fi + + # parse the range string + if ! match "$range" ':'; then + start=0 + end="$range" + else + start="${range%%:*}" + end="${range#*:}" + fi + + # do the comparison, taking positive ("") and negative infinity ("~") + # into account + if [ "$start" != "~" ] && [ "$end" != "" ]; then + if cmp "$start <= $v" && cmp "$v <= $end"; then + unset -f cmp match + return "$no" + else + unset -f cmp match + return "$yes" + fi + elif [ "$start" != "~" ] && [ "$end" = "" ]; then + if cmp "$start <= $v"; then + unset -f cmp match + return "$no" + else + unset -f cmp match + return "$yes" + fi + elif [ "$start" = "~" ] && [ "$end" != "" ]; then + if cmp "$v <= $end"; then + unset -f cmp match + return "$no" + else + unset -f cmp match + return "$yes" + fi + else + unset -f cmp match + return "$no" + fi +} |