]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
ami: Allow events to be globally disabled.
authorNaveen Albert <asterisk@phreaknet.org>
Sun, 9 Jan 2022 13:32:48 +0000 (13:32 +0000)
committerKevin Harwell <kharwell@digium.com>
Fri, 25 Feb 2022 21:13:11 +0000 (15:13 -0600)
The disabledevents setting has been added to the general section
in manager.conf, which allows users to specify events that
should be globally disabled and not sent to any AMI listeners.

This allows for processing of these AMI events to end sooner and,
for frequent AMI events such as Newexten which users may not have
any need for, allows them to not be processed. Additionally, it also
cleans up core debug as previously when debug was 3 or higher,
the debug was constantly spammed by "Analyzing AMI event" messages
along with a complete dump of the event contents (often for Newexten).

ASTERISK-29853 #close

Change-Id: Id42b9a3722a1f460d745cad1ebc47c537fd4f205

configs/samples/manager.conf.sample
doc/CHANGES-staging/manager_disable.txt [new file with mode: 0644]
main/manager.c

index 989441a615bb6b1ec47a5dc507a57d533b798720..f60c767375a623274f912f5b35958ddb1d1045ea 100644 (file)
@@ -77,7 +77,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 (file)
index 0000000..762ceca
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: ami
+
+AMI events can now be globally disabled using
+the disabledevents [general] setting.
index da10996177e5f13cfe4caf1f230d6848aa9390df..cca477732ad75667b3061699014ecbe1f15ccb6d 100644 (file)
@@ -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 */
@@ -7237,6 +7238,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);
@@ -8701,6 +8711,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
@@ -8921,10 +8932,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);
@@ -8936,6 +8947,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
@@ -9050,6 +9073,7 @@ static void manager_shutdown(void)
        acl_change_stasis_unsubscribe();
 
        ast_free(manager_channelvars);
+       ast_free(manager_disabledevents);
 }
 
 
@@ -9344,6 +9368,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);