]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: cli: make sure we can report a warning from a bind keyword
authorWilly Tarreau <w@1wt.eu>
Sat, 20 Nov 2021 19:10:41 +0000 (20:10 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 20 Nov 2021 19:15:37 +0000 (20:15 +0100)
Since recent 2.5 commit c8cac04bd ("MEDIUM: listener: deprecate "process"
in favor of "thread" on bind lines"), the "process" bind keyword may
report a warning. However some parts like the "stats socket" parser
will call such bind keywords and do not expect to face warnings, so
this will instantly cause a fatal error to be reported. A concrete
effect is that "stats socket ... process 1" will hard-fail indicating
the keyword is deprecated and will be removed in 2.7.

We must relax this test, but the code isn't designed to report warnings,
it uses a single string and only supports reporting an error code (-1).

This patch makes a special case of the ERR_WARN code and uses ha_warning()
to report it, and keeps the rest of the existing error code for other
non-warning codes. Now "process" on the "stats socket" is properly
reported as a warning.

No backport is needed.

src/cli.c

index 3b068031fb30b0423fff3e9cb283e3fac77c472a..2ea5aacbbe29d24835d205671d1d7966653009b5 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -441,6 +441,7 @@ static int cli_parse_global(char **args, int section_type, struct proxy *curpx,
                while (*args[cur_arg]) {
                        struct bind_kw *kw;
                        const char *best;
+                       int code;
 
                        kw = bind_find_kw(args[cur_arg]);
                        if (kw) {
@@ -450,7 +451,19 @@ static int cli_parse_global(char **args, int section_type, struct proxy *curpx,
                                        return -1;
                                }
 
-                               if (kw->parse(args, cur_arg, global.cli_fe, bind_conf, err) != 0) {
+                               code = kw->parse(args, cur_arg, global.cli_fe, bind_conf, err);
+
+                               /* FIXME: this is ugly, we don't have a way to collect warnings,
+                                * yet some important bind keywords may report warnings that we
+                                * must display.
+                                */
+                               if (((code & (ERR_WARN|ERR_FATAL|ERR_ALERT)) == ERR_WARN) && err && *err) {
+                                       indent_msg(err, 2);
+                                       ha_warning("parsing [%s:%d] : '%s %s' : %s\n", file, line, args[0], args[1], *err);
+                                       ha_free(err);
+                               }
+
+                               if (code & ~ERR_WARN) {
                                        if (err && *err)
                                                memprintf(err, "'%s %s' : '%s'", args[0], args[1], *err);
                                        else