diff options
Diffstat (limited to 'src/ejabberd_app.erl')
-rw-r--r-- | src/ejabberd_app.erl | 121 |
1 files changed, 66 insertions, 55 deletions
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 41e284de4..ebb5bbeb2 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -32,42 +32,48 @@ -export([start/2, prep_stop/1, stop/1]). -include("logger.hrl"). +-include("ejabberd_stacktrace.hrl"). %%% %%% Application API %%% start(normal, _Args) -> - {T1, _} = statistics(wall_clock), - ejabberd_logger:start(), - write_pid_file(), - start_included_apps(), - start_elixir_application(), - ejabberd:check_app(ejabberd), - setup_if_elixir_conf_used(), - case ejabberd_config:start() of - ok -> - ejabberd_mnesia:start(), - file_queue_init(), - maybe_add_nameservers(), - case ejabberd_sup:start_link() of - {ok, SupPid} -> - ejabberd_system_monitor:start(), - register_elixir_config_hooks(), - ejabberd_cluster:wait_for_sync(infinity), - ejabberd_hooks:run(ejabberd_started, []), - {T2, _} = statistics(wall_clock), - ?INFO_MSG("ejabberd ~s is started in the node ~p in ~.2fs", - [ejabberd_config:get_version(), - node(), (T2-T1)/1000]), - lists:foreach(fun erlang:garbage_collect/1, processes()), - {ok, SupPid}; - Err -> - ?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]), - ejabberd:halt() - end; - {error, Reason} -> - ?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Reason]), + try + {T1, _} = statistics(wall_clock), + ejabberd_logger:start(), + write_pid_file(), + start_included_apps(), + start_elixir_application(), + setup_if_elixir_conf_used(), + case ejabberd_config:load() of + ok -> + ejabberd_mnesia:start(), + file_queue_init(), + maybe_add_nameservers(), + case ejabberd_sup:start_link() of + {ok, SupPid} -> + ejabberd_system_monitor:start(), + register_elixir_config_hooks(), + ejabberd_cluster:wait_for_sync(infinity), + ejabberd_hooks:run(ejabberd_started, []), + ejabberd:check_apps(), + {T2, _} = statistics(wall_clock), + ?INFO_MSG("ejabberd ~s is started in the node ~p in ~.2fs", + [ejabberd_option:version(), + node(), (T2-T1)/1000]), + {ok, SupPid}; + Err -> + ?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]), + ejabberd:halt() + end; + Err -> + ?CRITICAL_MSG("Failed to start ejabberd application: ~s", + [ejabberd_config:format_error(Err)]), + ejabberd:halt() + end + catch throw:{?MODULE, Error} -> + ?DEBUG("Failed to start ejabberd application: ~p", [Error]), ejabberd:halt() end; start(_, _) -> @@ -92,18 +98,15 @@ start_included_apps() -> prep_stop(State) -> ejabberd_hooks:run(ejabberd_stopping, []), ejabberd_listener:stop_listeners(), - ejabberd_sm:stop(), + _ = ejabberd_sm:stop(), gen_mod:stop_modules(), State. %% All the processes were killed when this function is called stop(_State) -> ?INFO_MSG("ejabberd ~s is stopped in the node ~p", - [ejabberd_config:get_version(), node()]), - delete_pid_file(), - %%ejabberd_debug:stop(), - ok. - + [ejabberd_option:version(), node()]), + delete_pid_file(). %%% %%% Internal functions @@ -134,13 +137,13 @@ write_pid_file() -> end. write_pid_file(Pid, PidFilename) -> - case file:open(PidFilename, [write]) of - {ok, Fd} -> - io:format(Fd, "~s~n", [Pid]), - file:close(Fd); - {error, Reason} -> - ?ERROR_MSG("Cannot write PID file ~s~nReason: ~p", [PidFilename, Reason]), - throw({cannot_write_pid_file, PidFilename, Reason}) + case file:write_file(PidFilename, io_lib:format("~s~n", [Pid])) of + ok -> + ok; + {error, Reason} = Err -> + ?CRITICAL_MSG("Cannot write PID file ~s: ~s", + [PidFilename, file:format_error(Reason)]), + throw({?MODULE, Err}) end. delete_pid_file() -> @@ -152,34 +155,42 @@ delete_pid_file() -> end. file_queue_init() -> - QueueDir = case ejabberd_config:queue_dir() of + QueueDir = case ejabberd_option:queue_dir() of undefined -> MnesiaDir = mnesia:system_info(directory), filename:join(MnesiaDir, "queue"); Path -> Path end, - p1_queue:start(QueueDir). + case p1_queue:start(QueueDir) of + ok -> ok; + Err -> throw({?MODULE, Err}) + end. + +-ifdef(ELIXIR_ENABLED). +is_using_elixir_config() -> + Config = ejabberd_config:path(), + 'Elixir.Ejabberd.ConfigUtil':is_elixir_config(Config). setup_if_elixir_conf_used() -> - case ejabberd_config:is_using_elixir_config() of + case is_using_elixir_config() of true -> 'Elixir.Ejabberd.Config.Store':start_link(); false -> ok end. register_elixir_config_hooks() -> - case ejabberd_config:is_using_elixir_config() of + case is_using_elixir_config() of true -> 'Elixir.Ejabberd.Config':start_hooks(); false -> ok end. start_elixir_application() -> - case ejabberd_config:is_elixir_enabled() of - true -> - case application:ensure_started(elixir) of - ok -> ok; - {error, _Msg} -> ?ERROR_MSG("Elixir application not started.", []) - end; - _ -> - ok + case application:ensure_started(elixir) of + ok -> ok; + {error, _Msg} -> ?ERROR_MSG("Elixir application not started.", []) end. +-else. +setup_if_elixir_conf_used() -> ok. +register_elixir_config_hooks() -> ok. +start_elixir_application() -> ok. +-endif. |