diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | doc/manager.txt | 17 | ||||
-rw-r--r-- | include/asterisk/options.h | 3 | ||||
-rw-r--r-- | main/asterisk.c | 5 | ||||
-rw-r--r-- | main/manager.c | 3 |
5 files changed, 29 insertions, 0 deletions
@@ -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"); |