/* flags used for show_sess_ctx.flags */
#define CLI_SHOWSESS_F_SUSP 0x00000001 /* show only suspicious streams */
#define CLI_SHOWSESS_F_DUMP_URI 0x00000002 /* Dump TXN's uri if available in dump */
+#define CLI_SHOWSESS_F_SERVER 0x00000004 /* show only streams attached to this server */
+#define CLI_SHOWSESS_F_BACKEND 0x00000008 /* show only streams attached to this backend */
+#define CLI_SHOWSESS_F_FRONTEND 0x00000010 /* show only streams attached to this frontend */
struct show_sess_ctx {
struct bref bref; /* back-reference from the session being dumped */
void *target; /* session we want to dump, or NULL for all */
+ void *filter; /* element to filter on (e.g. server if CLI_SHOWSESS_F_SERVER) */
unsigned int thr; /* the thread number being explored (0..MAX_THREADS-1) */
unsigned int uid; /* if non-null, the uniq_id of the session being dumped */
unsigned int min_age; /* minimum age of streams to dump */
"Available options: \n"
" show-uri also display the transaction URI, if available\n"
" older <age> only display streams older than <age> seconds\n"
+ " server <b/s> only show streams attached to this backend+server\n"
+ " backend <b> only show streams attached to this backend\n"
+ " frontend <f> only show streams attached to this frontend\n"
"Without any argument, all streams are dumped in a shorter format.");
return cli_err(appctx, trash.area);
}
else if (*args[cur_arg] && strcmp(args[cur_arg], "susp") == 0) {
ctx->flags |= CLI_SHOWSESS_F_SUSP;
}
+ else if (*args[cur_arg] && strcmp(args[cur_arg], "server") == 0) {
+ struct ist be_name, sv_name;
+ struct proxy *be;
+ struct server *sv;
+
+ if (ctx->flags & (CLI_SHOWSESS_F_FRONTEND|CLI_SHOWSESS_F_BACKEND|CLI_SHOWSESS_F_SERVER))
+ return cli_err(appctx, "Only one of backend, frontend or server may be set.\n");
+
+ if (!*args[cur_arg + 1])
+ return cli_err(appctx, "Missing server name (<backend>/<server>).\n");
+
+ sv_name = ist(args[cur_arg + 1]);
+ be_name = istsplit(&sv_name, '/');
+ if (!istlen(sv_name))
+ return cli_err(appctx, "Require 'backend/server'.\n");
+
+ if (!(be = proxy_be_by_name(ist0(be_name))))
+ return cli_err(appctx, "No such backend.\n");
+
+ if (!(sv = server_find_by_name(be, ist0(sv_name))))
+ return cli_err(appctx, "No such server.\n");
+ ctx->flags |= CLI_SHOWSESS_F_SERVER;
+ ctx->filter = sv;
+ cur_arg++;
+ }
+ else if (*args[cur_arg] && strcmp(args[cur_arg], "backend") == 0) {
+ struct proxy *be;
+
+ if (ctx->flags & (CLI_SHOWSESS_F_FRONTEND|CLI_SHOWSESS_F_BACKEND|CLI_SHOWSESS_F_SERVER))
+ return cli_err(appctx, "Only one of backend, frontend or server may be set.\n");
+
+ if (!*args[cur_arg + 1])
+ return cli_err(appctx, "Missing backend name.\n");
+
+ if (!(be = proxy_be_by_name(args[cur_arg + 1])))
+ return cli_err(appctx, "No such backend.\n");
+
+ ctx->flags |= CLI_SHOWSESS_F_BACKEND;
+ ctx->filter = be;
+ cur_arg++;
+ }
+ else if (*args[cur_arg] && strcmp(args[cur_arg], "frontend") == 0) {
+ struct proxy *fe;
+
+ if (ctx->flags & (CLI_SHOWSESS_F_FRONTEND|CLI_SHOWSESS_F_BACKEND|CLI_SHOWSESS_F_SERVER))
+ return cli_err(appctx, "Only one of backend, frontend or server may be set.\n");
+
+ if (!*args[cur_arg + 1])
+ return cli_err(appctx, "Missing frontend name.\n");
+
+ if (!(fe = proxy_fe_by_name(args[cur_arg + 1])))
+ return cli_err(appctx, "No such frontend.\n");
+
+ ctx->flags |= CLI_SHOWSESS_F_FRONTEND;
+ ctx->filter = fe;
+ cur_arg++;
+ }
else {
chunk_printf(&trash, "Unsupported option '%s', try 'help' for more info.\n", args[cur_arg]);
return cli_err(appctx, trash.area);
goto next_sess;
}
+ if ((ctx->flags & CLI_SHOWSESS_F_SERVER) &&
+ (!(curr_strm->be->cap & PR_CAP_BE) || curr_strm->target != ctx->filter))
+ goto next_sess;
+
+ if ((ctx->flags & CLI_SHOWSESS_F_BACKEND) && (curr_strm->be != ctx->filter))
+ goto next_sess;
+
+ if ((ctx->flags & CLI_SHOWSESS_F_FRONTEND) && (curr_strm->sess->fe != ctx->filter))
+ goto next_sess;
+
if (ctx->flags & CLI_SHOWSESS_F_SUSP) {
/* only show suspicious streams. Non-suspicious ones have a valid
* expiration date in the future and a valid front endpoint.