Hello Christopher,

Thanks for your research,

On Tue, Jan 11, 2022 at 6:55 PM Christopher Faulet <[email protected]> wrote:
> Le 1/10/22 à 23:19, Willy Tarreau a écrit :
> > At this point I'm starting to think that we should probably avoid as
> > much as possible to use implicit settings for whatever is dynamic.
> > Originally a lot of settings were implicit because we don't want to
> > have huge config lines to enforce lots of obvious settings. On the CLI
> > it's less of a problem and for example if "ssl" only deals with the
> > traffic without manipulating the checks, I'm personally not shocked,
> > because these are normally sent by bots and we don't care if they
> > have to set a few more settings to avoid multiple implicit changes
> > that may not always be desired. This is where the CLI (or any future
> > API) might differ a bit from the config, and an agent writing some
> > config might have to explicitly state certain things like "no-check-ssl"
> > for example to stay safe and avoid such implicit dependencies.
> >
>
> I agree with Willy on this point. Especially because, depending the order of
> commands, the result can be different because of implicit changes and it is
> pretty hard to predict how it will behave in all cases.

yup totally agree with both of you. I can't really remember why I did
that in the first place.

> For instance, to fix William's bug about "set server ssl" command, in a way or
> another, we must stop to dynamically update the health-check if its port or 
> its
> address is explicitly specified. With this change, the result of following set
> of commands will be different:
>
>    $ set server BK/SRV ssl on
>    $ set server BK/SRV check-port XXX
>
> ==> SSL is enabled for the server and the health-check

interesting one :))

>    $ set server BK/SRV check-port XXX
>    $ set server BK/SRV ssl on
>
> ==> because the check's port was updated first, the SSL is only enabled for 
> the
> server.

> Agree. But, if possible, a warning may be added in the documentation to warn
> about implicit changes.

>From the discussion, I would be tempted to say the opposite, as I feel
like keeping implicit things for this command is worse.

> About the fix, I checked the code, and, at first glance, there is no reason to
> change "srv->check.use_ssl" value when the health-check uses the server
> settings. Thus, we may fix "set server ssl" command this way:
>
> diff --git a/src/check.c b/src/check.c
> index f0ae81504..8cf8a1c5b 100644
> --- a/src/check.c
> +++ b/src/check.c
> @@ -1565,10 +1565,8 @@ int init_srv_check(struct server *srv)
>           * default, unless one is specified.
>           */
>          if (!srv->check.port && !is_addr(&srv->check.addr)) {
> -               if (!srv->check.use_ssl && srv->use_ssl != -1) {
> -                       srv->check.use_ssl = srv->use_ssl;
> -                       srv->check.xprt    = srv->xprt;
> -               }
> +               if (!srv->check.use_ssl && srv->use_ssl != -1)
> +                       srv->check.xprt = srv->xprt;
>                  else if (srv->check.use_ssl == 1)
>                          srv->check.xprt = xprt_get(XPRT_SSL);
>                  srv->check.send_proxy |= (srv->pp_opts);

indeed this is simplified that way

> diff --git a/src/server.c b/src/server.c
> index 2061153bc..a18836a71 100644
> --- a/src/server.c
> +++ b/src/server.c
> @@ -2113,10 +2113,11 @@ void srv_set_ssl(struct server *s, int use_ssl)
>                  return;
>
>          s->use_ssl = use_ssl;
> -       if (s->use_ssl)
> -               s->xprt = xprt_get(XPRT_SSL);
> -       else
> -               s->xprt = s->check.xprt = s->agent.xprt = xprt_get(XPRT_RAW);
> +       s->xprt = (s->use_ssl == 1) ? xprt_get(XPRT_SSL) : xprt_get(XPRT_RAW);
> +
> +       if ((s->check.state & CHK_ST_CONFIGURED) && !s->check.use_ssl &&
> +           !s->check.port && !is_addr(&s->check.addr))
> +               s->check.xprt = s->xprt;
>   }

as mentioned above I am not sure I am aligned here; I would rather
remove the side effect of changing s->check.

>   #endif /* USE_OPENSSL */
>
> This may be done with the following 3 steps:
>
>    * First, stop to change "srv->check.use_ssl" value
>
>    * Then, stop to change the agent settings in srv_set_ssl() because there is
> no ssl support for agent-check.

good point, I did not know

>    * Finally, fix the bug identified by William, adding the according 
> documentation.
>
> Note I don't know if all this stuff works properly with the server-state 
> file...

I am always scared to look at the server state functionality...

-- 
William

Reply via email to