diff --git a/src/include/switch_limit.h b/src/include/switch_limit.h old mode 100644 new mode 100755 diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c old mode 100644 new mode 100755 index ce2fe0c72b..e2146056b5 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -4239,7 +4239,18 @@ SWITCH_STANDARD_API(limit_usage_function) switch_assert(mydata); argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); } - + + if (argc == 2) { + switch_safe_free(mydata); + /* allocate space for "db " */ + mydata = malloc(strlen(cmd) + 10); + switch_assert(mydata); + sprintf(mydata, "db %s", cmd); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Using deprecated limit api: Please specify backend. Defaulting to 'db' backend.\n"); + } + + /* backwards compat version */ if (argc < 3) { stream->write_function(stream, "USAGE: limit_usage %s\n", LIMIT_USAGE_USAGE); goto end; @@ -4265,6 +4276,14 @@ end: return SWITCH_STATUS_SUCCESS; } +#define LIMIT_HASH_USAGE_USAGE " [rate]" +SWITCH_STANDARD_API(limit_hash_usage_function) +{ + char *mydata = NULL; + mydata = switch_core_session_sprintf(session, "hash %s", cmd); + return limit_usage_function(mydata, session, stream); +} + #define LIMIT_STATUS_USAGE "" SWITCH_STANDARD_API(limit_status_function) { @@ -4413,6 +4432,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "in_group", "determine if a user is in a group", in_group_function, "[@] "); SWITCH_ADD_API(commands_api_interface, "is_lan_addr", "see if an ip is a lan addr", lan_addr_function, ""); SWITCH_ADD_API(commands_api_interface, "limit_usage", "Gets the usage count of a limited resource", limit_usage_function, " "); + SWITCH_ADD_API(commands_api_interface, "limit_hash_usage", "Deprecated: gets the usage count of a limited resource", limit_hash_usage_function, " "); SWITCH_ADD_API(commands_api_interface, "limit_status", "Gets the status of a limit backend", limit_status_function, ""); SWITCH_ADD_API(commands_api_interface, "limit_reset", "Reset the counters of a limit backend", limit_reset_function, ""); SWITCH_ADD_API(commands_api_interface, "load", "Load Module", load_function, LOAD_SYNTAX); diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index a8c4d93db6..fd58289553 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -3021,6 +3021,7 @@ SWITCH_STANDARD_APP(limit_function) char *xfer_exten = NULL; int max = -1; int interval = 0; + switch_limit_interface_t *limit = NULL; switch_channel_t *channel = switch_core_session_get_channel(session); /* Parse application data */ @@ -3028,13 +3029,23 @@ SWITCH_STANDARD_APP(limit_function) mydata = switch_core_session_strdup(session, data); argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); } - + if (argc < 3) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "USAGE: limit %s\n", LIMIT_USAGE); return; } backend = argv[0]; + + /* if this is an invalid backend, fallback to db backend */ + /* TODO: remove this when we can! */ + if (!(limit = switch_loadable_module_get_limit_interface(backend))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown backend '%s'. To maintain backwards compatability, falling back on db backend and shifting argumens. Either update your diaplan to include the backend, fix the typo, or load the appropriate limit implementation module.", backend); + mydata = switch_core_session_sprintf(session, "db %s", data); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + backend = argv[0]; + } + realm = argv[1]; id = argv[2]; @@ -3073,8 +3084,17 @@ SWITCH_STANDARD_APP(limit_function) } } +#define LIMIT_HASH_USAGE " [[/interval]] [number [dialplan [context]]]" +#define LIMIT_HASH_DESC "DEPRECATED: limit access to a resource and transfer to an extension if the limit is exceeded" +SWITCH_STANDARD_APP(limit_hash_function) +{ + char *mydata = NULL; + mydata = switch_core_session_sprintf(session, "hash %s", data); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Using deprecated 'limit_hash' api: Please use 'limit hash'.\n"); + limit_function(session, mydata); +} -#define LIMITEXECUTE_USAGE " [[/interval]] [application] [application arguments]" +#define LIMITEXECUTE_USAGE " [/interval] [application arguments]" #define LIMITEXECUTE_DESC "limit access to a resource. the specified application will only be executed if the resource is available" SWITCH_STANDARD_APP(limit_execute_function) { @@ -3094,6 +3114,13 @@ SWITCH_STANDARD_APP(limit_execute_function) mydata = switch_core_session_strdup(session, data); argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); } + + /* backwards compat version, if we have 5, just prepend with db and reparse */ + if (argc == 5) { + mydata = switch_core_session_sprintf(session, "db %s", data); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Using deprecated limit api: Please specify backend. Defaulting to 'db' backend.\n"); + } if (argc < 6) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "USAGE: limit_execute %s\n", LIMITEXECUTE_USAGE); @@ -3140,6 +3167,16 @@ SWITCH_STANDARD_APP(limit_execute_function) } } +#define LIMITHASHEXECUTE_USAGE " [/interval] [application arguments]" +#define LIMITHASHEXECUTE_DESC "DEPRECATED: limit access to a resource. the specified application will only be executed if the resource is available" +SWITCH_STANDARD_APP(limit_hash_execute_function) +{ + char *mydata = NULL; + mydata = switch_core_session_sprintf(session, "hash %s", data); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Using deprecated 'limit_hash_execute' api: Please use 'limit_execute hash'.\n"); + limit_execute_function(session, mydata); +} + #define SPEAK_DESC "Speak text to a channel via the tts interface" #define DISPLACE_DESC "Displace audio from a file to the channels input" #define SESS_REC_DESC "Starts a background recording of the entire session" @@ -3310,7 +3347,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) SWITCH_ADD_APP(app_interface, "session_loglevel", "session_loglevel", "session_loglevel", session_loglevel_function, SESSION_LOGLEVEL_SYNTAX, SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "limit", "Limit", LIMIT_DESC, limit_function, LIMIT_USAGE, SAF_SUPPORT_NOMEDIA); - SWITCH_ADD_APP(app_interface, "limit_execute", "Limit", LIMITEXECUTE_USAGE, limit_execute_function, LIMITEXECUTE_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "limit_hash", "Limit", LIMIT_HASH_DESC, limit_hash_function, LIMIT_HASH_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "limit_execute", "Limit", LIMITEXECUTE_DESC, limit_execute_function, LIMITEXECUTE_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "limit_hash_execute", "Limit", LIMITHASHEXECUTE_DESC, limit_hash_execute_function, LIMITHASHEXECUTE_USAGE, SAF_SUPPORT_NOMEDIA); SWITCH_ADD_DIALPLAN(dp_interface, "inline", inline_dialplan_hunt);