]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: ssl: Add sample fetches related to OCSP update
authorRemi Tricot-Le Breton <rlebreton@haproxy.com>
Tue, 28 Feb 2023 16:46:24 +0000 (17:46 +0100)
committerWilliam Lallemand <wlallemand@haproxy.org>
Thu, 2 Mar 2023 14:37:18 +0000 (15:37 +0100)
This patch adds a series of sample fetches that rely on the specified
OCSP update context structure. They will then be of use only in the
context of an ongoing OCSP update.
They cannot be used directly in the configuration so they won't be made
public. They will be used in the OCSP update's specific log format which
should be emitted by the update task itself in a future patch.

src/ssl_ocsp.c

index eaac5f7348c0dd7d448fdd56a8ab26278b104af3..131f7aa47d1f137ad82b9a50c59cb3e4465320db 100644 (file)
@@ -1879,6 +1879,79 @@ static void cli_release_show_ocsp_updates(struct appctx *appctx)
 }
 
 
+static int
+smp_fetch_ssl_ocsp_certid(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+       struct buffer *data = get_trash_chunk();
+       struct certificate_ocsp *ocsp = ssl_ocsp_task_ctx.cur_ocsp;
+
+       if (!ocsp)
+               return 0;
+
+       dump_binary(data, (char *)ocsp->key_data, ocsp->key_length);
+
+       smp->data.type = SMP_T_STR;
+       smp->data.u.str = *data;
+       return 1;
+}
+
+static int
+smp_fetch_ssl_ocsp_status(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+       struct certificate_ocsp *ocsp = ssl_ocsp_task_ctx.cur_ocsp;
+
+       if (!ocsp)
+               return 0;
+
+       smp->data.type = SMP_T_SINT;
+       smp->data.u.sint = ssl_ocsp_task_ctx.update_status;
+       return 1;
+}
+
+static int
+smp_fetch_ssl_ocsp_status_str(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+       struct certificate_ocsp *ocsp = ssl_ocsp_task_ctx.cur_ocsp;
+
+       if (!ocsp)
+               return 0;
+
+       if (ssl_ocsp_task_ctx.update_status >= OCSP_UPDT_ERR_LAST)
+               return 0;
+
+       smp->data.type = SMP_T_STR;
+       smp->data.u.str = ist2buf(ocsp_update_errors[ssl_ocsp_task_ctx.update_status]);
+
+       return 1;
+}
+
+static int
+smp_fetch_ssl_ocsp_fail_cnt(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+       struct certificate_ocsp *ocsp = ssl_ocsp_task_ctx.cur_ocsp;
+
+       if (!ocsp)
+               return 0;
+
+       smp->data.type = SMP_T_SINT;
+       smp->data.u.sint = ocsp->num_failure;
+       return 1;
+}
+
+static int
+smp_fetch_ssl_ocsp_success_cnt(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+       struct certificate_ocsp *ocsp = ssl_ocsp_task_ctx.cur_ocsp;
+
+       if (!ocsp)
+               return 0;
+
+       smp->data.type = SMP_T_SINT;
+       smp->data.u.sint = ocsp->num_success;
+       return 1;
+}
+
+
 static struct cli_kw_list cli_kws = {{ },{
        { { "set", "ssl", "ocsp-response", NULL }, "set ssl ocsp-response <resp|payload>    : update a certificate's OCSP Response from a base64-encode DER",      cli_parse_set_ocspresponse, NULL },
 
@@ -1892,6 +1965,26 @@ static struct cli_kw_list cli_kws = {{ },{
 
 INITCALL1(STG_REGISTER, cli_register_kw, &cli_kws);
 
+
+/* Note: must not be declared <const> as its list will be overwritten.
+ * Please take care of keeping this list alphabetically sorted.
+ *
+ * Those fetches only have a valid value during an OCSP update process so they
+ * can only be used in a log format of a log line built by the update process
+ * task itself.
+ */
+static struct sample_fetch_kw_list sample_fetch_keywords = {ILH, {
+       { "ssl_ocsp_certid",                 smp_fetch_ssl_ocsp_certid,             0,                   NULL,    SMP_T_STR, SMP_USE_L5SRV },
+       { "ssl_ocsp_status",                 smp_fetch_ssl_ocsp_status,             0,                   NULL,    SMP_T_SINT, SMP_USE_L5SRV },
+       { "ssl_ocsp_status_str",             smp_fetch_ssl_ocsp_status_str,         0,                   NULL,    SMP_T_STR, SMP_USE_L5SRV },
+       { "ssl_ocsp_fail_cnt",               smp_fetch_ssl_ocsp_fail_cnt,           0,                   NULL,    SMP_T_SINT, SMP_USE_L5SRV },
+       { "ssl_ocsp_success_cnt",            smp_fetch_ssl_ocsp_success_cnt,        0,                   NULL,    SMP_T_SINT, SMP_USE_L5SRV },
+       { NULL, NULL, 0, 0, 0 },
+}};
+
+INITCALL1(STG_REGISTER, sample_register_fetches, &sample_fetch_keywords);
+
+
 /*
  * Local variables:
  *  c-indent-level: 8