]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: config: add predicates "version_atleast" and "version_before" to cond blocks
authorWilly Tarreau <w@1wt.eu>
Thu, 6 May 2021 14:53:26 +0000 (16:53 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 6 May 2021 15:04:45 +0000 (17:04 +0200)
These predicates respectively verify that the current version is at least
a given version or is before a specific one. The syntax is exactly the one
reported by "haproxy -v", though each component is optional, so both "1.5"
and "2.4-dev18-88910-48" are supported. Missing components equal zero, and
"dev" is below "pre" or "rc", which are both inferior to no such mention
(i.e. they are negative). Thus "2.4-dev18" is older than "2.4-rc1" which
is older than "2.4".

doc/configuration.txt
src/cfgparse.c

index 5f60507fd7d72fa8664fecda46eed21f53e4da42..72c4680b1b6f3814fd0de3446fe540a88dd762b0 100644 (file)
@@ -821,6 +821,16 @@ The list of currently supported predicates is the following:
   - streq(<str1>,<str2>)  : returns true only if the two strings are equal
   - strneq(<str1>,<str2>) : returns true only if the two strings differ
 
+  - version_atleast(<ver>): returns true if the current haproxy version is
+                            at least as recent as <ver> otherwise false. The
+                            version syntax is the same as shown by "haproxy -v"
+                            and missing components are assumed as being zero.
+
+  - version_before(<ver>) : returns true if the current haproxy version is
+                            strictly older than <ver> otherwise false. The
+                            version syntax is the same as shown by "haproxy -v"
+                            and missing components are assumed as being zero.
+
 Example:
 
    .if defined(HAPROXY_MWORKER)
@@ -839,6 +849,10 @@ Example:
      .endif
    .endif
 
+   .if version_atleast(2.4-dev19)
+       profiling.memory on
+   .endif
+
 Three other directives are provided to report some status:
 
   - .notice "message"  : emit this message at level NOTICE
index 15e4ad864410f5f2bf1fae391b23987f1d090b84..dead21d8c19e3345dcd8a9c6273f30380889ad31 100644 (file)
@@ -140,6 +140,8 @@ enum cond_predicate {
        CFG_PRED_FEATURE,         // "feature"
        CFG_PRED_STREQ,           // "streq"
        CFG_PRED_STRNEQ,          // "strneq"
+       CFG_PRED_VERSION_ATLEAST, // "version_atleast"
+       CFG_PRED_VERSION_BEFORE,  // "version_before"
 };
 
 struct cond_pred_kw {
@@ -154,6 +156,8 @@ const struct cond_pred_kw cond_predicates[] = {
        { "feature",          CFG_PRED_FEATURE,         ARG1(1, STR)         },
        { "streq",            CFG_PRED_STREQ,           ARG2(2, STR, STR)    },
        { "strneq",           CFG_PRED_STRNEQ,          ARG2(2, STR, STR)    },
+       { "version_atleast",  CFG_PRED_VERSION_ATLEAST, ARG1(1, STR)         },
+       { "version_before",   CFG_PRED_VERSION_BEFORE,  ARG1(1, STR)         },
        { NULL, CFG_PRED_NONE, 0 }
 };
 
@@ -1753,6 +1757,14 @@ static int cfg_eval_condition(char **args, char **err, const char **errptr)
                        ret = strcmp(argp[0].data.str.area, argp[1].data.str.area) != 0;
                        goto done;
 
+               case CFG_PRED_VERSION_ATLEAST: // checks if the current version is at least this one
+                       ret = compare_current_version(argp[0].data.str.area) <= 0;
+                       goto done;
+
+               case CFG_PRED_VERSION_BEFORE:  // checks if the current version is older than this one
+                       ret = compare_current_version(argp[0].data.str.area) > 0;
+                       goto done;
+
                default:
                        memprintf(err, "internal error: unhandled conditional expression predicate '%s'", cond_pred->word);
                        if (errptr)