app_queue: Added reason pause of member
authorRodrigo Ramírez Norambuena <a@rodrigoramirez.com>
Sun, 18 Oct 2015 23:22:15 +0000 (20:22 -0300)
committerRodrigo Ramírez Norambuena <a@rodrigoramirez.com>
Mon, 19 Oct 2015 09:35:43 +0000 (06:35 -0300)
In app_queue added value Paused Reason on QueueMemberStatus when a member
on queue is paused and the reason was set.

ASTERISK-25480 #close
Reporte by: Rodrigo Ramírez Norambuena

Change-Id: Ia5db503482f50764c15e2020196c785f59d4a68e

CHANGES
apps/app_queue.c

diff --git a/CHANGES b/CHANGES
index 88743cc..4cf1043 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -184,6 +184,10 @@ cdr_adaptive_odbc
    names. This setting is configurable for cdr_adaptive_odbc via the
    quoted_identifiers in configuration file cdr_adaptive_odbc.conf.
 
+Queue
+-------------------
+ * Added field ReasonPause on QueueMemberStatus if set when paused, the reason
+   the queue member was paused.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.5.0 to Asterisk 13.6.0 ------------
index e043e18..862988b 100644 (file)
@@ -1043,6 +1043,9 @@ ASTERISK_REGISTER_FILE()
                                                <enum name="1"/>
                                        </enumlist>
                                </parameter>
+                               <parameter name="PausedReason">
+                                       <para>If set when paused, the reason the queue member was paused.</para>
+                               </parameter>
                                <parameter name="Ringinuse">
                                        <enumlist>
                                                <enum name="0"/>
@@ -1534,6 +1537,7 @@ struct member {
        int realtime;                        /*!< Is this member realtime? */
        int status;                          /*!< Status of queue member */
        int paused;                          /*!< Are we paused (not accepting calls)? */
+       char reason_paused[80];              /*!< Reason of paused if member is paused */
        int queuepos;                        /*!< In what order (pertains to certain strategies) should this member be called? */
        time_t lastcall;                     /*!< When last successful call was hungup */
        struct call_queue *lastqueue;        /*!< Last queue we received a call */
@@ -2173,7 +2177,7 @@ static void queue_publish_member_blob(struct stasis_message_type *type, struct a
 
 static struct ast_json *queue_member_blob_create(struct call_queue *q, struct member *mem)
 {
-       return ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: i, s: i, s: i, s: i, s: i, s: i}",
+       return ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: i, s: i, s: i, s: i, s: i, s: s, s: i}",
                "Queue", q->name,
                "MemberName", mem->membername,
                "Interface", mem->interface,
@@ -2184,6 +2188,7 @@ static struct ast_json *queue_member_blob_create(struct call_queue *q, struct me
                "LastCall", (int)mem->lastcall,
                "Status", mem->status,
                "Paused", mem->paused,
+               "PausedReason", mem->reason_paused,
                "Ringinuse", mem->ringinuse);
 }
 
@@ -7069,6 +7074,14 @@ static void set_queue_member_pause(struct call_queue *q, struct member *mem, con
        }
 
        mem->paused = paused;
+       if (paused) {
+               if (!ast_strlen_zero(reason)) {
+                       ast_copy_string(mem->reason_paused, reason, sizeof(mem->reason_paused));
+               }
+       } else {
+               ast_copy_string(mem->reason_paused, "", sizeof(mem->reason_paused));
+       }
+
        ast_devstate_changed(mem->paused ? QUEUE_PAUSED_DEVSTATE : QUEUE_UNPAUSED_DEVSTATE,
                AST_DEVSTATE_CACHABLE, "Queue:%s_pause_%s", q->name, mem->interface);
 
@@ -9611,10 +9624,11 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
                                                "LastCall: %d\r\n"
                                                "Status: %d\r\n"
                                                "Paused: %d\r\n"
+                                               "PausedReason: %s\r\n"
                                                "%s"
                                                "\r\n",
                                                q->name, mem->membername, mem->interface, mem->state_interface, mem->dynamic ? "dynamic" : "static",
-                                               mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText);
+                                               mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, mem->reason_paused, idText);
                                        ++q_items;
                                }
                                ao2_ref(mem, -1);
@@ -9768,7 +9782,7 @@ static int manager_pause_queue_member(struct mansession *s, const struct message
        interface = astman_get_header(m, "Interface");
        paused_s = astman_get_header(m, "Paused");
        queuename = astman_get_header(m, "Queue");      /* Optional - if not supplied, pause the given Interface in all queues */
-       reason = astman_get_header(m, "Reason");        /* Optional - Only used for logging purposes */
+       reason = astman_get_header(m, "Reason");        /* Optional */
 
        if (ast_strlen_zero(interface) || ast_strlen_zero(paused_s)) {
                astman_send_error(s, m, "Need 'Interface' and 'Paused' parameters.");