--- /home/testerman/asterisk-1.4.0/apps/app_queue.c 2006-11-10 10:36:49.000000000 -0600 +++ apps/app_queue.c 2007-01-04 12:13:43.000000000 -0600 @@ -193,7 +193,7 @@ static char *app_pqm = "PauseQueueMember" ; static char *app_pqm_synopsis = "Pauses a queue member" ; static char *app_pqm_descrip = -" PauseQueueMember([queuename]|interface[|options]):\n" +" PauseQueueMember([queuename]|interface[|options][|reason]):\n" "Pauses (blocks calls for) a queue member.\n" "The given interface will be paused in the given queue. This prevents\n" "any calls from being sent from the queue to the interface until it is\n" @@ -206,6 +206,8 @@ "to jump to exists.\n" "The option string may contain zero or more of the following characters:\n" " 'j' -- jump to +101 priority when appropriate.\n" +"The reason string is entirely optional and is used to add extra information\n" +"to the appropriate queue_log entry.\n" " This application sets the following channel variable upon completion:\n" " PQMSTATUS The status of the attempt to pause a queue member as a\n" " text string, one of\n" @@ -215,12 +217,14 @@ static char *app_upqm = "UnpauseQueueMember" ; static char *app_upqm_synopsis = "Unpauses a queue member" ; static char *app_upqm_descrip = -" UnpauseQueueMember([queuename]|interface[|options]):\n" +" UnpauseQueueMember([queuename]|interface[|options][|reason]):\n" "Unpauses (resumes calls to) a queue member.\n" "This is the counterpart to PauseQueueMember and operates exactly the\n" "same way, except it unpauses instead of pausing the given interface.\n" "The option string may contain zero or more of the following characters:\n" " 'j' -- jump to +101 priority when appropriate.\n" +"The reason string is entirely optional and is used to add extra information\n" +"to the appropriate queue_log entry.\n" " This application sets the following channel variable upon completion:\n" " UPQMSTATUS The status of the attempt to unpause a queue \n" " member as a text string, one of\n" @@ -401,7 +405,7 @@ static AST_LIST_HEAD_STATIC(queues, call_queue); -static int set_member_paused(char *queuename, char *interface, int paused); +static int set_member_paused(char *queuename, char *interface, char *reason, int paused); static void rr_dep_warning(void) { @@ -1836,7 +1840,7 @@ ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", rnatime); ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime); if (qe->parent->autopause) { - if (!set_member_paused(qe->parent->name, interface, 1)) { + if (!set_member_paused(qe->parent->name, interface, "Auto-Pause", 1)) { if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Auto-Pausing Queue Member %s in queue %s since they failed to answer.\n", interface, qe->parent->name); } else { @@ -2846,7 +2850,7 @@ return res; } -static int set_member_paused(char *queuename, char *interface, int paused) +static int set_member_paused(char *queuename, char *interface, char *reason, int paused) { int found = 0; struct call_queue *q; @@ -2870,14 +2874,27 @@ if (queue_persistent_members) dump_queue_members(q); - ast_queue_log(q->name, "NONE", mem->membername, (paused ? "PAUSE" : "UNPAUSE"), "%s", ""); - - manager_event(EVENT_FLAG_AGENT, "QueueMemberPaused", - "Queue: %s\r\n" - "Location: %s\r\n" - "MemberName: %s\r\n" - "Paused: %d\r\n", - q->name, mem->interface, mem->membername, paused); + ast_queue_log(q->name, "NONE", mem->membername, (paused ? "PAUSE" : "UNPAUSE"), "%s", reason); + + if (reason) + { + manager_event(EVENT_FLAG_AGENT, "QueueMemberPaused", + "Queue: %s\r\n" + "Location: %s\r\n" + "MemberName: %s\r\n" + "Paused: %d\r\n" + "Reason: %s\r\n", + q->name, mem->interface, mem->membername, paused, reason); + } + else + { + manager_event(EVENT_FLAG_AGENT, "QueueMemberPaused", + "Queue: %s\r\n" + "Location: %s\r\n" + "MemberName: %s\r\n" + "Paused: %d\r\n", + q->name, mem->interface, mem->membername, paused); + } } } ast_mutex_unlock(&q->lock); @@ -2988,10 +3005,11 @@ AST_APP_ARG(queuename); AST_APP_ARG(interface); AST_APP_ARG(options); + AST_APP_ARG(reason); ); if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "PauseQueueMember requires an argument ([queuename]|interface[|options])\n"); + ast_log(LOG_WARNING, "PauseQueueMember requires an argument ([queuename]|interface[|options][|reason])\n"); return -1; } @@ -3007,12 +3025,12 @@ } if (ast_strlen_zero(args.interface)) { - ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n"); + ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options][|reason])\n"); ast_module_user_remove(lu); return -1; } - if (set_member_paused(args.queuename, args.interface, 1)) { + if (set_member_paused(args.queuename, args.interface, args.reason, 1)) { ast_log(LOG_WARNING, "Attempt to pause interface %s, not found\n", args.interface); if (priority_jump || ast_opt_priority_jumping) { if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { @@ -3041,10 +3059,11 @@ AST_APP_ARG(queuename); AST_APP_ARG(interface); AST_APP_ARG(options); + AST_APP_ARG(reason); ); if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "UnpauseQueueMember requires an argument ([queuename]|interface[|options])\n"); + ast_log(LOG_WARNING, "UnpauseQueueMember requires an argument ([queuename]|interface[|options][|reason])\n"); return -1; } @@ -3060,12 +3079,12 @@ } if (ast_strlen_zero(args.interface)) { - ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n"); + ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options][|reason])\n"); ast_module_user_remove(lu); return -1; } - if (set_member_paused(args.queuename, args.interface, 0)) { + if (set_member_paused(args.queuename, args.interface, args.reason, 0)) { ast_log(LOG_WARNING, "Attempt to unpause interface %s, not found\n", args.interface); if (priority_jump || ast_opt_priority_jumping) { if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { @@ -4214,12 +4233,13 @@ static int manager_pause_queue_member(struct mansession *s, struct message *m) { - char *queuename, *interface, *paused_s; + char *queuename, *interface, *paused_s, *reason; int paused; 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 - exists solely for logging purposes */ if (ast_strlen_zero(interface) || ast_strlen_zero(paused_s)) { astman_send_error(s, m, "Need 'Interface' and 'Paused' parameters."); @@ -4228,7 +4248,7 @@ paused = abs(ast_true(paused_s)); - if (set_member_paused(queuename, interface, paused)) + if (set_member_paused(queuename, interface, reason, paused)) astman_send_error(s, m, "Interface not found"); else astman_send_ack(s, m, paused ? "Interface paused successfully" : "Interface unpaused successfully");