aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--doc/manager.txt17
-rw-r--r--include/asterisk/options.h3
-rw-r--r--main/asterisk.c5
-rw-r--r--main/manager.c3
5 files changed, 29 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index 61237a2e1..021eb8041 100644
--- a/Makefile
+++ b/Makefile
@@ -624,6 +624,7 @@ samples: adsi
echo " ; to the device. It is for this reason that this is optional, as it may result in requiring a" ; \
echo " ; temporary codec translation path for a channel that may not otherwise require one." ; \
echo ";transcode_via_sln = yes ; Build transcode paths via SLINEAR, instead of directly" ; \
+ echo ";sendfullybooted = yes ; Send the FullyBooted AMI event on AMI login and when all modules are finished loading" ; \
echo ";runuser = asterisk ; The user to run as" ; \
echo ";rungroup = asterisk ; The group to run as" ; \
echo ";dahdichanname = yes ; Channels created by chan_dahdi will be called 'DAHDI', otherwise 'Zap'" ; \
diff --git a/doc/manager.txt b/doc/manager.txt
index a0a832c8d..b6cc6f35b 100644
--- a/doc/manager.txt
+++ b/doc/manager.txt
@@ -122,6 +122,23 @@ Parameters: Channel, Timeout
You can always get more information about a manager command
with the "show manager command <command>" CLI command in Asterisk.
+Determining when all modules have finished loading
+--------------------------------------------------
+It is handy to have a single event notification for when all Asterisk
+modules have been loaded--especially for situations like running
+automated tests. This event will fire 1) immediately upon all modules
+loading or 2) upon connection to the AMI interface if the modules have
+already finished loading before the connection was made. This ensures
+that a user will never miss getting a FullyBooted event. In vary rare
+circumstances, it might be possible to get two copies of the message
+if the AMI connection is made right as the modules finish loading.
+
+Example:
+ Event: FullyBooted
+ Privilege: system,all
+ Status: Fully Booted
+
+
Examples
--------
Login - Log a user into the manager interface.
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index c33006606..80376e6d2 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -83,6 +83,8 @@ enum ast_option_flags {
AST_OPT_FLAG_MUTE = (1 << 22),
/*! Generic PLC */
AST_OPT_FLAG_GENERIC_PLC = (1 << 23),
+ /*! Send the FullyBooted AMI event when all modules are loaded */
+ AST_OPT_FLAG_SEND_FULLYBOOTED = (1 << 24),
};
/*! These are the options that set by default when Asterisk starts */
@@ -116,6 +118,7 @@ enum ast_option_flags {
#define ast_opt_always_fork ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
#define ast_opt_mute ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)
#define ast_opt_generic_plc ast_test_flag(&ast_options, AST_OPT_FLAG_GENERIC_PLC)
+#define ast_opt_send_fullybooted ast_test_flag(&ast_options, AST_OPT_FLAG_SEND_FULLYBOOTED)
extern struct ast_flags ast_options;
diff --git a/main/asterisk.c b/main/asterisk.c
index 14dbd9a38..bdf9d5c39 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -2666,6 +2666,8 @@ static void ast_readconfig(void)
_dahdi_chan_mode = CHAN_ZAP_MODE;
}
#endif
+ } else if (!strcasecmp(v->name, "sendfullybooted")) {
+ ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_SEND_FULLYBOOTED);
}
}
ast_config_destroy(cfg);
@@ -3192,6 +3194,9 @@ int main(int argc, char *argv[])
sig_alert_pipe[0] = sig_alert_pipe[1] = -1;
ast_set_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED);
+ if (ast_opt_send_fullybooted) {
+ manager_event(EVENT_FLAG_SYSTEM, "FullyBooted", "Status: Fully Booted\r\n");
+ }
ast_process_pending_reloads();
diff --git a/main/manager.c b/main/manager.c
index bf19199c0..fec3dc070 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -2300,6 +2300,9 @@ static int process_message(struct mansession *s, const struct message *m)
ast_log(LOG_EVENT, "%sManager '%s' logged on from %s\n",
(s->session->sessiontimeout ? "HTTP " : ""), s->session->username, ast_inet_ntoa(s->session->sin.sin_addr));
astman_send_ack(s, m, "Authentication accepted");
+ if (ast_opt_send_fullybooted && ast_test_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)) {
+ manager_event(EVENT_FLAG_SYSTEM, "FullyBooted", "Status: Fully Booted\r\n");
+ }
}
} else if (!strcasecmp(action, "Logoff")) {
astman_send_ack(s, m, "See ya");