From 1941bab52c58c553d4c12cf23dea5d9f4dc008d5 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 5 May 2020 07:55:50 +0200 Subject: [PATCH] MINOR: checks: Set by default expect rule status to UNKNOWN during parsing The status (ok, error and timeout) of an TCP or HTTP expect rule are set to HCHK_STATUS_UNKNOWN by default, when not specified, during the configuration parsing. This does not change the default status used for a terminal expect rule (ok=L7OK, err=L7RSP and tout=L7TOUT). But this way, it is possible to know if a specific status was forced by config or not. --- src/checks.c | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/checks.c b/src/checks.c index 1249b2410..b7d365b5b 100644 --- a/src/checks.c +++ b/src/checks.c @@ -689,7 +689,8 @@ static void chk_report_conn_err(struct check *check, int errno_bck, int expired) enum healthcheck_status tout = HCHK_STATUS_L7TOUT; /* connection established but expired check */ - if (check->current_step && check->current_step->action == TCPCHK_ACT_EXPECT) + if (check->current_step && check->current_step->action == TCPCHK_ACT_EXPECT && + check->current_step->expect.tout_status != HCHK_STATUS_UNKNOWN) tout = check->current_step->expect.tout_status; set_server_check_status(check, tout, err_msg); } @@ -1246,7 +1247,8 @@ static enum tcpcheck_eval_ret tcpcheck_mysql_expect_packet(struct check *check, * FIXME : it can be cool to use MySQL Version for other purpose, * like mark as down old MySQL server. */ - set_server_check_status(check, rule->expect.ok_status, b_peek(&check->bi, 5)); + status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD); + set_server_check_status(check, status, b_peek(&check->bi, 5)); out: free_trash_chunk(msg); @@ -1344,7 +1346,8 @@ static enum tcpcheck_eval_ret tcpcheck_ldap_expect_bindrsp(struct check *check, goto error; } - set_server_check_status(check, rule->expect.ok_status, "Success"); + status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD); + set_server_check_status(check, status, "Success"); out: free_trash_chunk(msg); @@ -1385,7 +1388,8 @@ static enum tcpcheck_eval_ret tcpcheck_spop_expect_agenthello(struct check *chec goto error; } - set_server_check_status(check, rule->expect.ok_status, "SPOA server is ok"); + status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD); + set_server_check_status(check, status, "SPOA server is ok"); out: free_trash_chunk(msg); @@ -2075,11 +2079,15 @@ static enum tcpcheck_eval_ret tcpcheck_eval_recv(struct check *check, struct tcp goto wait_more_data; } if (is_empty) { + int status; + chunk_printf(&trash, "TCPCHK got an empty response at step %d", tcpcheck_get_step_id(check, rule)); if (rule->comment) chunk_appendf(&trash, " comment: '%s'", rule->comment); - set_server_check_status(check, rule->expect.err_status, trash.area); + + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP); + set_server_check_status(check, status, trash.area); goto stop; } } @@ -2155,15 +2163,17 @@ static enum tcpcheck_eval_ret tcpcheck_eval_expect_http(struct check *check, str } /* Set status and description in case of error */ - status = HCHK_STATUS_L7STS; - desc = htx_sl_res_reason(sl); + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7STS); + if (LIST_ISEMPTY(&expect->onerror_fmt)) + desc = htx_sl_res_reason(sl); break; case TCPCHK_EXPECT_HTTP_REGEX_STATUS: match = regex_exec2(expect->regex, HTX_SL_RES_CPTR(sl), HTX_SL_RES_CLEN(sl)); /* Set status and description in case of error */ - status = HCHK_STATUS_L7STS; - desc = htx_sl_res_reason(sl); + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7STS); + if (LIST_ISEMPTY(&expect->onerror_fmt)) + desc = htx_sl_res_reason(sl); break; case TCPCHK_EXPECT_HTTP_BODY: @@ -2183,8 +2193,9 @@ static enum tcpcheck_eval_ret tcpcheck_eval_expect_http(struct check *check, str if (!b_data(&trash)) { if (!last_read) goto wait_more_data; - status = HCHK_STATUS_L7RSP; - desc = ist("HTTP content check could not find a response body"); + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP); + if (LIST_ISEMPTY(&expect->onerror_fmt)) + desc = ist("HTTP content check could not find a response body"); goto error; } @@ -2201,15 +2212,16 @@ static enum tcpcheck_eval_ret tcpcheck_eval_expect_http(struct check *check, str match = regex_exec2(expect->regex, b_orig(&trash), b_data(&trash)); /* Set status and description in case of error */ - status = HCHK_STATUS_L7RSP; - desc = (inverse - ? ist("HTTP check matched unwanted content") - : ist("HTTP content check did not match")); + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP); + if (LIST_ISEMPTY(&expect->onerror_fmt)) + desc = (inverse + ? ist("HTTP check matched unwanted content") + : ist("HTTP content check did not match")); break; default: /* should never happen */ - status = HCHK_STATUS_L7RSP; + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP); goto error; } @@ -2250,6 +2262,7 @@ static enum tcpcheck_eval_ret tcpcheck_eval_expect(struct check *check, struct t enum tcpcheck_eval_ret ret = TCPCHK_EVAL_CONTINUE; struct tcpcheck_expect *expect = &rule->expect; struct buffer *msg = NULL; + enum healthcheck_status status; int match, inverse; last_read |= b_full(&check->bi); @@ -2316,7 +2329,9 @@ static enum tcpcheck_eval_ret tcpcheck_eval_expect(struct check *check, struct t msg = alloc_trash_chunk(); if (msg) tcpcheck_expect_onerror_message(msg, check, rule, match, IST_NULL); - set_server_check_status(check, expect->err_status, (msg ? b_head(msg) : NULL)); + + status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP); + set_server_check_status(check, status, (msg ? b_head(msg) : NULL)); free_trash_chunk(msg); ret = TCPCHK_EVAL_STOP; @@ -2507,6 +2522,7 @@ static int tcpcheck_main(struct check *check) if (rule->action == TCPCHK_ACT_EXPECT) { struct buffer *msg; + enum healthcheck_status status; if (check->server && (check->server->proxy->options & PR_O_DISABLE404) && @@ -2519,8 +2535,8 @@ static int tcpcheck_main(struct check *check) msg = alloc_trash_chunk(); if (msg) tcpcheck_expect_onsuccess_message(msg, check, rule, IST_NULL); - set_server_check_status(check, rule->expect.ok_status, - (msg ? b_head(msg) : "(tcp-check)")); + status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD); + set_server_check_status(check, status, (msg ? b_head(msg) : "(tcp-check)")); free_trash_chunk(msg); } else if (rule->action == TCPCHK_ACT_CONNECT) { @@ -3955,9 +3971,9 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str struct sample_expr *status_expr = NULL; char *on_success_msg, *on_error_msg, *comment, *pattern; enum tcpcheck_expect_type type = TCPCHK_EXPECT_UNDEF; - enum healthcheck_status ok_st = HCHK_STATUS_L7OKD; - enum healthcheck_status err_st = HCHK_STATUS_L7RSP; - enum healthcheck_status tout_st = HCHK_STATUS_L7TOUT; + enum healthcheck_status ok_st = HCHK_STATUS_UNKNOWN; + enum healthcheck_status err_st = HCHK_STATUS_UNKNOWN; + enum healthcheck_status tout_st = HCHK_STATUS_UNKNOWN; long min_recv = -1; int inverse = 0; @@ -4086,12 +4102,7 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str goto error; } cur_arg++; - free(on_success_msg); - on_success_msg = strdup(args[cur_arg]); - if (!on_success_msg) { - memprintf(errmsg, "out of memory"); - goto error; - } + on_success_msg = args[cur_arg]; } else if (strcmp(args[cur_arg], "on-error") == 0) { if (in_pattern) { @@ -4103,12 +4114,7 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str goto error; } cur_arg++; - free(on_error_msg); - on_error_msg = strdup(args[cur_arg]); - if (!on_error_msg) { - memprintf(errmsg, "out of memory"); - goto error; - } + on_error_msg = args[cur_arg]; } else if (strcmp(args[cur_arg], "ok-status") == 0) { if (in_pattern) { @@ -4250,8 +4256,6 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str memprintf(errmsg, "'%s' invalid log-format string (%s).\n", on_success_msg, *errmsg); goto error; } - free(on_success_msg); - on_success_msg = NULL; } if (on_error_msg) { px->conf.args.ctx = ARGC_SRV; @@ -4259,8 +4263,6 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str memprintf(errmsg, "'%s' invalid log-format string (%s).\n", on_error_msg, *errmsg); goto error; } - free(on_error_msg); - on_error_msg = NULL; } switch (chk->expect.type) { @@ -4353,8 +4355,6 @@ static struct tcpcheck_rule *parse_tcpcheck_expect(char **args, int cur_arg, str error: free_tcpcheck(chk, 0); free(comment); - free(on_success_msg); - free(on_error_msg); release_sample_expr(status_expr); return NULL; }