aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-26 15:10:59 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-26 15:10:59 +0300
commitfadcc85553e2fa00c26233e36c0808f5d0089876 (patch)
treea1748f4fb465da1ec2a97c45517e731efec34894
parentDon't fail on elements decoding (diff)
Put more stuff under supervision
Diffstat (limited to '')
-rw-r--r--src/cyrsasl.erl37
-rw-r--r--src/ejabberd_admin.erl33
-rw-r--r--src/ejabberd_app.erl22
-rw-r--r--src/ejabberd_commands.erl34
-rw-r--r--src/ejabberd_ctl.erl30
-rw-r--r--src/ejabberd_router_mnesia.erl17
-rw-r--r--src/ejabberd_sm_mnesia.erl16
-rw-r--r--src/ejabberd_sup.erl22
-rw-r--r--src/ext_mod.erl34
-rw-r--r--src/mod_bosh_mnesia.erl17
-rw-r--r--src/mod_muc_mnesia.erl17
-rw-r--r--src/translate.erl31
12 files changed, 251 insertions, 59 deletions
diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl
index 014df7e80..6c8370354 100644
--- a/src/cyrsasl.erl
+++ b/src/cyrsasl.erl
@@ -26,14 +26,20 @@
-module(cyrsasl).
-author('alexey@process-one.net').
+-behaviour(gen_server).
--export([start/0, register_mechanism/3, listmech/1,
+-export([start_link/0, register_mechanism/3, listmech/1,
server_new/7, server_start/3, server_step/2,
get_mech/1, format_error/2]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("logger.hrl").
+-record(state, {}).
+
-record(sasl_mechanism,
{mechanism = <<"">> :: mechanism() | '$1',
module :: atom(),
@@ -74,10 +80,15 @@
-export_type([mechanism/0, mechanisms/0, sasl_mechanism/0, error_reason/0,
sasl_state/0, sasl_return/0, sasl_property/0]).
+-callback start(list()) -> any().
+-callback stop() -> any().
-callback mech_new(binary(), fun(), fun(), fun()) -> any().
-callback mech_step(any(), binary()) -> sasl_return().
-start() ->
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
ets:new(sasl_mechanism,
[named_table, public,
{keypos, #sasl_mechanism.mechanism}]),
@@ -86,7 +97,27 @@ start() ->
cyrsasl_scram:start([]),
cyrsasl_anonymous:start([]),
cyrsasl_oauth:start([]),
- ok.
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ cyrsasl_plain:stop(),
+ cyrsasl_digest:stop(),
+ cyrsasl_scram:stop(),
+ cyrsasl_anonymous:stop(),
+ cyrsasl_oauth:stop().
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
-spec format_error(mechanism() | sasl_state(), error_reason()) -> {atom(), binary()}.
format_error(_, unsupported_mechanism) ->
diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl
index b3583c946..9564dd120 100644
--- a/src/ejabberd_admin.erl
+++ b/src/ejabberd_admin.erl
@@ -26,7 +26,9 @@
-module(ejabberd_admin).
-author('mickael.remond@process-one.net').
--export([start/0, stop/0,
+-behaviour(gen_server).
+
+-export([start_link/0,
%% Server
status/0, reopen_log/0, rotate_log/0,
set_loglevel/1,
@@ -54,17 +56,40 @@
restore/1, % Still used by some modules
get_commands_spec/0
]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("ejabberd_commands.hrl").
-start() ->
- ejabberd_commands:register_commands(get_commands_spec()).
+-record(state, {}).
+
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
+ process_flag(trap_exit, true),
+ ejabberd_commands:register_commands(get_commands_spec()),
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
-stop() ->
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
ejabberd_commands:unregister_commands(get_commands_spec()).
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
%%%
%%% ejabberd commands
%%%
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index e51c31cd0..ede045a64 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -46,22 +46,20 @@ start(normal, _Args) ->
start_elixir_application(),
ejabberd:check_app(ejabberd),
db_init(),
- translate:start(),
- ejabberd_access_permissions:start_link(),
- ejabberd_ctl:init(),
- ejabberd_commands:init(),
- ejabberd_admin:start(),
setup_if_elixir_conf_used(),
ejabberd_config:start(),
set_settings_from_config(),
maybe_add_nameservers(),
- cyrsasl:start(),
connect_nodes(),
- Sup = ejabberd_sup:start_link(),
- ext_mod:start(),
- register_elixir_config_hooks(),
- ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
- Sup;
+ case ejabberd_sup:start_link() of
+ {ok, SupPid} ->
+ register_elixir_config_hooks(),
+ ?INFO_MSG("ejabberd ~s is started in the node ~p",
+ [?VERSION, node()]),
+ {ok, SupPid};
+ Err ->
+ Err
+ end;
start(_, _) ->
{error, badarg}.
@@ -70,10 +68,8 @@ start(_, _) ->
%% before shutting down the processes of the application.
prep_stop(State) ->
ejabberd_listener:stop_listeners(),
- ejabberd_admin:stop(),
ejabberd_sm:stop(),
gen_mod:stop_modules(),
- timer:sleep(5000),
State.
%% All the processes were killed when this function is called
diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl
index f56cfc146..d84a671d5 100644
--- a/src/ejabberd_commands.erl
+++ b/src/ejabberd_commands.erl
@@ -210,9 +210,11 @@
-module(ejabberd_commands).
-author('badlop@process-one.net').
+-behaviour(gen_server).
+
-define(DEFAULT_VERSION, 1000000).
--export([init/0,
+-export([start_link/0,
list_commands/0,
list_commands/1,
get_command_format/1,
@@ -238,6 +240,9 @@
get_commands_definition/1,
execute_command2/3,
execute_command2/4]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
-include("ejabberd_commands.hrl").
-include("ejabberd.hrl").
@@ -246,6 +251,8 @@
-define(POLICY_ACCESS, '$policy').
+-record(state, {}).
+
get_commands_spec() ->
[
#ejabberd_commands{name = gen_html_doc_for_commands, tags = [documentation],
@@ -276,7 +283,11 @@ get_commands_spec() ->
result_desc = "0 if command failed, 1 when succedded",
args_example = ["/home/me/docs/api.html", "mod_admin", "java,json"],
result_example = ok}].
-init() ->
+
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
try mnesia:transform_table(ejabberd_commands, ignore,
record_info(fields, ejabberd_commands))
catch exit:{aborted, {no_exists, _}} -> ok
@@ -288,7 +299,24 @@ init() ->
{type, bag}]),
mnesia:add_table_copy(ejabberd_commands, node(), ram_copies),
register_commands(get_commands_spec()),
- ejabberd_access_permissions:register_permission_addon(?MODULE, fun permission_addon/0).
+ ejabberd_access_permissions:register_permission_addon(?MODULE, fun permission_addon/0),
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
-spec register_commands([ejabberd_commands()]) -> ok.
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl
index 32789956c..f006ad5c1 100644
--- a/src/ejabberd_ctl.erl
+++ b/src/ejabberd_ctl.erl
@@ -46,11 +46,15 @@
-module(ejabberd_ctl).
-behaviour(ejabberd_config).
+-behaviour(gen_server).
-author('alexey@process-one.net').
--export([start/0, init/0, process/1, process2/2,
+-export([start/0, start_link/0, process/1, process2/2,
register_commands/3, unregister_commands/3,
opt_type/1]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
-include("ejabberd_ctl.hrl").
-include("ejabberd_commands.hrl").
@@ -59,6 +63,7 @@
-define(DEFAULT_VERSION, 1000000).
+-record(state, {}).
%%-----------------------------
%% Module
@@ -103,10 +108,29 @@ start() ->
end,
halt(Status).
-init() ->
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
ets:new(ejabberd_ctl_cmds, [named_table, set, public]),
- ets:new(ejabberd_ctl_host_cmds, [named_table, set, public]).
+ ets:new(ejabberd_ctl_host_cmds, [named_table, set, public]),
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
%%-----------------------------
%% ejabberdctl Command managment
diff --git a/src/ejabberd_router_mnesia.erl b/src/ejabberd_router_mnesia.erl
index e147fffdf..3ea8a3af1 100644
--- a/src/ejabberd_router_mnesia.erl
+++ b/src/ejabberd_router_mnesia.erl
@@ -28,7 +28,7 @@
host_of_route/1, is_my_route/1, is_my_host/1, get_all_routes/0]).
%% gen_server callbacks
-export([init/1, handle_cast/2, handle_call/3, handle_info/2,
- terminate/2, code_change/3]).
+ terminate/2, code_change/3, start_link/0]).
-include("ejabberd.hrl").
-include("ejabberd_router.hrl").
@@ -40,14 +40,19 @@
%%%===================================================================
%%% API
%%%===================================================================
+-spec init() -> ok | {error, any()}.
init() ->
- case gen_server:start_link({local, ?MODULE}, ?MODULE, [], []) of
- {ok, _Pid} ->
- ok;
- Err ->
- Err
+ Spec = {?MODULE, {?MODULE, start_link, []},
+ transient, 5000, worker, [?MODULE]},
+ case supervisor:start_child(ejabberd_backend_sup, Spec) of
+ {ok, _Pid} -> ok;
+ Err -> Err
end.
+-spec start_link() -> {ok, pid()} | {error, any()}.
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
register_route(Domain, ServerHost, LocalHint, undefined) ->
F = fun () ->
mnesia:write(#route{domain = Domain,
diff --git a/src/ejabberd_sm_mnesia.erl b/src/ejabberd_sm_mnesia.erl
index 028f301ed..35fc42e9d 100644
--- a/src/ejabberd_sm_mnesia.erl
+++ b/src/ejabberd_sm_mnesia.erl
@@ -38,7 +38,7 @@
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+ terminate/2, code_change/3, start_link/0]).
-include("ejabberd.hrl").
-include("ejabberd_sm.hrl").
@@ -51,13 +51,17 @@
%%%===================================================================
-spec init() -> ok | {error, any()}.
init() ->
- case gen_server:start_link({local, ?MODULE}, ?MODULE, [], []) of
- {ok, _Pid} ->
- ok;
- Err ->
- Err
+ Spec = {?MODULE, {?MODULE, start_link, []},
+ transient, 5000, worker, [?MODULE]},
+ case supervisor:start_child(ejabberd_backend_sup, Spec) of
+ {ok, _Pid} -> ok;
+ Err -> Err
end.
+-spec start_link() -> {ok, pid()} | {error, any()}.
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
-spec set_session(#session{}) -> ok.
set_session(Session) ->
mnesia:dirty_write(Session).
diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl
index d8f93ce02..0a33a5c76 100644
--- a/src/ejabberd_sup.erl
+++ b/src/ejabberd_sup.erl
@@ -128,12 +128,33 @@ init([]) ->
permanent, 5000, worker, [ejabberd_sm]},
GenModSupervisor = {ejabberd_gen_mod_sup, {gen_mod, start_link, []},
permanent, infinity, supervisor, [gen_mod]},
+ ExtMod = {ext_mod, {ext_mod, start_link, []},
+ permanent, 5000, worker, [ext_mod]},
Auth = {ejabberd_auth, {ejabberd_auth, start_link, []},
permanent, 5000, worker, [ejabberd_auth]},
OAuth = {ejabberd_oauth, {ejabberd_oauth, start_link, []},
permanent, 5000, worker, [ejabberd_oauth]},
+ Translation = {translate, {translate, start_link, []},
+ permanent, 5000, worker, [translate]},
+ AccessPerms = {ejabberd_access_permissions,
+ {ejabberd_access_permissions, start_link, []},
+ permanent, 5000, worker, [ejabberd_access_permissions]},
+ Ctl = {ejabberd_ctl, {ejabberd_ctl, start_link, []},
+ permanent, 5000, worker, [ejabberd_ctl]},
+ Commands = {ejabberd_commands, {ejabberd_commands, start_link, []},
+ permanent, 5000, worker, [ejabberd_commands]},
+ Admin = {ejabberd_admin, {ejabberd_admin, start_link, []},
+ permanent, 5000, worker, [ejabberd_admin]},
+ CyrSASL = {cyrsasl, {cyrsasl, start_link, []},
+ permanent, 5000, worker, [cyrsasl]},
{ok, {{one_for_one, 10, 1},
[Hooks,
+ CyrSASL,
+ Translation,
+ AccessPerms,
+ Ctl,
+ Commands,
+ Admin,
Listener,
SystemMonitor,
S2S,
@@ -153,5 +174,6 @@ init([]) ->
Local,
SM,
GenModSupervisor,
+ ExtMod,
Auth,
OAuth]}}.
diff --git a/src/ext_mod.erl b/src/ext_mod.erl
index 7090c25a5..00230496a 100644
--- a/src/ext_mod.erl
+++ b/src/ext_mod.erl
@@ -26,9 +26,10 @@
-module(ext_mod).
-behaviour(ejabberd_config).
+-behaviour(gen_server).
-author("Christophe Romain <christophe.romain@process-one.net>").
--export([start/0, stop/0, update/0, check/1,
+-export([start_link/0, update/0, check/1,
available_command/0, available/0, available/1,
installed_command/0, installed/0, installed/1,
install/1, uninstall/1, upgrade/0, upgrade/1,
@@ -37,22 +38,45 @@
-export([compile_erlang_file/2, compile_elixir_file/2]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
-include("ejabberd_commands.hrl").
-include("logger.hrl").
-define(REPOS, "https://github.com/processone/ejabberd-contrib").
-%% -- ejabberd init and commands
+-record(state, {}).
+
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
-start() ->
+init([]) ->
+ process_flag(trap_exit, true),
[code:add_patha(module_ebin_dir(Module))
|| {Module, _} <- installed()],
p1_http:start(),
- ejabberd_commands:register_commands(get_commands_spec()).
+ ejabberd_commands:register_commands(get_commands_spec()),
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
-stop() ->
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
ejabberd_commands:unregister_commands(get_commands_spec()).
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%% -- ejabberd commands
get_commands_spec() ->
[#ejabberd_commands{name = modules_update_specs,
tags = [admin,modules],
diff --git a/src/mod_bosh_mnesia.erl b/src/mod_bosh_mnesia.erl
index b61ef20a1..b96d88d14 100644
--- a/src/mod_bosh_mnesia.erl
+++ b/src/mod_bosh_mnesia.erl
@@ -29,7 +29,7 @@
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+ terminate/2, code_change/3, start_link/0]).
-include("logger.hrl").
@@ -42,14 +42,19 @@
%%%===================================================================
%%% API
%%%===================================================================
+-spec init() -> ok | {error, any()}.
init() ->
- case gen_server:start_link({local, ?MODULE}, ?MODULE, [], []) of
- {ok, _Pid} ->
- ok;
- Err ->
- Err
+ Spec = {?MODULE, {?MODULE, start_link, []},
+ transient, 5000, worker, [?MODULE]},
+ case supervisor:start_child(ejabberd_backend_sup, Spec) of
+ {ok, _Pid} -> ok;
+ Err -> Err
end.
+-spec start_link() -> {ok, pid()} | {error, any()}.
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
open_session(SID, Pid) ->
Session = #bosh{sid = SID, timestamp = p1_time_compat:timestamp(), pid = Pid},
lists:foreach(
diff --git a/src/mod_muc_mnesia.erl b/src/mod_muc_mnesia.erl
index f237c564f..eaf8da6c3 100644
--- a/src/mod_muc_mnesia.erl
+++ b/src/mod_muc_mnesia.erl
@@ -37,7 +37,7 @@
-export([set_affiliation/6, set_affiliations/4, get_affiliation/5,
get_affiliations/3, search_affiliation/4]).
%% gen_server callbacks
--export([init/1, handle_cast/2, handle_call/3, handle_info/2,
+-export([start_link/2, init/1, handle_cast/2, handle_call/3, handle_info/2,
terminate/2, code_change/3]).
-include("mod_muc.hrl").
@@ -51,14 +51,17 @@
%%% API
%%%===================================================================
init(Host, Opts) ->
- Name = gen_mod:get_module_proc(Host, ?MODULE),
- case gen_server:start_link({local, Name}, ?MODULE, [Host, Opts], []) of
- {ok, _Pid} ->
- ok;
- Err ->
- Err
+ Spec = {?MODULE, {?MODULE, start_link, [Host, Opts]},
+ transient, 5000, worker, [?MODULE]},
+ case supervisor:start_child(ejabberd_backend_sup, Spec) of
+ {ok, _Pid} -> ok;
+ Err -> Err
end.
+start_link(Host, Opts) ->
+ Name = gen_mod:get_module_proc(Host, ?MODULE),
+ gen_server:start_link({local, Name}, ?MODULE, [Host, Opts], []).
+
store_room(_LServer, Host, Name, Opts) ->
F = fun () ->
mnesia:write(#muc_room{name_host = {Name, Host},
diff --git a/src/translate.erl b/src/translate.erl
index 43f980ebf..4350fab27 100644
--- a/src/translate.erl
+++ b/src/translate.erl
@@ -27,13 +27,22 @@
-author('alexey@process-one.net').
--export([start/0, load_dir/1, load_file/2,
- translate/2]).
+-behaviour(gen_server).
+
+-export([start_link/0, load_dir/1, load_file/2, translate/2]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("logger.hrl").
-start() ->
+-record(state, {}).
+
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
ets:new(translations, [named_table, public]),
Dir = case os:getenv("EJABBERD_MSGS_PATH") of
false ->
@@ -44,8 +53,24 @@ start() ->
Path -> Path
end,
load_dir(iolist_to_binary(Dir)),
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
ok.
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
-spec load_dir(binary()) -> ok.
load_dir(Dir) ->