diff --git a/include/types/proto_http.h b/include/types/proto_http.h index 3457a2a381..76c8e6b506 100644 --- a/include/types/proto_http.h +++ b/include/types/proto_http.h @@ -264,6 +264,7 @@ enum { ST_ADM_ACTION_ENABLE, ST_ADM_ACTION_STOP, ST_ADM_ACTION_START, + ST_ADM_ACTION_SHUTDOWN, }; /* status codes available for the stats admin page */ diff --git a/src/dumpstats.c b/src/dumpstats.c index a01c6ed0de..d79c880626 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -3173,6 +3173,7 @@ static int stats_dump_proxy(struct stream_interface *si, struct proxy *px, struc "" "" "" + "" "" "" " " diff --git a/src/proto_http.c b/src/proto_http.c index c0a66879fc..8834532289 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2611,6 +2611,9 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn else if (strcmp(value, "start") == 0) { action = ST_ADM_ACTION_START; } + else if (strcmp(value, "shutdown") == 0) { + action = ST_ADM_ACTION_SHUTDOWN; + } else { si->applet.ctx.stats.st_code = STAT_STATUS_ERRP; goto out; @@ -2680,6 +2683,18 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn altered_servers++; total_servers++; break; + case ST_ADM_ACTION_SHUTDOWN: + if (px->state != PR_STSTOPPED) { + struct session *sess, *sess_bck; + + list_for_each_entry_safe(sess, sess_bck, &sv->actconns, by_srv) + if (sess->srv_conn == sv) + session_shutdown(sess, SN_ERR_KILLED); + + altered_servers++; + total_servers++; + } + break; } } else { /* the server name is unknown or ambiguous (duplicate names) */