diff --git a/asterisk.c b/asterisk.c index e3daa1febb66b763784dde360301b6d706599ffa..249931ed3a38378b1bc8aef2f1c5f9936b273071 100755 --- a/asterisk.c +++ b/asterisk.c @@ -2081,6 +2081,11 @@ int main(int argc, char *argv[]) printf(term_quit()); exit(1); } + /* load 'preload' modules, required for access to Realtime-mapped configuration files */ + if (load_modules(1)) { + printf(term_quit()); + exit(1); + } ast_channels_init(); if (init_manager()) { printf(term_quit()); @@ -2103,7 +2108,7 @@ int main(int argc, char *argv[]) printf(term_quit()); exit(1); } - if (load_modules()) { + if (load_modules(0)) { printf(term_quit()); exit(1); } diff --git a/config.c b/config.c index dcb5c44e24488f6cb778fca619a13cfae8227ffb..cef3d61cf121ad46f13a94bc2e8f6067a8ec9c79 100755 --- a/config.c +++ b/config.c @@ -787,8 +787,18 @@ void read_config_maps(void) database = strsep(&stringp, ","); table = strsep(&stringp, ","); - if (!strcmp(v->name, extconfig_conf) || !strcmp(v->name, "asterisk.conf")) { - ast_log(LOG_WARNING, "Cannot bind asterisk.conf or extconfig.conf!\n"); + if (!strcmp(v->name, extconfig_conf)) { + ast_log(LOG_WARNING, "Cannot bind '%s'!\n", extconfig_conf); + continue; + } + + if (!strcmp(v->name, "asterisk.conf")) { + ast_log(LOG_WARNING, "Cannot bind 'asterisk.conf'!\n"); + continue; + } + + if (!strcmp(v->name, "logger.conf")) { + ast_log(LOG_WARNING, "Cannot bind 'logger.conf'!\n"); continue; } diff --git a/configs/extconfig.conf.sample b/configs/extconfig.conf.sample index 56ca2d11771fb59fc15f7e462203aa42396a412d..1cf923fb38e608d92363e3cb03e602e77aa2556e 100755 --- a/configs/extconfig.conf.sample +++ b/configs/extconfig.conf.sample @@ -18,7 +18,19 @@ ;uncomment to load queues.conf via the odbc engine. ; ;queues.conf => odbc,asterisk,ast_config - +; +; The following files CANNOT be loaded from Realtime storage: +; asterisk.conf +; extconfig.conf (this file) +; logger.conf +; +; Additionally, the following files cannot be loaded from +; Realtime storage unless the storage driver is loaded +; early using 'preload' statements in modules.conf: +; manager.conf +; cdr.conf +; rtp.conf +; ; ; Realtime configuration engine ; diff --git a/configs/modules.conf.sample b/configs/modules.conf.sample index 8dcee358cfb84740b22e1c630d6ddabb27599968..7162b72da32b1296c866365d247e6d7650975487 100755 --- a/configs/modules.conf.sample +++ b/configs/modules.conf.sample @@ -7,6 +7,16 @@ [modules] autoload=yes ; +; Any modules that need to be loaded before the Asterisk core has been initialized +; (just after the logger has been initialized) can be loaded using 'preload'. This +; will frequently be needed if you wish to map all module configuration files into +; Realtime storage, since the Realtime driver will need to be loaded before the +; modules using those configuration files are initialized. +; +; An example of loading ODBC support would be: +;preload => res_odbc.so +;preload => res_config_odbc.so +; ; If you want, load the GTK console right away. ; Don't load the KDE console since ; it's not as sophisticated right now. diff --git a/include/asterisk.h b/include/asterisk.h index 3b6f565900a56468a0f31831ae284a59480b154e..afba16071321c9940f3ad657334631b81b5c21cb 100755 --- a/include/asterisk.h +++ b/include/asterisk.h @@ -34,7 +34,7 @@ extern char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH]; extern char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH]; /* Provided by module.c */ -extern int load_modules(void); +extern int load_modules(const int preload_only); /* Provided by pbx.c */ extern int load_pbx(void); /* Provided by logger.c */ diff --git a/loader.c b/loader.c index 012491cc111ce21a6abf66f9f7d8ac91e9ab1242..ec85851909ad8237b41856848edc8bf1d4661e0e 100755 --- a/loader.c +++ b/loader.c @@ -450,35 +450,53 @@ static const char *loadorder[] = NULL, }; -int load_modules() +int load_modules(const int preload_only) { struct ast_config *cfg; struct ast_variable *v; char tmp[80]; - if (option_verbose) - ast_verbose( "Asterisk Dynamic Loader Starting:\n"); + + if (option_verbose) { + if (preload_only) + ast_verbose("Asterisk Dynamic Loader loading preload modules:\n"); + else + ast_verbose("Asterisk Dynamic Loader Starting:\n"); + } + cfg = ast_config_load(AST_MODULE_CONFIG); if (cfg) { + int doload; + /* Load explicitly defined modules */ - v = ast_variable_browse(cfg, "modules"); - while(v) { - if (!strcasecmp(v->name, "load")) { + for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) { + doload = 0; + + if (preload_only) + doload = !strcasecmp(v->name, "preload"); + else + doload = !strcasecmp(v->name, "load"); + + if (doload) { if (option_debug && !option_verbose) ast_log(LOG_DEBUG, "Loading module %s\n", v->value); if (option_verbose) { - ast_verbose( VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp))); + ast_verbose(VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp))); fflush(stdout); } if (__load_resource(v->value, cfg)) { ast_log(LOG_WARNING, "Loading module %s failed!\n", v->value); - if (cfg) - ast_config_destroy(cfg); + ast_config_destroy(cfg); return -1; } } - v=v->next; } } + + if (preload_only) { + ast_config_destroy(cfg); + return 0; + } + if (!cfg || ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) { /* Load all modules */ DIR *mods;