提交 dc8d294b authored 作者: Mathieu Rene's avatar Mathieu Rene

Make max argument optional, acting as a counter only. Also set limit_usage and…

Make max argument optional, acting as a counter only. Also set limit_usage and limit_rate channel variables upon limit_hash call.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11213 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 6d35eaf2
...@@ -795,7 +795,7 @@ end: ...@@ -795,7 +795,7 @@ end:
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
#define LIMITHASH_USAGE "<realm> <id> <max>[/interval] [number [dialplan [context]]]" #define LIMITHASH_USAGE "<realm> <id> [<max>[/interval]] [number [dialplan [context]]]"
#define LIMITHASH_DESC "limit access to a resource and transfer to an extension if the limit is exceeded" #define LIMITHASH_DESC "limit access to a resource and transfer to an extension if the limit is exceeded"
SWITCH_STANDARD_APP(limit_hash_function) SWITCH_STANDARD_APP(limit_hash_function)
{ {
...@@ -829,23 +829,27 @@ SWITCH_STANDARD_APP(limit_hash_function) ...@@ -829,23 +829,27 @@ SWITCH_STANDARD_APP(limit_hash_function)
realm = argv[0]; realm = argv[0];
id = argv[1]; id = argv[1];
if ((szinterval = strchr(argv[2], '/')))
{
*szinterval++ = '\0';
interval = atoi(szinterval);
}
max = atoi(argv[2]); /* If max is omitted, only act as a counter and skip maximum checks */
if (argc > 2) {
if ((szinterval = strchr(argv[2], '/')))
{
*szinterval++ = '\0';
interval = atoi(szinterval);
}
max = atoi(argv[2]);
if (max < 0) {
max = 0;
}
}
if (argc >= 4) { if (argc > 3) {
xfer_exten = argv[3]; xfer_exten = argv[3];
} else { } else {
xfer_exten = limit_def_xfer_exten; xfer_exten = limit_def_xfer_exten;
} }
if (max < 0) {
max = 0;
}
hashkey = switch_core_session_sprintf(session, "%s_%s", realm, id); hashkey = switch_core_session_sprintf(session, "%s_%s", realm, id);
...@@ -865,7 +869,7 @@ SWITCH_STANDARD_APP(limit_hash_function) ...@@ -865,7 +869,7 @@ SWITCH_STANDARD_APP(limit_hash_function)
If we didnt, allow incrementing the counter. If we didnt, allow incrementing the counter.
If we did, dont touch it but do the validation anyways If we did, dont touch it but do the validation anyways
*/ */
increment = !!!switch_core_hash_find(channel_hash, hashkey); increment = !switch_core_hash_find(channel_hash, hashkey);
} else { } else {
/* This is the first limit check on this channel, create a hashtable, set our prviate data and add a state handler */ /* This is the first limit check on this channel, create a hashtable, set our prviate data and add a state handler */
new_channel = 1; new_channel = 1;
...@@ -879,13 +883,13 @@ SWITCH_STANDARD_APP(limit_hash_function) ...@@ -879,13 +883,13 @@ SWITCH_STANDARD_APP(limit_hash_function)
/* Always increment rate when its checked as it doesnt depend on the channel */ /* Always increment rate when its checked as it doesnt depend on the channel */
item->rate_usage++; item->rate_usage++;
if (item->rate_usage > (uint32_t)max) { if ((max >= 0) && (item->rate_usage > (uint32_t)max)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s exceeds maximum rate of %d/%ds, now at %d\n", hashkey, max, interval, item->rate_usage); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s exceeds maximum rate of %d/%ds, now at %d\n", hashkey, max, interval, item->rate_usage);
switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]); switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]);
goto end; goto end;
} }
} }
} else if (item->total_usage + increment > (uint32_t)max) { } else if ((max >= 0) && (item->total_usage + increment > (uint32_t)max)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s is already at max value (%d)\n", hashkey, item->total_usage); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s is already at max value (%d)\n", hashkey, item->total_usage);
switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]); switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]);
goto end; goto end;
...@@ -898,14 +902,19 @@ SWITCH_STANDARD_APP(limit_hash_function) ...@@ -898,14 +902,19 @@ SWITCH_STANDARD_APP(limit_hash_function)
switch_core_hash_insert(channel_hash, hashkey, item); switch_core_hash_insert(channel_hash, hashkey, item);
} }
if (interval == 0) { if (max == -1) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d\n", hashkey, item->total_usage);
} else if (interval == 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d\n", hashkey, item->total_usage, max); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d\n", hashkey, item->total_usage, max);
} else { } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d for the last %d seconds\n", hashkey, item->rate_usage, max, interval); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d for the last %d seconds\n", hashkey, item->rate_usage, max, interval);
} }
} }
/* Save current usage & rate into channel variables so it can be used later in the dialplan, or added to CDR records */
switch_channel_set_variable(channel, "limit_usage", switch_core_session_sprintf(session, "%d", item->total_usage));
switch_channel_set_variable(channel, "limit_rate", switch_core_session_sprintf(session, "%d", item->rate_usage));
if (new_channel) { if (new_channel) {
switch_core_hash_init(&channel_hash, switch_core_session_get_pool(session)); switch_core_hash_init(&channel_hash, switch_core_session_get_pool(session));
switch_core_hash_insert(channel_hash, hashkey, item); switch_core_hash_insert(channel_hash, hashkey, item);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论