From f4e88b56e08ff3e701ff274e7150bc608eca80ed Mon Sep 17 00:00:00 2001 From: Igor Goncharovsky Date: Tue, 2 Sep 2025 12:50:19 +0600 Subject: [PATCH] app_queue.c: Add new global 'log_unpause_on_reason_change' In many asterisk-based systems, the pause reason is used to separate pauses by type,and logically, changing the reason defines two intervals that should be accounted for separately. The introduction of a new option allows me to separate the intervals of operator inactivity in the log by the event of unpausing. UserNote: Add new global option 'log_unpause_on_reason_change' that is default disabled. When enabled cause addition of UNPAUSE event on every re-PAUSE with reason changed. --- apps/app_queue.c | 12 ++++++++++++ configs/samples/queues.conf.sample | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/apps/app_queue.c b/apps/app_queue.c index 39a2a17505..a9d8d2495a 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -1801,6 +1801,9 @@ static int force_longest_waiting_caller; /*! \brief queues.conf [general] option */ static int log_caller_id_name; +/*! \brief queues.conf [general] option */ +static int log_unpause_on_reason_change; + /*! \brief name of the ringinuse field in the realtime database */ static char *realtime_ringinuse_field; @@ -8068,6 +8071,11 @@ static void set_queue_member_pause(struct call_queue *q, struct member *mem, con if (mem->paused == paused) { ast_debug(1, "%spausing already-%spaused queue member %s:%s\n", (paused ? "" : "un"), (paused ? "" : "un"), q->name, mem->interface); + if (log_unpause_on_reason_change && paused) { + if (!ast_strings_equal(mem->reason_paused, reason)) { + ast_queue_log(q->name, "NONE", mem->membername, "UNPAUSE", "%s", "Auto-Unpause"); + } + } } if (mem->realtime && !ast_strlen_zero(mem->rt_uniqueid)) { @@ -9900,6 +9908,7 @@ static void queue_reset_global_params(void) negative_penalty_invalid = 0; log_membername_as_agent = 0; force_longest_waiting_caller = 0; + log_unpause_on_reason_change = 0; } /*! Set the global queue parameters as defined in the "general" section of queues.conf */ @@ -9928,6 +9937,9 @@ static void queue_set_global_params(struct ast_config *cfg) if ((general_val = ast_variable_retrieve(cfg, "general", "force_longest_waiting_caller"))) { force_longest_waiting_caller = ast_true(general_val); } + if ((general_val = ast_variable_retrieve(cfg, "general", "log_unpause_on_reason_change"))) { + log_unpause_on_reason_change = ast_true(general_val); + } /* Apply log-caller-id-name in the same place as other global settings */ if ((general_val = ast_variable_retrieve(cfg, "general", "log-caller-id-name"))) { log_caller_id_name = ast_true(general_val); diff --git a/configs/samples/queues.conf.sample b/configs/samples/queues.conf.sample index 63e1e21dbe..f340e0089b 100644 --- a/configs/samples/queues.conf.sample +++ b/configs/samples/queues.conf.sample @@ -82,6 +82,11 @@ monitor-type = MixMonitor ; ;force_longest_waiting_caller = no ; +; Add unpause event to queue log in case of pause send twice with different reason code. +; +;log_unpause_on_reason_change = no +; +; ;[markq] ; ; A sample call queue