]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: backend: srv_is_up converter
authorChris Staite <christopher.staite@menlosecurity.com>
Wed, 24 Sep 2025 21:21:43 +0000 (22:21 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 26 Sep 2025 08:46:48 +0000 (10:46 +0200)
There is currently an srv_queue converter which is capable of taking the
output of a dynamic name and determining the queue length for a given
server.  In addition there is a sample fetcher for whether a server is
currently up.  This simply combines the two such that srv_is_up can be
used as a converter too.

Future work might extend this to other sample fetchers for servers, but
this is probably the most useful for acl routing.

doc/configuration.txt
src/backend.c

index 62503aefbd1d3ee7b3dac9b7f15e5654c654438f..1f76942311395160eb083bf755f0f601211d4867 100644 (file)
@@ -20144,6 +20144,7 @@ secure_memcmp(var)                                 string       boolean
 set-var(var[,cond...])                              any          same
 sha1                                               binary       binary
 sha2([bits])                                       binary       binary
+srv_is_up                                          string       boolean
 srv_queue                                          string       integer
 strcmp(var)                                        string       boolean
 sub(value)                                         integer      integer
@@ -21405,6 +21406,16 @@ sha2([<bits>])
   Please note that this converter is only available when HAProxy has been
   compiled with USE_OPENSSL.
 
+srv_is_up
+  Takes an input value of type string, either a server name or <backend>/<server>
+  format and returns true when the designated server is currently UP. Can be used
+  in places where we want to look up a server status from a dynamic name, like a
+  cookie value (e.g. req.cook(SRVID),srv_is_up) and then make a decision to
+  direct a request elsewhere. Before using this, please keep in mind that using
+  this converter on uncontrolled data might allow an external observer to query
+  the state of any server in the whole configuration, which might possibly not
+  be acceptable in some environments.
+
 srv_queue
   Takes an input value of type string, either a server name or <backend>/<server>
   format and returns the number of queued streams on that server. Can be used
index 9b5a2fd14bc076a46243f13c5041b968b36c1075..135b2c4a0f9f51f903f5203e149eac734b07154d 100644 (file)
@@ -3763,6 +3763,23 @@ static struct server *sample_conv_srv(struct sample *smp)
        return server_find(px, smp->data.u.str.area);
 }
 
+static int
+sample_conv_srv_is_up(const struct arg *args, struct sample *smp, void *private)
+{
+       struct server *srv = sample_conv_srv(smp);
+
+       if (!srv)
+               return 0;
+
+       smp->data.type = SMP_T_BOOL;
+       if (!(srv->cur_admin & SRV_ADMF_MAINT) &&
+           (!(srv->check.state & CHK_ST_CONFIGURED) || (srv->cur_state != SRV_ST_STOPPED)))
+               smp->data.u.sint = 1;
+       else
+               smp->data.u.sint = 0;
+       return 1;
+}
+
 static int
 sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
 {
@@ -3809,6 +3826,7 @@ INITCALL1(STG_REGISTER, sample_register_fetches, &smp_kws);
 /* Note: must not be declared <const> as its list will be overwritten */
 static struct sample_conv_kw_list sample_conv_kws = {ILH, {
        { "nbsrv",     sample_conv_nbsrv,     0, NULL, SMP_T_STR, SMP_T_SINT },
+       { "srv_is_up", sample_conv_srv_is_up, 0, NULL, SMP_T_STR, SMP_T_BOOL },
        { "srv_queue", sample_conv_srv_queue, 0, NULL, SMP_T_STR, SMP_T_SINT },
        { /* END */ },
 }};