diff --git a/configs/samples/manager.conf.sample b/configs/samples/manager.conf.sample index 405e0d32c55044416c1aac5b88944a6796f4944d..342f290ea7c25fb9f5a57c15b8c5c41e28741d26 100644 --- a/configs/samples/manager.conf.sample +++ b/configs/samples/manager.conf.sample @@ -79,7 +79,18 @@ bindaddr = 0.0.0.0 ; on a action=waitevent request (actually its httptimeout-10) ; c) httptimeout is also the amount of time the webserver keeps ; a http session alive after completing a successful action +; +; disabledevents specifies AMI events which should be completely globally disabled. +; These events will not be available to any AMI listeners. Use this to disable +; frequent events which are not desired for any listeners. Default +; is no events are globally disabled. Event names are case-sensitive. +; Events disabled in stasis.conf do not also need to be disabled here. +; If you don't want to completely disable an AMI event, also consider the +; filter option available on a per-manager user basis to block unwanted +; events from being received in a stream (as opposed to this option which +; would prevent specified events from being generated at all). +;disabledevents = Newexten,Varset ;[mark] ;secret = mysecret diff --git a/doc/CHANGES-staging/manager_disable.txt b/doc/CHANGES-staging/manager_disable.txt new file mode 100644 index 0000000000000000000000000000000000000000..762ceca19e4602b8751f4cb164cbd63981301081 --- /dev/null +++ b/doc/CHANGES-staging/manager_disable.txt @@ -0,0 +1,4 @@ +Subject: ami + +AMI events can now be globally disabled using +the disabledevents [general] setting. diff --git a/main/manager.c b/main/manager.c index 588f1446f6214edc3a33bbe41151617d5e652d40..76a6611a241fd2fb999e88cb86a72fb34d317c08 100644 --- a/main/manager.c +++ b/main/manager.c @@ -1479,6 +1479,7 @@ static int manager_debug = 0; /*!< enable some debugging code in the manager */ static int authtimeout; static int authlimit; static char *manager_channelvars; +static char *manager_disabledevents; #define DEFAULT_REALM "asterisk" static char global_realm[MAXHOSTNAMELEN]; /*!< Default realm */ @@ -7232,6 +7233,15 @@ int __ast_manager_event_multichan(int category, const char *event, int chancount va_list ap; int res; + if (!ast_strlen_zero(manager_disabledevents)) { + if (ast_in_delimited_string(event, manager_disabledevents, ',')) { + ast_debug(3, "AMI Event '%s' is globally disabled, skipping\n", event); + /* Event is globally disabled */ + ao2_cleanup(sessions); + return 0; + } + } + if (!any_manager_listeners(sessions)) { /* Nobody is listening */ ao2_cleanup(sessions); @@ -8696,6 +8706,7 @@ static char *handle_manager_show_settings(struct ast_cli_entry *e, int cmd, stru ast_cli(a->fd, FORMAT, "Display connects:", AST_CLI_YESNO(displayconnects)); ast_cli(a->fd, FORMAT, "Timestamp events:", AST_CLI_YESNO(timestampevents)); ast_cli(a->fd, FORMAT, "Channel vars:", S_OR(manager_channelvars, "")); + ast_cli(a->fd, FORMAT, "Disabled events:", S_OR(manager_disabledevents, "")); ast_cli(a->fd, FORMAT, "Debug:", AST_CLI_YESNO(manager_debug)); #undef FORMAT #undef FORMAT2 @@ -8916,10 +8927,10 @@ static struct ast_cli_entry cli_manager[] = { */ static void load_channelvars(struct ast_variable *var) { - char *parse = NULL; - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(vars)[MAX_VARS]; - ); + char *parse = NULL; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(vars)[MAX_VARS]; + ); ast_free(manager_channelvars); manager_channelvars = ast_strdup(var->value); @@ -8931,6 +8942,18 @@ static void load_channelvars(struct ast_variable *var) ast_channel_set_manager_vars(args.argc, args.vars); } +/*! + * \internal + * \brief Load the config disabledevents variable. + * + * \param var Config variable to load. + */ +static void load_disabledevents(struct ast_variable *var) +{ + ast_free(manager_disabledevents); + manager_disabledevents = ast_strdup(var->value); +} + /*! * \internal * \brief Free a user record. Should already be removed from the list @@ -9045,6 +9068,7 @@ static void manager_shutdown(void) acl_change_stasis_unsubscribe(); ast_free(manager_channelvars); + ast_free(manager_disabledevents); } @@ -9339,6 +9363,8 @@ static int __init_manager(int reload, int by_external_config) } } else if (!strcasecmp(var->name, "channelvars")) { load_channelvars(var); + } else if (!strcasecmp(var->name, "disabledevents")) { + load_disabledevents(var); } else { ast_log(LOG_NOTICE, "Invalid keyword <%s> = <%s> in manager.conf [general]\n", var->name, val);