diff --git a/doc/configuration.txt b/doc/configuration.txt index 5f60507fd..72c4680b1 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -821,6 +821,16 @@ The list of currently supported predicates is the following: - streq(,) : returns true only if the two strings are equal - strneq(,) : returns true only if the two strings differ + - version_atleast(): returns true if the current haproxy version is + at least as recent as otherwise false. The + version syntax is the same as shown by "haproxy -v" + and missing components are assumed as being zero. + + - version_before() : returns true if the current haproxy version is + strictly older than 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 diff --git a/src/cfgparse.c b/src/cfgparse.c index 15e4ad864..dead21d8c 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -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)