|
|
@@ -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
|
|
|
+}
|
|
|
+
|