aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_app.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_app.erl')
-rw-r--r--src/ejabberd_app.erl121
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.