diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 8c6e13521f..aacb66f798 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1224,7 +1224,9 @@ typedef enum { SCSC_MAX_DTMF_DURATION, SCSC_DEFAULT_DTMF_DURATION, SCSC_SHUTDOWN_ELEGANT, - SCSC_CANCEL_SHUTDOWN + SCSC_SHUTDOWN_ASAP, + SCSC_CANCEL_SHUTDOWN, + SCSC_SEND_SIGHUP } switch_session_ctl_t; typedef struct apr_pool_t switch_memory_pool_t; diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 9671c569a4..2153602462 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -709,7 +709,7 @@ SWITCH_STANDARD_API(status_function) return SWITCH_STATUS_SUCCESS; } -#define CTL_SYNTAX "[hupall|pause|resume|shutdown [cancel|elegant|restart]|sps|sync_clock|reclaim_mem|max_sessions|max_dtmf_duration [num]|loglevel [level]]" +#define CTL_SYNTAX "[send_sighup|hupall|pause|resume|shutdown [cancel|elegant|asap|restart]|sps|sync_clock|reclaim_mem|max_sessions|max_dtmf_duration [num]|loglevel [level]]" SWITCH_STANDARD_API(ctl_function) { int argc; @@ -732,6 +732,10 @@ SWITCH_STANDARD_API(ctl_function) arg = 1; switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg); stream->write_function(stream, "+OK\n"); + } else if (!strcasecmp(argv[0], "send_sighup")) { + arg = 1; + switch_core_session_ctl(SCSC_SEND_SIGHUP, &arg); + stream->write_function(stream, "+OK\n"); } else if (!strcasecmp(argv[0], "resume")) { arg = 0; switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg); @@ -748,6 +752,8 @@ SWITCH_STANDARD_API(ctl_function) break; } else if (!strcasecmp(argv[x], "elegant")) { command = SCSC_SHUTDOWN_ELEGANT; + } else if (!strcasecmp(argv[x], "asap")) { + command = SCSC_SHUTDOWN_ASAP; } else if (!strcasecmp(argv[x], "restart")) { arg = 1; } @@ -1789,25 +1795,6 @@ SWITCH_STANDARD_API(originate_function) return status; } -static void sch_api_callback(switch_scheduler_task_t *task) -{ - char *cmd, *arg = NULL; - switch_stream_handle_t stream = { 0 }; - - switch_assert(task); - - cmd = (char *) task->cmd_arg; - - if ((arg = strchr(cmd, ' '))) { - *arg++ = '\0'; - } - - SWITCH_STANDARD_STREAM(stream); - switch_api_execute(cmd, arg, NULL, &stream); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Command %s(%s):\n%s\n", cmd, switch_str_nil(arg), switch_str_nil((char *) stream.data)); - switch_safe_free(stream.data); -} - SWITCH_STANDARD_API(sched_del_function) { uint32_t cnt = 0; @@ -1879,14 +1866,65 @@ SWITCH_STANDARD_API(xml_wrap_api_function) return SWITCH_STATUS_SUCCESS; } +struct api_task { + uint32_t recur; + char cmd[]; +}; + +static void sch_api_callback(switch_scheduler_task_t *task) +{ + char *cmd, *arg = NULL; + switch_stream_handle_t stream = { 0 }; + struct api_task *api_task = (struct api_task *) task->cmd_arg; + switch_assert(task); + + cmd = strdup(api_task->cmd); + switch_assert(cmd); + + if ((arg = strchr(cmd, ' '))) { + *arg++ = '\0'; + } + + SWITCH_STANDARD_STREAM(stream); + switch_api_execute(cmd, arg, NULL, &stream); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Command %s(%s):\n%s\n", cmd, switch_str_nil(arg), switch_str_nil((char *) stream.data)); + switch_safe_free(stream.data); + switch_safe_free(cmd); + + if (api_task->recur) { + task->runtime = switch_timestamp(NULL) + api_task->recur; + } + + +} + +#define UNSCHED_SYNTAX "" +SWITCH_STANDARD_API(unsched_api_function) +{ + uint32_t id; + + if (!cmd) { + stream->write_function(stream, "-ERR Invalid syntax. USAGE: %s\n", UNSCHED_SYNTAX); + return SWITCH_STATUS_SUCCESS; + } + + if ((id = (uint32_t) atol(cmd))) { + stream->write_function(stream, "%s\n", switch_scheduler_del_task_id(id) ? "+OK" : "-ERR no such id"); + } + + return SWITCH_STATUS_SUCCESS; +} + +#define SCHED_SYNTAX "[+@]