aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-05-04 22:46:42 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-05-04 22:46:42 +0000
commit8c039db9e2334b5622358088d03a6fcd02508448 (patch)
tree6493bcb66ed916ed981293e3719bf5d3ef424c54 /apps
parentbaf4c0a6fea6b28acb858887941fc4ec48584cc2 (diff)
Add new possible value to autopause option to allow members to be autopaused in all queues.
See the CHANGES file and queues.conf.sample for more details. (closes issue #17008) Reported by: jlpedrosa Patches: queues.autopause_en_review.diff uploaded by jlpedrosa (license 1002) Review: https://reviewboard.asterisk.org/r/581/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@261051 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c59
1 files changed, 54 insertions, 5 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 6e255aa61..5c6297872 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -671,6 +671,12 @@ enum {
QUEUE_STRATEGY_WRANDOM
};
+enum {
+ QUEUE_AUTOPAUSE_OFF = 0,
+ QUEUE_AUTOPAUSE_ON,
+ QUEUE_AUTOPAUSE_ALL
+};
+
enum queue_reload_mask {
QUEUE_RELOAD_PARAMETERS = (1 << 0),
QUEUE_RELOAD_MEMBER = (1 << 1),
@@ -692,6 +698,16 @@ static const struct strategy {
{ QUEUE_STRATEGY_WRANDOM, "wrandom"},
};
+static const struct autopause {
+ int autopause;
+ const char *name;
+} autopausesmodes [] = {
+ { QUEUE_AUTOPAUSE_OFF,"no" },
+ { QUEUE_AUTOPAUSE_ON, "yes" },
+ { QUEUE_AUTOPAUSE_ALL,"all" },
+};
+
+
static struct ast_taskprocessor *devicestate_tps;
#define DEFAULT_RETRY 5
@@ -1037,6 +1053,26 @@ static int strat2int(const char *strategy)
return -1;
}
+static int autopause2int(const char *autopause)
+{
+ int x;
+ /*This 'double check' that default value is OFF */
+ if (ast_strlen_zero(autopause))
+ return QUEUE_AUTOPAUSE_OFF;
+
+ /*This 'double check' is to ensure old values works */
+ if(ast_true(autopause))
+ return QUEUE_AUTOPAUSE_ON;
+
+ for (x = 0; x < ARRAY_LEN(autopausesmodes); x++) {
+ if (!strcasecmp(autopause, autopausesmodes[x].name))
+ return autopausesmodes[x].autopause;
+ }
+
+ /*This 'double check' that default value is OFF */
+ return QUEUE_AUTOPAUSE_OFF;
+}
+
static int queue_hash_cb(const void *obj, const int flags)
{
const struct call_queue *q = obj;
@@ -1466,6 +1502,7 @@ static void init_queue(struct call_queue *q)
q->periodicannouncefrequency = 0;
q->randomperiodicannounce = 0;
q->numperiodicannounce = 0;
+ q->autopause = QUEUE_AUTOPAUSE_OFF;
q->timeoutpriority = TIMEOUT_PRIORITY_APP;
if (!q->members) {
if (q->strategy == QUEUE_STRATEGY_LINEAR)
@@ -1771,7 +1808,7 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
if (!strcasecmp(val, "mixmonitor"))
q->montype = 1;
} else if (!strcasecmp(param, "autopause")) {
- q->autopause = ast_true(val);
+ q->autopause = autopause2int(val);
} else if (!strcasecmp(param, "maxlen")) {
q->maxlen = atoi(val);
if (q->maxlen < 0)
@@ -3128,11 +3165,23 @@ static void rna(int rnatime, struct queue_ent *qe, char *interface, char *member
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
}
ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime);
- if (qe->parent->autopause && pause) {
- if (!set_member_paused(qe->parent->name, interface, "Auto-Pause", 1)) {
- ast_verb(3, "Auto-Pausing Queue Member %s in queue %s since they failed to answer.\n", interface, qe->parent->name);
+ if (qe->parent->autopause != QUEUE_AUTOPAUSE_OFF && pause) {
+ if (qe->parent->autopause == QUEUE_AUTOPAUSE_ON) {
+ if (!set_member_paused(qe->parent->name, interface, "Auto-Pause", 1)) {
+ ast_verb(3, "Auto-Pausing Queue Member %s in queue %s since they failed to answer.\n",
+ interface, qe->parent->name);
+ } else {
+ ast_verb(3, "Failed to pause Queue Member %s in queue %s!\n", interface, qe->parent->name);
+ }
} else {
- ast_verb(3, "Failed to pause Queue Member %s in queue %s!\n", interface, qe->parent->name);
+ /* If queue autopause is mode all, just don't send any queue to stop.
+ * the function will stop in all queues */
+ if (!set_member_paused("", interface, "Auto-Pause", 1)) {
+ ast_verb(3, "Auto-Pausing Queue Member %s in all queues since they failed to answer on queue %s.\n",
+ interface, qe->parent->name);
+ } else {
+ ast_verb(3, "Failed to pause Queue Member %s in all queues!\n", interface);
+ }
}
}
return;