From 96737034760acbe5390da11632562a9502b220ed Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 13 Jan 2025 11:54:01 -0400 Subject: [PATCH] MT#61822 add new "CLI" NG command Change-Id: Idd4114783b1bb6cc683970110a2f322ec07b894a --- daemon/cli.c | 27 ++++++ daemon/control_ng.c | 12 ++- include/cli.h | 1 + include/control_ng.h | 1 + t/test-stats.c | 189 ++++++++++++++++++++++++++++++++++++-- utils/rtpengine-ng-client | 1 + 6 files changed, 221 insertions(+), 10 deletions(-) diff --git a/daemon/cli.c b/daemon/cli.c index fe1306289..906fa9ed3 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -2043,3 +2043,30 @@ static void cli_incoming_media_evict_players(str *instr, struct cli_writer *cw, cw->cw_printf(cw, "%u DB cache entries evicted\n", num); } #endif + +static void ng_printf(struct cli_writer *cw, const char *fmt, ...) { + GString *s = cw->ptr; + va_list va; + va_start(va, fmt); + g_string_append_vprintf(s, fmt, va); + va_end(va); +} + +const char *cli_ng(ng_command_ctx_t *ctx) { + __auto_type parser = ctx->parser_ctx.parser; + str body; + if (!parser->dict_get_str(ctx->req, "body", &body)) + return "No 'body' in message"; + + g_autoptr(GString) response = g_string_new(""); + + struct cli_writer cw = { + .cw_printf = ng_printf, + .ptr = response, + }; + cli_handle(&body, &cw); + + parser->dict_add_str_dup(ctx->resp, "response", &STR_LEN(response->str, response->len)); + + return NULL; +} diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 4fa973266..ee8eaa037 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -23,6 +23,7 @@ #include "homer.h" #include "tcp_listener.h" #include "main.h" +#include "cli.h" mutex_t rtpe_cngs_lock; mutex_t tcp_connections_lock; @@ -46,7 +47,7 @@ const char *ng_command_strings[OP_COUNT] = { "block silence media", "unblock silence media", "publish", "subscribe request", "subscribe answer", "unsubscribe", - "connect" + "connect", "cli" }; const char *ng_command_strings_esc[OP_COUNT] = { "ping", "offer", "answer", "delete", "query", "list", @@ -57,7 +58,7 @@ const char *ng_command_strings_esc[OP_COUNT] = { "block_silence_media", "unblock_silence_media", "publish", "subscribe_request", "subscribe_answer", "unsubscribe", - "connect" + "connect", "cli" }; const char *ng_command_strings_short[OP_COUNT] = { "Ping", "Offer", "Answer", "Delete", "Query", "List", @@ -67,7 +68,7 @@ const char *ng_command_strings_short[OP_COUNT] = { "PlayDTMF", "Stats", "SlnMedia", "UnslnMedia", "BlkSlnMedia", "UnblkSlnMedia", "Pub", "SubReq", "SubAns", "Unsub", - "Conn" + "Conn", "CLI" }; typedef struct ng_ctx { @@ -847,6 +848,11 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons command_ctx.opmode = OP_CONNECT; errstr = call_connect_ng(&command_ctx); break; + case CSH_LOOKUP("cli"): + case CSH_LOOKUP("CLI"): + command_ctx.opmode = OP_CLI; + errstr = cli_ng(&command_ctx); + break; default: errstr = "Unrecognized command"; } diff --git a/include/cli.h b/include/cli.h index db6b81d28..8c0e05f7b 100644 --- a/include/cli.h +++ b/include/cli.h @@ -25,5 +25,6 @@ struct cli_writer { struct cli *cli_new(const endpoint_t *); void cli_handle(str *instr, struct cli_writer *); +const char *cli_ng(ng_command_ctx_t *); #endif /* CLI_UDP_H_ */ diff --git a/include/control_ng.h b/include/control_ng.h index 34bc45615..bb07b641e 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -30,6 +30,7 @@ enum ng_opmode { OP_SUBSCRIBE_ANS, OP_UNSUBSCRIBE, OP_CONNECT, + OP_CLI, OP_COUNT, // last, number of elements OP_OTHER = OP_COUNT // alias to above diff --git a/t/test-stats.c b/t/test-stats.c index 4668a7c72..c0bdd26bf 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -283,6 +283,13 @@ int main(void) { "connects_ps_max 0 150\n" "connects_ps_avg 0 150\n" "connect_count 0 150\n" + "cli_time_min 0.000000 150\n" + "cli_time_max 0.000000 150\n" + "cli_time_avg 0.000000 150\n" + "clis_ps_min 0 150\n" + "clis_ps_max 0 150\n" + "clis_ps_avg 0 150\n" + "cli_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -757,6 +764,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -981,6 +996,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -1144,7 +1167,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -1203,6 +1226,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -1419,6 +1444,13 @@ int main(void) { "connects_ps_max 0 150\n" "connects_ps_avg 0 150\n" "connect_count 0 150\n" + "cli_time_min 0.000000 150\n" + "cli_time_max 0.000000 150\n" + "cli_time_avg 0.000000 150\n" + "clis_ps_min 0 150\n" + "clis_ps_max 0 150\n" + "clis_ps_avg 0 150\n" + "cli_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -1893,6 +1925,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -2117,6 +2157,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -2280,7 +2328,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -2339,6 +2387,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -2552,6 +2602,13 @@ int main(void) { "connects_ps_max 0 150\n" "connects_ps_avg 0 150\n" "connect_count 0 150\n" + "cli_time_min 0.000000 150\n" + "cli_time_max 0.000000 150\n" + "cli_time_avg 0.000000 150\n" + "clis_ps_min 0 150\n" + "clis_ps_max 0 150\n" + "clis_ps_avg 0 150\n" + "cli_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -3026,6 +3083,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -3250,6 +3315,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -3413,7 +3486,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -3472,6 +3545,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -3704,6 +3779,13 @@ int main(void) { "connects_ps_max 0 157\n" "connects_ps_avg 0 157\n" "connect_count 0 157\n" + "cli_time_min 0.000000 157\n" + "cli_time_max 0.000000 157\n" + "cli_time_avg 0.000000 157\n" + "clis_ps_min 0 157\n" + "clis_ps_max 0 157\n" + "clis_ps_avg 0 157\n" + "cli_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -4178,6 +4260,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -4402,6 +4492,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -4565,7 +4663,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -4624,6 +4722,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -4845,6 +4945,13 @@ int main(void) { "connects_ps_max 0 157\n" "connects_ps_avg 0 157\n" "connect_count 0 157\n" + "cli_time_min 0.000000 157\n" + "cli_time_max 0.000000 157\n" + "cli_time_avg 0.000000 157\n" + "clis_ps_min 0 157\n" + "clis_ps_max 0 157\n" + "clis_ps_avg 0 157\n" + "cli_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -5319,6 +5426,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -5543,6 +5658,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -5706,7 +5829,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -5765,6 +5888,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -5981,6 +6106,13 @@ int main(void) { "connects_ps_max 0 200\n" "connects_ps_avg 0 200\n" "connect_count 0 200\n" + "cli_time_min 0.000000 200\n" + "cli_time_max 0.000000 200\n" + "cli_time_avg 0.000000 200\n" + "clis_ps_min 0 200\n" + "clis_ps_max 0 200\n" + "clis_ps_avg 0 200\n" + "cli_count 0 200\n" "call_dur 143.000000 200\n" "average_call_dur 0.000000 200\n" "forced_term_sess 0 200\n" @@ -6455,6 +6587,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -6679,6 +6819,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -6842,7 +6990,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -6901,6 +7049,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -7119,6 +7269,13 @@ int main(void) { "connects_ps_max 0 200\n" "connects_ps_avg 0 200\n" "connect_count 0 200\n" + "cli_time_min 0.000000 200\n" + "cli_time_max 0.000000 200\n" + "cli_time_avg 0.000000 200\n" + "clis_ps_min 0 200\n" + "clis_ps_max 0 200\n" + "clis_ps_avg 0 200\n" + "cli_count 0 200\n" "call_dur 0.000000 200\n" "average_call_dur 93.000000 200\n" "forced_term_sess 0 200\n" @@ -7593,6 +7750,14 @@ int main(void) { "0.000000\n" "avgconnectdelay\n" "0.000000\n" + "Min/Max/Avg cli processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minclidelay\n" + "0.000000\n" + "maxclidelay\n" + "0.000000\n" + "avgclidelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -7817,6 +7982,14 @@ int main(void) { "0\n" "avgconnectrequestrate\n" "0\n" + "Min/Max/Avg cli requests per second\n" + "0/0/0 per sec\n" + "minclirequestrate\n" + "0\n" + "maxclirequestrate\n" + "0\n" + "avgclirequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -7980,7 +8153,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | Conn | CLI \n" "\n" "]\n" "totalpingcount\n" @@ -8039,6 +8212,8 @@ int main(void) { "0\n" "totalconncount\n" "0\n" + "totalclicount\n" + "0\n" "\n" "}\n" "interfaces\n" diff --git a/utils/rtpengine-ng-client b/utils/rtpengine-ng-client index 360e2dd18..59a093770 100755 --- a/utils/rtpengine-ng-client +++ b/utils/rtpengine-ng-client @@ -100,6 +100,7 @@ my @string_opts = qw( vsc-pause-resume-rec vsc-start-pause-resume-rec rtpp-flags + body ); my @int_opts = qw(