Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 42638) +++ apps/app_queue.c (working copy) @@ -3951,6 +3951,66 @@ return __queues_show(NULL, 0, fd, argc, argv, 1); } +static int __queues_clear(struct mansession *s, int manager, int fd, int argc, char **argv, int queue_clear) +{ + struct call_queue *q; + char *term = manager ? "\r\n" : "\n"; + + if ((!queue_clear && argc != 2) || (queue_clear && argc != 3)) + return RESULT_SHOWUSAGE; + + /* We only want to load realtime queues when a specific queue is asked for. */ + if (queue_clear) + load_realtime_queue(argv[2]); + + AST_LIST_LOCK(&queues); + if (AST_LIST_EMPTY(&queues)) { + AST_LIST_UNLOCK(&queues); + if (queue_clear) { + if (s) + astman_append(s, "No such queue: %s.%s",argv[2], term); + else + ast_cli(fd, "No such queue: %s.%s",argv[2], term); + } else { + if (s) + astman_append(s, "No queues.%s", term); + else + ast_cli(fd, "No queues.%s", term); + } + return RESULT_SUCCESS; + } + AST_LIST_TRAVERSE(&queues, q, list) { + ast_mutex_lock(&q->lock); + if (queue_clear) { + if (strcasecmp(q->name, argv[2]) != 0) { + ast_mutex_unlock(&q->lock); + if (!AST_LIST_NEXT(q, list)) { + ast_cli(fd, "No such queue: %s.%s",argv[2], term); + break; + } + continue; + } + } + ast_cli(fd, "Clear statistics for %s%s", q->name, term); + clear_queue(q); + ast_mutex_unlock(&q->lock); + if (queue_clear) + break; + } + AST_LIST_UNLOCK(&queues); + return RESULT_SUCCESS; +} + +static int queues_clear(int fd, int argc, char **argv) +{ + return __queues_clear(NULL, 0, fd, argc, argv, 0); +} + +static int queue_clear(int fd, int argc, char **argv) +{ + return __queues_clear(NULL, 0, fd, argc, argv, 1); +} + static char *complete_queue(const char *line, const char *word, int pos, int state) { struct call_queue *q; @@ -3983,6 +4043,17 @@ return RESULT_SUCCESS; } +/* Clear queues statistics */ +static int manager_queues_clear( struct mansession *s, struct message *m ) +{ + char *a[] = { "clear", "queues" }; + + __queues_show(s, 1, -1, 2, a, 0); + astman_append(s, "\r\n\r\n"); /* Properly terminate Manager output */ + + return RESULT_SUCCESS; +} + /* Dump queue status */ static int manager_queues_status( struct mansession *s, struct message *m ) { @@ -4325,9 +4396,25 @@ " Provides summary information on a specified queue.\n"; static struct ast_cli_entry cli_show_queue = { - { "show", "queue", NULL }, queue_show, + { "show", "queue", NULL }, queue_show, "Show status of a specified queue", show_queue_usage, complete_queue }; +static char clear_queues_usage[] = +"Usage: clear queues\n" +" Clear statistic information on call queues.\n"; + +static struct ast_cli_entry cli_clear_queues = { + { "clear", "queues", NULL }, queues_clear, + "Clear statistic information of queues", clear_queues_usage, NULL }; + +static char clear_queue_usage[] = +"Usage: clear queue\n" +" Clear statistic information on a specified queue.\n"; + +static struct ast_cli_entry cli_clear_queue = { + { "clear", "queue", NULL }, queue_clear, + "Clear statistic of a specified queue", clear_queue_usage, complete_queue }; + static char aqm_cmd_usage[] = "Usage: add queue member to [penalty ]\n"; @@ -4348,9 +4435,12 @@ res = ast_cli_unregister(&cli_show_queue); res |= ast_cli_unregister(&cli_show_queues); + res |= ast_cli_unregister(&cli_clear_queue); + res |= ast_cli_unregister(&cli_clear_queues); res |= ast_cli_unregister(&cli_add_queue_member); res |= ast_cli_unregister(&cli_remove_queue_member); res |= ast_manager_unregister("Queues"); + res |= ast_manager_unregister("QueuesClear"); res |= ast_manager_unregister("QueueStatus"); res |= ast_manager_unregister("QueueAdd"); res |= ast_manager_unregister("QueueRemove"); @@ -4383,9 +4473,12 @@ res = ast_register_application(app, queue_exec, synopsis, descrip); res |= ast_cli_register(&cli_show_queue); res |= ast_cli_register(&cli_show_queues); + res |= ast_cli_register(&cli_clear_queue); + res |= ast_cli_register(&cli_clear_queues); res |= ast_cli_register(&cli_add_queue_member); res |= ast_cli_register(&cli_remove_queue_member); res |= ast_manager_register("Queues", 0, manager_queues_show, "Queues"); + res |= ast_manager_register("QueuesClear", 0, manager_queues_clear, "Clear Queues Statistics"); res |= ast_manager_register("QueueStatus", 0, manager_queues_status, "Queue Status"); res |= ast_manager_register("QueueAdd", EVENT_FLAG_AGENT, manager_add_queue_member, "Add interface to queue."); res |= ast_manager_register("QueueRemove", EVENT_FLAG_AGENT, manager_remove_queue_member, "Remove interface from queue.");