BUG/MEDIUM: cli: make sure we can report a warning from a bind keyword

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.
This commit is contained in:
Willy Tarreau 2021-11-20 20:10:41 +01:00
parent 97b5d07a3e
commit 0a1e1cb555

View File

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