diff options
author | Alex Griffin <griffin.aj@gmail.com> | 2012-04-18 11:43:13 -0500 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2012-05-29 14:07:37 +0200 |
commit | aab6b8a16c9ec1dfe9d27f70cfbe19281153e306 (patch) | |
tree | 559fa79d29775211b43113fb85874d4fad97550f | |
parent | 252ae618fc6a02ca68872a1262d054a0b7b98fdb (diff) | |
download | monitoring-plugins-aab6b8a16c9ec1dfe9d27f70cfbe19281153e306.tar.gz |
Added check_range shell function to utils.sh.in
-rw-r--r-- | plugins-scripts/utils.sh.in | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/plugins-scripts/utils.sh.in b/plugins-scripts/utils.sh.in index b30b9083..d5013a60 100644 --- a/plugins-scripts/utils.sh.in +++ b/plugins-scripts/utils.sh.in @@ -21,3 +21,88 @@ support() { $ECHO "@SUPPORT@" | sed -e 's/\n/ /g' } + +# check_range takes a value and a range string, returning successfully if an +# alert should be raised based on the range +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 +} + |