Author: glen
Date: Sun Oct 12 13:16:18 2008
New Revision: 9906

Modified:
   nagios-notify/trunk/nagios-notify
Log:
- add $(math:expression)

Modified: nagios-notify/trunk/nagios-notify
==============================================================================
--- nagios-notify/trunk/nagios-notify   (original)
+++ nagios-notify/trunk/nagios-notify   Sun Oct 12 13:16:18 2008
@@ -92,6 +92,38 @@
                return s;
        }
 
+       function eval_math(left, op, right) {
+               if (op == "+") {
+                       return left + right;
+
+               } else if (op == "-") {
+                       return left - right;
+
+               } else if (op == "*") {
+                       return left * right;
+
+               } else if (op == "/") {
+                       return left / right;
+
+               }
+       }
+
+       # evaluate mathematical expression
+       function math(expr,   op, left, right) {
+               # find left expression, operator, right expression
+               if (match(expr, "^.*("MATH_OPS")")) {
+                       left = trim(substr(expr, 1, RLENGTH));
+                       right = trim(substr(expr, RSTART + RLENGTH));
+                       # find op from end of left
+                       if (match(left, "("MATH_OPS")$")) {
+                               op = substr(left, RSTART, RLENGTH);
+                               left = substr(left, 1, RSTART - 1);
+                       }
+               }
+
+               return eval_math(int(left), op, int(right));
+       }
+
        function eval_expr(left, op, right) {
                left = unquote(left);
                right = unquote(right);
@@ -99,7 +131,7 @@
                if (op == "==") {
                        return left == right;
 
-               } else if (op == "=~") {
+               } else if (op == "=~" || op == "~=") {
                        return left ~ right;
 
                } else if (op == "!~") {
@@ -130,11 +162,11 @@
                        line = substr(line, 1 + RLENGTH);
 
                        # find left expression, operator, right expression
-                       if (match(line, "^.*("OPS")")) {
+                       if (match(line, "^.*("COND_OPS")")) {
                                left = trim(substr(line, 1, RLENGTH));
                                right = trim(substr(line, RSTART + RLENGTH));
                                # find op from end of left
-                               if (match(left, "("OPS")$")) {
+                               if (match(left, "("COND_OPS")$")) {
                                        op = substr(left, RSTART, RLENGTH);
                                        left = substr(left, 1, RSTART - 1);
                                }
@@ -183,15 +215,17 @@
                        }
                }
 
-               # list of comparision operands
-               CMDS = "if|else|endif"
                # valid operands
-               OPS = "==|=~|!~|!=|>=|<=|>|<";
+               COND_OPS = "==|=~|~=|!~|!=|>=|<=|>|<";
                # valid variables in expression
                # - numbers
                # - strings in quotes
                # - regexps between //
-               VARS = "[0-9]+|\"[^\"]+\"|/[^/]+/";
+               COND_VARS = "[0-9]+|\"[^\"]+\"|/[^/]+/";
+
+               # valid mathematical operands we support
+               MATH_OPS = "\+|-|\*|/"
+               MATH_EXPR = "[0-9]+"
 
                # by default we have no condition set
                _stack_depth = 0;
@@ -205,7 +239,7 @@
                        gsub("\$" var "\$", val);
                }
 
-               if (match($0, "^#(if *("VARS") *("OPS") *("VARS") 
*$|else|endif)")) {
+               if (match($0, "^#(if *("COND_VARS") *("COND_OPS") 
*("COND_VARS") *$|else|endif)")) {
                        process_expr($0);
                        next;
                }
@@ -242,6 +276,15 @@
                        $0 = left urlencode(data) right;
                }
 
+               # $(math:expression)
+               if (match($0, "\$\(math:("MATH_EXPR") *("MATH_OPS") 
*("MATH_EXPR")\)")) {
+                       pos = length("$(math:")
+                       expr = substr($0, RSTART + pos, RLENGTH - pos - 1);
+                       left = substr($0, 0, RSTART);
+                       right = substr($0, RSTART + RLENGTH);
+                       $0 = left math(expr) right;
+               }
+
                # print out
                print;
        }
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to