[master] b2818da43 Add JSON support for the "ban.list" CLI command.
Geoff Simmons
geoff at uplex.de
Mon Oct 8 11:28:12 UTC 2018
commit b2818da43003054a53c98da090f503bc883fd1cd
Author: Geoff Simmons <geoff at uplex.de>
Date: Tue Sep 25 09:04:42 2018 +0200
Add JSON support for the "ban.list" CLI command.
diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index 6ec3577d2..fab8661cf 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -669,7 +669,7 @@ ccf_ban(struct cli *cli, const char * const *av, void *priv)
}
static void
-ban_render(struct cli *cli, const uint8_t *bs)
+ban_render(struct cli *cli, const uint8_t *bs, int quote)
{
struct ban_test bt;
const uint8_t *be;
@@ -704,27 +704,21 @@ ban_render(struct cli *cli, const uint8_t *bs)
default:
WRONG("Wrong BANS_OPER");
}
- VCLI_Out(cli, "%s", bt.arg2);
+ if (quote)
+ VCLI_Quote(cli, bt.arg2);
+ else
+ VCLI_Out(cli, "%s", bt.arg2);
if (bs < be)
VCLI_Out(cli, " && ");
}
}
-static void v_matchproto_(cli_func_t)
-ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
+static void
+ban_list(struct cli *cli, struct ban *bl)
{
- struct ban *b, *bl;
+ struct ban *b;
int64_t o;
- (void)av;
- (void)priv;
-
- /* Get a reference so we are safe to traverse the list */
- Lck_Lock(&ban_mtx);
- bl = VTAILQ_LAST(&ban_head, banhead_s);
- bl->refcount++;
- Lck_Unlock(&ban_mtx);
-
VCLI_Out(cli, "Present bans:\n");
VTAILQ_FOREACH(b, &ban_head, list) {
o = bl == b ? 1 : 0;
@@ -738,7 +732,7 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
b);
}
VCLI_Out(cli, " ");
- ban_render(cli, b->spec);
+ ban_render(cli, b->spec, 0);
VCLI_Out(cli, "\n");
if (VCLI_Overflow(cli))
break;
@@ -750,6 +744,80 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
Lck_Unlock(&ban_mtx);
}
}
+}
+
+static void
+ban_list_json(struct cli *cli, const char * const *av, struct ban *bl)
+{
+ struct ban *b;
+ int64_t o;
+ int n = 0;
+ int ocs;
+
+ VCLI_JSON_begin(cli, 2, av);
+ VCLI_Out(cli, ",\n");
+ VTAILQ_FOREACH(b, &ban_head, list) {
+ o = bl == b ? 1 : 0;
+ VCLI_Out(cli, "%s", n ? ",\n" : "");
+ n++;
+ VCLI_Out(cli, "{\n");
+ VSB_indent(cli->sb, 2);
+ VCLI_Out(cli, "\"time\": %.6f,\n", ban_time(b->spec));
+ VCLI_Out(cli, "\"refs\": %ju,\n", (intmax_t)(b->refcount - o));
+ VCLI_Out(cli, "\"completed\": %s,\n",
+ b->flags & BANS_FLAG_COMPLETED ? "true" : "false");
+ VCLI_Out(cli, "\"spec\": \"");
+ ban_render(cli, b->spec, 1);
+ VCLI_Out(cli, "\"");
+
+ if (DO_DEBUG(DBG_LURKER)) {
+ VCLI_Out(cli, ",\n");
+ VCLI_Out(cli, "\"req_tests\": %s,\n",
+ b->flags & BANS_FLAG_REQ ? "true" : "false");
+ VCLI_Out(cli, "\"obj_tests\": %s,\n",
+ b->flags & BANS_FLAG_OBJ ? "true" : "false");
+ VCLI_Out(cli, "\"pointer\": \"%p\",\n", b);
+ if (VCLI_Overflow(cli))
+ break;
+
+ ocs = 0;
+ VCLI_Out(cli, "\"objcores\": [\n");
+ VSB_indent(cli->sb, 2);
+ Lck_Lock(&ban_mtx);
+ struct objcore *oc;
+ VTAILQ_FOREACH(oc, &b->objcore, ban_list) {
+ if (ocs)
+ VCLI_Out(cli, ",\n");
+ VCLI_Out(cli, "%p", oc);
+ ocs++;
+ }
+ Lck_Unlock(&ban_mtx);
+ VSB_indent(cli->sb, -2);
+ VCLI_Out(cli, "\n]");
+ }
+ VSB_indent(cli->sb, -2);
+ VCLI_Out(cli, "\n}");
+ }
+ VCLI_JSON_end(cli);
+}
+
+static void v_matchproto_(cli_func_t)
+ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
+{
+ struct ban *bl;
+
+ (void)priv;
+
+ /* Get a reference so we are safe to traverse the list */
+ Lck_Lock(&ban_mtx);
+ bl = VTAILQ_LAST(&ban_head, banhead_s);
+ bl->refcount++;
+ Lck_Unlock(&ban_mtx);
+
+ if (av[2] != NULL && strcmp(av[2], "-j") == 0)
+ ban_list_json(cli, av, bl);
+ else
+ ban_list(cli, bl);
Lck_Lock(&ban_mtx);
bl->refcount--;
@@ -759,7 +827,8 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
static struct cli_proto ban_cmds[] = {
{ CLICMD_BAN, "", ccf_ban },
- { CLICMD_BAN_LIST, "", ccf_ban_list },
+ { CLICMD_BAN_LIST, "", ccf_ban_list,
+ ccf_ban_list },
{ NULL }
};
diff --git a/bin/varnishtest/tests/c00019.vtc b/bin/varnishtest/tests/c00019.vtc
index 22b5ca1bf..3a4a3b2f8 100644
--- a/bin/varnishtest/tests/c00019.vtc
+++ b/bin/varnishtest/tests/c00019.vtc
@@ -84,7 +84,13 @@ client c1 {
varnish v1 -expect bans_tested == 2
varnish v1 -expect bans_tests_tested == 2
varnish v1 -cliok "ban.list"
+varnish v1 -clijson "ban.list -j"
# Test a bogus regexp
-
varnish v1 -clierr 106 "ban req.url ~ [[["
+
+# Ban expression with quoting
+varnish v1 -cliok {ban req.url ~ "BAR"}
+shell {varnishadm -n ${tmpdir}/v1 ban 'obj.http.Host ~ \"Foo\"'}
+varnish v1 -cliok "ban.list"
+varnish v1 -clijson "ban.list -j"
diff --git a/bin/varnishtest/tests/c00021.vtc b/bin/varnishtest/tests/c00021.vtc
index c4a5ef5cf..d1aff7875 100644
--- a/bin/varnishtest/tests/c00021.vtc
+++ b/bin/varnishtest/tests/c00021.vtc
@@ -112,6 +112,7 @@ client c1 {
# header check, no header
varnish v1 -cliok "ban req.url ~ foo && obj.http.bar == barcheck"
varnish v1 -cliok "ban.list"
+varnish v1 -clijson "ban.list -j"
client c1 {
txreq -url "/foo"
diff --git a/bin/varnishtest/tests/c00022.vtc b/bin/varnishtest/tests/c00022.vtc
index e2fa3e727..79a034fb2 100644
--- a/bin/varnishtest/tests/c00022.vtc
+++ b/bin/varnishtest/tests/c00022.vtc
@@ -149,6 +149,7 @@ client c1 {
expect resp.status == 410
} -run
varnish v1 -cliok "ban.list"
+varnish v1 -clijson "ban.list -j"
client c1 {
txreq -url "/foo"
diff --git a/bin/varnishtest/tests/c00049.vtc b/bin/varnishtest/tests/c00049.vtc
index 9ff05d7f0..a442833fa 100644
--- a/bin/varnishtest/tests/c00049.vtc
+++ b/bin/varnishtest/tests/c00049.vtc
@@ -205,6 +205,7 @@ varnish v1 -cliok "ban.list"
varnish v1 -cliok "param.set ban_lurker_age .1"
delay 3
+varnish v1 -clijson "ban.list -j"
varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 1
diff --git a/bin/varnishtest/tests/c00059.vtc b/bin/varnishtest/tests/c00059.vtc
index db0e6d29c..156bff35c 100644
--- a/bin/varnishtest/tests/c00059.vtc
+++ b/bin/varnishtest/tests/c00059.vtc
@@ -18,6 +18,7 @@ client c1 {
varnish v1 -cliok "ban obj.status == 201"
varnish v1 -cliok "ban obj.status == 200"
varnish v1 -cliok "ban.list"
+varnish v1 -clijson "ban.list -j"
client c1 {
txreq
More information about the varnish-commit
mailing list