Improve startup procedure
This commit is contained in:
parent
5b112c86bf
commit
67d6ca9f10
28
src/acl.erl
28
src/acl.erl
|
@ -25,12 +25,13 @@
|
||||||
|
|
||||||
-module(acl).
|
-module(acl).
|
||||||
|
|
||||||
|
-behaviour(gen_server).
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
|
|
||||||
-author('alexey@process-one.net').
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
-export([add_access/3, clear/0]).
|
-export([add_access/3, clear/0]).
|
||||||
-export([start/0, add/3, add_list/3, add_local/3, add_list_local/3,
|
-export([start_link/0, add/3, add_list/3, add_local/3, add_list_local/3,
|
||||||
load_from_config/0, match_rule/3, any_rules_allowed/3,
|
load_from_config/0, match_rule/3, any_rules_allowed/3,
|
||||||
transform_options/1, opt_type/1, acl_rule_matches/3,
|
transform_options/1, opt_type/1, acl_rule_matches/3,
|
||||||
acl_rule_verify/1, access_matches/3,
|
acl_rule_verify/1, access_matches/3,
|
||||||
|
@ -38,6 +39,9 @@
|
||||||
parse_ip_netmask/1,
|
parse_ip_netmask/1,
|
||||||
access_rules_validator/1, shaper_rules_validator/1,
|
access_rules_validator/1, shaper_rules_validator/1,
|
||||||
normalize_spec/1, resolve_access/2]).
|
normalize_spec/1, resolve_access/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("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
@ -46,6 +50,7 @@
|
||||||
-record(acl, {aclname, aclspec}).
|
-record(acl, {aclname, aclspec}).
|
||||||
-record(access, {name :: aclname(),
|
-record(access, {name :: aclname(),
|
||||||
rules = [] :: [access_rule()]}).
|
rules = [] :: [access_rule()]}).
|
||||||
|
-record(state, {}).
|
||||||
|
|
||||||
-type regexp() :: binary().
|
-type regexp() :: binary().
|
||||||
-type iprange() :: {inet:ip_address(), integer()} | binary().
|
-type iprange() :: {inet:ip_address(), integer()} | binary().
|
||||||
|
@ -75,7 +80,10 @@
|
||||||
|
|
||||||
-export_type([acl/0]).
|
-export_type([acl/0]).
|
||||||
|
|
||||||
start() ->
|
start_link() ->
|
||||||
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
init([]) ->
|
||||||
ejabberd_mnesia:create(?MODULE, acl,
|
ejabberd_mnesia:create(?MODULE, acl,
|
||||||
[{ram_copies, [node()]}, {type, bag},
|
[{ram_copies, [node()]}, {type, bag},
|
||||||
{local_content, true},
|
{local_content, true},
|
||||||
|
@ -88,8 +96,24 @@ start() ->
|
||||||
mnesia:add_table_copy(access, node(), ram_copies),
|
mnesia:add_table_copy(access, node(), ram_copies),
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, load_from_config, 20),
|
ejabberd_hooks:add(config_reloaded, ?MODULE, load_from_config, 20),
|
||||||
load_from_config(),
|
load_from_config(),
|
||||||
|
{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.
|
ok.
|
||||||
|
|
||||||
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
||||||
-spec add(binary(), aclname(), aclspec()) -> ok | {error, any()}.
|
-spec add(binary(), aclname(), aclspec()) -> ok | {error, any()}.
|
||||||
|
|
||||||
add(Host, ACLName, ACLSpec) ->
|
add(Host, ACLName, ACLSpec) ->
|
||||||
|
|
|
@ -30,8 +30,7 @@
|
||||||
|
|
||||||
-behaviour(application).
|
-behaviour(application).
|
||||||
|
|
||||||
-export([start/2, prep_stop/1, stop/1,
|
-export([start/2, prep_stop/1, stop/1, opt_type/1]).
|
||||||
init/0, opt_type/1]).
|
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
@ -46,9 +45,7 @@ start(normal, _Args) ->
|
||||||
start_apps(),
|
start_apps(),
|
||||||
start_elixir_application(),
|
start_elixir_application(),
|
||||||
ejabberd:check_app(ejabberd),
|
ejabberd:check_app(ejabberd),
|
||||||
randoms:start(),
|
|
||||||
db_init(),
|
db_init(),
|
||||||
start(),
|
|
||||||
translate:start(),
|
translate:start(),
|
||||||
ejabberd_access_permissions:start_link(),
|
ejabberd_access_permissions:start_link(),
|
||||||
ejabberd_ctl:init(),
|
ejabberd_ctl:init(),
|
||||||
|
@ -57,25 +54,11 @@ start(normal, _Args) ->
|
||||||
setup_if_elixir_conf_used(),
|
setup_if_elixir_conf_used(),
|
||||||
ejabberd_config:start(),
|
ejabberd_config:start(),
|
||||||
set_settings_from_config(),
|
set_settings_from_config(),
|
||||||
|
maybe_add_nameservers(),
|
||||||
|
cyrsasl:start(),
|
||||||
connect_nodes(),
|
connect_nodes(),
|
||||||
Sup = ejabberd_sup:start_link(),
|
Sup = ejabberd_sup:start_link(),
|
||||||
acl:start(),
|
|
||||||
shaper:start(),
|
|
||||||
ejabberd_rdbms:start(),
|
|
||||||
ejabberd_riak_sup:start(),
|
|
||||||
ejabberd_redis:start(),
|
|
||||||
ejabberd_router:start(),
|
|
||||||
ejabberd_router_multicast:start(),
|
|
||||||
ejabberd_local:start(),
|
|
||||||
ejabberd_sm:start(),
|
|
||||||
cyrsasl:start(),
|
|
||||||
gen_mod:start(),
|
|
||||||
ext_mod:start(),
|
ext_mod:start(),
|
||||||
maybe_add_nameservers(),
|
|
||||||
ejabberd_auth:start(),
|
|
||||||
ejabberd_oauth:start(),
|
|
||||||
gen_mod:start_modules(),
|
|
||||||
ejabberd_listener:start_listeners(),
|
|
||||||
register_elixir_config_hooks(),
|
register_elixir_config_hooks(),
|
||||||
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
|
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
|
||||||
Sup;
|
Sup;
|
||||||
|
@ -105,19 +88,6 @@ stop(_State) ->
|
||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%
|
%%%
|
||||||
|
|
||||||
start() ->
|
|
||||||
spawn_link(?MODULE, init, []).
|
|
||||||
|
|
||||||
init() ->
|
|
||||||
register(ejabberd, self()),
|
|
||||||
loop().
|
|
||||||
|
|
||||||
loop() ->
|
|
||||||
receive
|
|
||||||
_ ->
|
|
||||||
loop()
|
|
||||||
end.
|
|
||||||
|
|
||||||
db_init() ->
|
db_init() ->
|
||||||
ejabberd_config:env_binary_to_list(mnesia, dir),
|
ejabberd_config:env_binary_to_list(mnesia, dir),
|
||||||
MyNode = node(),
|
MyNode = node(),
|
||||||
|
|
|
@ -27,12 +27,13 @@
|
||||||
|
|
||||||
-module(ejabberd_auth).
|
-module(ejabberd_auth).
|
||||||
|
|
||||||
|
-behaviour(gen_server).
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
|
|
||||||
-author('alexey@process-one.net').
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start/0, start/1, stop/1, set_password/3, check_password/4,
|
-export([start_link/0, start/1, stop/1, set_password/3, check_password/4,
|
||||||
check_password/6, check_password_with_authmodule/4,
|
check_password/6, check_password_with_authmodule/4,
|
||||||
check_password_with_authmodule/6, try_register/3,
|
check_password_with_authmodule/6, try_register/3,
|
||||||
dirty_get_registered_users/0, get_vh_registered_users/1,
|
dirty_get_registered_users/0, get_vh_registered_users/1,
|
||||||
|
@ -43,12 +44,17 @@
|
||||||
is_user_exists/2, is_user_exists_in_other_modules/3,
|
is_user_exists/2, is_user_exists_in_other_modules/3,
|
||||||
remove_user/2, remove_user/3, plain_password_required/1,
|
remove_user/2, remove_user/3, plain_password_required/1,
|
||||||
store_type/1, entropy/1, backend_type/1]).
|
store_type/1, entropy/1, backend_type/1]).
|
||||||
|
%% gen_server callbacks
|
||||||
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
|
terminate/2, code_change/3]).
|
||||||
|
|
||||||
-export([auth_modules/1, opt_type/1]).
|
-export([auth_modules/1, opt_type/1]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
|
||||||
|
-record(state, {}).
|
||||||
|
|
||||||
-type scrammed_password() :: {binary(), binary(), binary(), non_neg_integer()}.
|
-type scrammed_password() :: {binary(), binary(), binary(), non_neg_integer()}.
|
||||||
-type password() :: binary() | scrammed_password().
|
-type password() :: binary() | scrammed_password().
|
||||||
-export_type([password/0]).
|
-export_type([password/0]).
|
||||||
|
@ -81,11 +87,34 @@
|
||||||
-callback get_password(binary(), binary()) -> false | password().
|
-callback get_password(binary(), binary()) -> false | password().
|
||||||
-callback get_password_s(binary(), binary()) -> password().
|
-callback get_password_s(binary(), binary()) -> password().
|
||||||
|
|
||||||
start() ->
|
-spec start_link() -> {ok, pid()} | {error, any()}.
|
||||||
|
start_link() ->
|
||||||
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
init([]) ->
|
||||||
ets:new(ejabberd_auth_modules, [named_table, public]),
|
ets:new(ejabberd_auth_modules, [named_table, public]),
|
||||||
ejabberd_hooks:add(host_up, ?MODULE, start, 30),
|
ejabberd_hooks:add(host_up, ?MODULE, start, 30),
|
||||||
ejabberd_hooks:add(host_down, ?MODULE, stop, 80),
|
ejabberd_hooks:add(host_down, ?MODULE, stop, 80),
|
||||||
lists:foreach(fun start/1, ?MYHOSTS).
|
lists:foreach(fun start/1, ?MYHOSTS),
|
||||||
|
{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) ->
|
||||||
|
ejabberd_hooks:delete(host_up, ?MODULE, start, 30),
|
||||||
|
ejabberd_hooks:delete(host_down, ?MODULE, stop, 80),
|
||||||
|
lists:foreach(fun stop/1, ?MYHOSTS).
|
||||||
|
|
||||||
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
||||||
start(Host) ->
|
start(Host) ->
|
||||||
Modules = auth_modules_from_config(Host),
|
Modules = auth_modules_from_config(Host),
|
||||||
|
|
|
@ -86,12 +86,12 @@ start(Host) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
||||||
ChildSpec = {Proc, {?MODULE, start_link, [Host]},
|
ChildSpec = {Proc, {?MODULE, start_link, [Host]},
|
||||||
transient, 1000, worker, [?MODULE]},
|
transient, 1000, worker, [?MODULE]},
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
supervisor:start_child(ejabberd_backend_sup, ChildSpec).
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
||||||
supervisor:terminate_child(ejabberd_sup, Proc),
|
supervisor:terminate_child(ejabberd_backend_sup, Proc),
|
||||||
supervisor:delete_child(ejabberd_sup, Proc).
|
supervisor:delete_child(ejabberd_backend_sup, Proc).
|
||||||
|
|
||||||
start_link(Host) ->
|
start_link(Host) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
Proc = gen_mod:get_module_proc(Host, ?MODULE),
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% Created : 24 Feb 2017 by Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%%
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2017 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% This program is free software; you can redistribute it and/or
|
||||||
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
%%% published by the Free Software Foundation; either version 2 of the
|
||||||
|
%%% License, or (at your option) any later version.
|
||||||
|
%%%
|
||||||
|
%%% This program is distributed in the hope that it will be useful,
|
||||||
|
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
%%% General Public License for more details.
|
||||||
|
%%%
|
||||||
|
%%% You should have received a copy of the GNU General Public License along
|
||||||
|
%%% with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
-module(ejabberd_backend_sup).
|
||||||
|
|
||||||
|
-behaviour(supervisor).
|
||||||
|
|
||||||
|
%% API
|
||||||
|
-export([start_link/0]).
|
||||||
|
|
||||||
|
%% Supervisor callbacks
|
||||||
|
-export([init/1]).
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% API functions
|
||||||
|
%%%===================================================================
|
||||||
|
start_link() ->
|
||||||
|
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% Supervisor callbacks
|
||||||
|
%%%===================================================================
|
||||||
|
init([]) ->
|
||||||
|
{ok, {{one_for_one, 10, 1}, []}}.
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% Internal functions
|
||||||
|
%%%===================================================================
|
|
@ -45,58 +45,29 @@ start_link() ->
|
||||||
|
|
||||||
|
|
||||||
init(_) ->
|
init(_) ->
|
||||||
ets:new(listen_sockets, [named_table, public]),
|
{ok, {{one_for_one, 10, 1}, listeners_childspec()}}.
|
||||||
bind_tcp_ports(),
|
|
||||||
{ok, {{one_for_one, 10, 1}, []}}.
|
|
||||||
|
|
||||||
bind_tcp_ports() ->
|
listeners_childspec() ->
|
||||||
case ejabberd_config:get_option(listen, fun validate_cfg/1) of
|
case ejabberd_config:get_option(listen, fun validate_cfg/1) of
|
||||||
undefined ->
|
undefined ->
|
||||||
ignore;
|
[];
|
||||||
Ls ->
|
Ls ->
|
||||||
lists:foreach(
|
Specs = lists:map(
|
||||||
fun({Port, Module, Opts}) ->
|
fun({Port, Module, Opts}) ->
|
||||||
case Module:socket_type() of
|
maybe_start_sip(Module),
|
||||||
independent -> ok;
|
{Port,
|
||||||
_ ->
|
{?MODULE, start, [Port, Module, Opts]},
|
||||||
bind_tcp_port(Port, Module, Opts)
|
transient,
|
||||||
end
|
brutal_kill,
|
||||||
end, Ls)
|
worker,
|
||||||
end.
|
[?MODULE]}
|
||||||
|
end, Ls),
|
||||||
bind_tcp_port(PortIP, Module, RawOpts) ->
|
report_duplicated_portips(Ls),
|
||||||
try check_listener_options(RawOpts) of
|
Specs
|
||||||
ok ->
|
|
||||||
{Port, IPT, IPS, IPV, Proto, OptsClean} = parse_listener_portip(PortIP, RawOpts),
|
|
||||||
{_Opts, SockOpts} = prepare_opts(IPT, IPV, OptsClean),
|
|
||||||
case Proto of
|
|
||||||
udp -> ok;
|
|
||||||
_ ->
|
|
||||||
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
|
|
||||||
ets:insert(listen_sockets, {PortIP, ListenSocket}),
|
|
||||||
ok
|
|
||||||
end
|
|
||||||
catch
|
|
||||||
throw:{error, Error} ->
|
|
||||||
?ERROR_MSG(Error, [])
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
start_listeners() ->
|
start_listeners() ->
|
||||||
case ejabberd_config:get_option(listen, fun validate_cfg/1) of
|
ok.
|
||||||
undefined ->
|
|
||||||
ignore;
|
|
||||||
Ls ->
|
|
||||||
Ls2 = lists:map(
|
|
||||||
fun({Port, Module, Opts}) ->
|
|
||||||
case start_listener(Port, Module, Opts) of
|
|
||||||
{ok, _Pid} = R -> R;
|
|
||||||
{error, Error} ->
|
|
||||||
throw(Error)
|
|
||||||
end
|
|
||||||
end, Ls),
|
|
||||||
report_duplicated_portips(Ls),
|
|
||||||
{ok, {{one_for_one, 10, 1}, Ls2}}
|
|
||||||
end.
|
|
||||||
|
|
||||||
report_duplicated_portips(L) ->
|
report_duplicated_portips(L) ->
|
||||||
LKeys = [Port || {Port, _, _} <- L],
|
LKeys = [Port || {Port, _, _} <- L],
|
||||||
|
@ -144,6 +115,9 @@ init_udp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
|
||||||
{ok, Socket} ->
|
{ok, Socket} ->
|
||||||
%% Inform my parent that this port was opened succesfully
|
%% Inform my parent that this port was opened succesfully
|
||||||
proc_lib:init_ack({ok, self()}),
|
proc_lib:init_ack({ok, self()}),
|
||||||
|
start_module_sup(Port, Module),
|
||||||
|
?INFO_MSG("Start accepting UDP connections at ~s for ~p",
|
||||||
|
[format_portip(PortIP), Module]),
|
||||||
case erlang:function_exported(Module, udp_init, 2) of
|
case erlang:function_exported(Module, udp_init, 2) of
|
||||||
false ->
|
false ->
|
||||||
udp_recv(Socket, Module, Opts);
|
udp_recv(Socket, Module, Opts);
|
||||||
|
@ -166,6 +140,9 @@ init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
|
||||||
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
|
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
|
||||||
%% Inform my parent that this port was opened succesfully
|
%% Inform my parent that this port was opened succesfully
|
||||||
proc_lib:init_ack({ok, self()}),
|
proc_lib:init_ack({ok, self()}),
|
||||||
|
start_module_sup(Port, Module),
|
||||||
|
?INFO_MSG("Start accepting TCP connections at ~s for ~p",
|
||||||
|
[format_portip(PortIP), Module]),
|
||||||
case erlang:function_exported(Module, tcp_init, 2) of
|
case erlang:function_exported(Module, tcp_init, 2) of
|
||||||
false ->
|
false ->
|
||||||
accept(ListenSocket, Module, Opts);
|
accept(ListenSocket, Module, Opts);
|
||||||
|
@ -182,29 +159,20 @@ init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
listen_tcp(PortIP, Module, SockOpts, Port, IPS) ->
|
listen_tcp(PortIP, Module, SockOpts, Port, IPS) ->
|
||||||
case ets:lookup(listen_sockets, PortIP) of
|
Res = gen_tcp:listen(Port, [binary,
|
||||||
[{PortIP, ListenSocket}] ->
|
{packet, 0},
|
||||||
{_, _, Transport} = PortIP,
|
{active, false},
|
||||||
?INFO_MSG("Reusing listening ~s port ~p at ~s",
|
{reuseaddr, true},
|
||||||
[Transport, Port, IPS]),
|
{nodelay, true},
|
||||||
ets:delete(listen_sockets, PortIP),
|
{send_timeout, ?TCP_SEND_TIMEOUT},
|
||||||
|
{send_timeout_close, true},
|
||||||
|
{keepalive, true} |
|
||||||
|
SockOpts]),
|
||||||
|
case Res of
|
||||||
|
{ok, ListenSocket} ->
|
||||||
ListenSocket;
|
ListenSocket;
|
||||||
_ ->
|
{error, Reason} ->
|
||||||
Res = gen_tcp:listen(Port, [binary,
|
socket_error(Reason, PortIP, Module, SockOpts, Port, IPS)
|
||||||
{packet, 0},
|
|
||||||
{active, false},
|
|
||||||
{reuseaddr, true},
|
|
||||||
{nodelay, true},
|
|
||||||
{send_timeout, ?TCP_SEND_TIMEOUT},
|
|
||||||
{send_timeout_close, true},
|
|
||||||
{keepalive, true} |
|
|
||||||
SockOpts]),
|
|
||||||
case Res of
|
|
||||||
{ok, ListenSocket} ->
|
|
||||||
ListenSocket;
|
|
||||||
{error, Reason} ->
|
|
||||||
socket_error(Reason, PortIP, Module, SockOpts, Port, IPS)
|
|
||||||
end
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% @spec (PortIP, Opts) -> {Port, IPT, IPS, IPV, OptsClean}
|
%% @spec (PortIP, Opts) -> {Port, IPT, IPS, IPV, OptsClean}
|
||||||
|
@ -388,7 +356,6 @@ start_listener2(Port, Module, Opts) ->
|
||||||
%% But it doesn't hurt to attempt to start it for any listener.
|
%% But it doesn't hurt to attempt to start it for any listener.
|
||||||
%% So, it's normal (and harmless) that in most cases this call returns: {error, {already_started, pid()}}
|
%% So, it's normal (and harmless) that in most cases this call returns: {error, {already_started, pid()}}
|
||||||
maybe_start_sip(Module),
|
maybe_start_sip(Module),
|
||||||
start_module_sup(Port, Module),
|
|
||||||
start_listener_sup(Port, Module, Opts).
|
start_listener_sup(Port, Module, Opts).
|
||||||
|
|
||||||
start_module_sup(_Port, Module) ->
|
start_module_sup(_Port, Module) ->
|
||||||
|
@ -578,6 +545,13 @@ format_error(Reason) ->
|
||||||
ReasonStr
|
ReasonStr
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
format_portip({Port, IP, _Transport}) ->
|
||||||
|
IPStr = case tuple_size(IP) of
|
||||||
|
4 -> inet:ntoa(IP);
|
||||||
|
8 -> "[" ++ inet:ntoa(IP) ++ "]"
|
||||||
|
end,
|
||||||
|
IPStr ++ ":" ++ integer_to_list(Port).
|
||||||
|
|
||||||
check_rate_limit(Interval) ->
|
check_rate_limit(Interval) ->
|
||||||
NewInterval = receive
|
NewInterval = receive
|
||||||
{rate_limit, AcceptInterval} ->
|
{rate_limit, AcceptInterval} ->
|
||||||
|
|
|
@ -32,8 +32,7 @@
|
||||||
-export([init/1, handle_call/3, handle_cast/2,
|
-export([init/1, handle_call/3, handle_cast/2,
|
||||||
handle_info/2, terminate/2, code_change/3]).
|
handle_info/2, terminate/2, code_change/3]).
|
||||||
|
|
||||||
-export([start/0,
|
-export([start_link/0,
|
||||||
start_link/0,
|
|
||||||
get_client_identity/2,
|
get_client_identity/2,
|
||||||
verify_redirection_uri/3,
|
verify_redirection_uri/3,
|
||||||
authenticate_user/2,
|
authenticate_user/2,
|
||||||
|
@ -70,32 +69,6 @@
|
||||||
|
|
||||||
-define(EXPIRE, 4294967).
|
-define(EXPIRE, 4294967).
|
||||||
|
|
||||||
start() ->
|
|
||||||
DBMod = get_db_backend(),
|
|
||||||
DBMod:init(),
|
|
||||||
MaxSize =
|
|
||||||
ejabberd_config:get_option(
|
|
||||||
oauth_cache_size,
|
|
||||||
fun(I) when is_integer(I), I>0 -> I end,
|
|
||||||
1000),
|
|
||||||
LifeTime =
|
|
||||||
ejabberd_config:get_option(
|
|
||||||
oauth_cache_life_time,
|
|
||||||
fun(I) when is_integer(I), I>0 -> I end,
|
|
||||||
timer:hours(1) div 1000),
|
|
||||||
cache_tab:new(oauth_token,
|
|
||||||
[{max_size, MaxSize}, {life_time, LifeTime}]),
|
|
||||||
Expire = expire(),
|
|
||||||
application:set_env(oauth2, backend, ejabberd_oauth),
|
|
||||||
application:set_env(oauth2, expiry_time, Expire),
|
|
||||||
application:start(oauth2),
|
|
||||||
ChildSpec = {?MODULE, {?MODULE, start_link, []},
|
|
||||||
transient, 1000, worker, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec),
|
|
||||||
ejabberd_commands:register_commands(get_commands_spec()),
|
|
||||||
ok.
|
|
||||||
|
|
||||||
|
|
||||||
get_commands_spec() ->
|
get_commands_spec() ->
|
||||||
[
|
[
|
||||||
#ejabberd_commands{name = oauth_issue_token, tags = [oauth],
|
#ejabberd_commands{name = oauth_issue_token, tags = [oauth],
|
||||||
|
@ -173,6 +146,25 @@ start_link() ->
|
||||||
|
|
||||||
|
|
||||||
init([]) ->
|
init([]) ->
|
||||||
|
DBMod = get_db_backend(),
|
||||||
|
DBMod:init(),
|
||||||
|
MaxSize =
|
||||||
|
ejabberd_config:get_option(
|
||||||
|
oauth_cache_size,
|
||||||
|
fun(I) when is_integer(I), I>0 -> I end,
|
||||||
|
1000),
|
||||||
|
LifeTime =
|
||||||
|
ejabberd_config:get_option(
|
||||||
|
oauth_cache_life_time,
|
||||||
|
fun(I) when is_integer(I), I>0 -> I end,
|
||||||
|
timer:hours(1) div 1000),
|
||||||
|
cache_tab:new(oauth_token,
|
||||||
|
[{max_size, MaxSize}, {life_time, LifeTime}]),
|
||||||
|
Expire = expire(),
|
||||||
|
application:set_env(oauth2, backend, ejabberd_oauth),
|
||||||
|
application:set_env(oauth2, expiry_time, Expire),
|
||||||
|
application:start(oauth2),
|
||||||
|
ejabberd_commands:register_commands(get_commands_spec()),
|
||||||
erlang:send_after(expire() * 1000, self(), clean),
|
erlang:send_after(expire() * 1000, self(), clean),
|
||||||
{ok, ok}.
|
{ok, ok}.
|
||||||
|
|
||||||
|
|
|
@ -25,67 +25,78 @@
|
||||||
|
|
||||||
-module(ejabberd_rdbms).
|
-module(ejabberd_rdbms).
|
||||||
|
|
||||||
|
-behaviour(supervisor).
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
|
|
||||||
-author('alexey@process-one.net').
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
-export([start/0, opt_type/1, start_hosts/0, start_host/1, stop_host/1]).
|
-export([start_link/0, init/1, opt_type/1,
|
||||||
|
config_reloaded/0, start_host/1, stop_host/1]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
|
||||||
start() ->
|
start_link() ->
|
||||||
|
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||||
|
|
||||||
|
init([]) ->
|
||||||
file:delete(ejabberd_sql:freetds_config()),
|
file:delete(ejabberd_sql:freetds_config()),
|
||||||
file:delete(ejabberd_sql:odbc_config()),
|
file:delete(ejabberd_sql:odbc_config()),
|
||||||
file:delete(ejabberd_sql:odbcinst_config()),
|
file:delete(ejabberd_sql:odbcinst_config()),
|
||||||
ejabberd_hooks:add(host_up, ?MODULE, start_host, 20),
|
ejabberd_hooks:add(host_up, ?MODULE, start_host, 20),
|
||||||
ejabberd_hooks:add(host_down, ?MODULE, stop_host, 90),
|
ejabberd_hooks:add(host_down, ?MODULE, stop_host, 90),
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, start_hosts, 20),
|
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 20),
|
||||||
case lists:any(fun(H) -> needs_sql(H) /= false end,
|
{ok, {{one_for_one, 10, 1}, get_specs()}}.
|
||||||
?MYHOSTS) of
|
|
||||||
true ->
|
-spec get_specs() -> [supervisor:child_spec()].
|
||||||
start_hosts();
|
get_specs() ->
|
||||||
false ->
|
lists:flatmap(
|
||||||
ok
|
fun(Host) ->
|
||||||
|
case get_spec(Host) of
|
||||||
|
{ok, Spec} -> [Spec];
|
||||||
|
undefined -> []
|
||||||
|
end
|
||||||
|
end, ?MYHOSTS).
|
||||||
|
|
||||||
|
-spec get_spec(binary()) -> {ok, supervisor:child_spec()} | undefined.
|
||||||
|
get_spec(Host) ->
|
||||||
|
case needs_sql(Host) of
|
||||||
|
{true, App} ->
|
||||||
|
ejabberd:start_app(App),
|
||||||
|
SupName = gen_mod:get_module_proc(Host, ejabberd_sql_sup),
|
||||||
|
{ok, {SupName, {ejabberd_sql_sup, start_link, [Host]},
|
||||||
|
transient, infinity, supervisor, [ejabberd_sql_sup]}};
|
||||||
|
false ->
|
||||||
|
undefined
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% Start relationnal DB module on the nodes where it is needed
|
-spec config_reloaded() -> ok.
|
||||||
start_hosts() ->
|
config_reloaded() ->
|
||||||
lists:foreach(fun start_host/1, ?MYHOSTS).
|
lists:foreach(fun start_host/1, ?MYHOSTS).
|
||||||
|
|
||||||
-spec start_host(binary()) -> ok.
|
-spec start_host(binary()) -> ok.
|
||||||
start_host(Host) ->
|
start_host(Host) ->
|
||||||
case needs_sql(Host) of
|
case get_spec(Host) of
|
||||||
{true, App} -> start_sql(Host, App);
|
{ok, Spec} ->
|
||||||
false -> ok
|
case supervisor:start_child(?MODULE, Spec) of
|
||||||
|
{ok, _PID} ->
|
||||||
|
ok;
|
||||||
|
{error, {already_started, _}} ->
|
||||||
|
ok;
|
||||||
|
{error, _} = Err ->
|
||||||
|
erlang:error(Err)
|
||||||
|
end;
|
||||||
|
undefined ->
|
||||||
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec stop_host(binary()) -> ok.
|
-spec stop_host(binary()) -> ok.
|
||||||
stop_host(Host) ->
|
stop_host(Host) ->
|
||||||
SupName = gen_mod:get_module_proc(Host, ejabberd_sql_sup),
|
SupName = gen_mod:get_module_proc(Host, ejabberd_sql_sup),
|
||||||
supervisor:terminate_child(ejabberd_sup, SupName),
|
supervisor:terminate_child(?MODULE, SupName),
|
||||||
supervisor:delete_child(ejabberd_sup, SupName),
|
supervisor:delete_child(?MODULE, SupName),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
%% Start the SQL module on the given host
|
|
||||||
start_sql(Host, App) ->
|
|
||||||
ejabberd:start_app(App),
|
|
||||||
Supervisor_name = gen_mod:get_module_proc(Host,
|
|
||||||
ejabberd_sql_sup),
|
|
||||||
ChildSpec = {Supervisor_name,
|
|
||||||
{ejabberd_sql_sup, start_link, [Host]}, transient,
|
|
||||||
infinity, supervisor, [ejabberd_sql_sup]},
|
|
||||||
case supervisor:start_child(ejabberd_sup, ChildSpec) of
|
|
||||||
{ok, _PID} -> ok;
|
|
||||||
{error, {already_started, _}} -> ok;
|
|
||||||
_Error ->
|
|
||||||
?ERROR_MSG("Start of supervisor ~p failed:~n~p~nRetrying."
|
|
||||||
"..~n",
|
|
||||||
[Supervisor_name, _Error]),
|
|
||||||
timer:sleep(5000),
|
|
||||||
start_sql(Host, App)
|
|
||||||
end.
|
|
||||||
|
|
||||||
%% Returns {true, App} if we have configured sql for the given host
|
%% Returns {true, App} if we have configured sql for the given host
|
||||||
needs_sql(Host) ->
|
needs_sql(Host) ->
|
||||||
LHost = jid:nameprep(Host),
|
LHost = jid:nameprep(Host),
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start/0, stop/0, start_link/0, q/1, qp/1, host_up/1, opt_type/1]).
|
-export([start_link/0, q/1, qp/1, config_reloaded/0, opt_type/1]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
|
||||||
-record(state, {}).
|
-record(state, {connection :: {pid(), reference()} | undefined}).
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% API
|
%%% API
|
||||||
|
@ -48,19 +48,6 @@
|
||||||
start_link() ->
|
start_link() ->
|
||||||
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
start() ->
|
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, start, 20),
|
|
||||||
ejabberd_hooks:add(host_up, ?MODULE, host_up, 20),
|
|
||||||
case lists:any(
|
|
||||||
fun(Host) ->
|
|
||||||
is_redis_configured(Host)
|
|
||||||
end, ?MYHOSTS) of
|
|
||||||
true ->
|
|
||||||
do_start();
|
|
||||||
false ->
|
|
||||||
stop()
|
|
||||||
end.
|
|
||||||
|
|
||||||
q(Command) ->
|
q(Command) ->
|
||||||
try eredis:q(?PROCNAME, Command)
|
try eredis:q(?PROCNAME, Command)
|
||||||
catch _:Reason -> {error, Reason}
|
catch _:Reason -> {error, Reason}
|
||||||
|
@ -71,22 +58,21 @@ qp(Pipeline) ->
|
||||||
catch _:Reason -> {error, Reason}
|
catch _:Reason -> {error, Reason}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
stop() ->
|
config_reloaded() ->
|
||||||
supervisor:terminate_child(ejabberd_sup, ?MODULE),
|
case is_redis_configured() of
|
||||||
supervisor:delete_child(ejabberd_sup, ?MODULE).
|
true ->
|
||||||
|
?MODULE ! connect;
|
||||||
host_up(Host) ->
|
false ->
|
||||||
case is_redis_configured(Host) of
|
?MODULE ! disconnect
|
||||||
true -> do_start();
|
|
||||||
false -> ok
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% gen_server callbacks
|
%%% gen_server callbacks
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
init([]) ->
|
init([]) ->
|
||||||
|
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 20),
|
||||||
process_flag(trap_exit, true),
|
process_flag(trap_exit, true),
|
||||||
connect(),
|
self() ! connect,
|
||||||
{ok, #state{}}.
|
{ok, #state{}}.
|
||||||
|
|
||||||
handle_call(_Request, _From, State) ->
|
handle_call(_Request, _From, State) ->
|
||||||
|
@ -96,13 +82,35 @@ handle_call(_Request, _From, State) ->
|
||||||
handle_cast(_Msg, State) ->
|
handle_cast(_Msg, State) ->
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
|
handle_info(connect, #state{connection = undefined} = State) ->
|
||||||
|
NewState = case is_redis_configured() of
|
||||||
|
true ->
|
||||||
|
case connect() of
|
||||||
|
{ok, Connection} ->
|
||||||
|
State#state{connection = Connection};
|
||||||
|
{error, _} ->
|
||||||
|
State
|
||||||
|
end;
|
||||||
|
false ->
|
||||||
|
State
|
||||||
|
end,
|
||||||
|
{noreply, NewState};
|
||||||
handle_info(connect, State) ->
|
handle_info(connect, State) ->
|
||||||
connect(),
|
%% Already connected
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
handle_info({'DOWN', _MRef, _Type, _Pid, Reason}, State) ->
|
handle_info(disconnect, #state{connection = {Pid, MRef}} = State) ->
|
||||||
|
?INFO_MSG("Disconnecting from Redis server", []),
|
||||||
|
erlang:demonitor(MRef, [flush]),
|
||||||
|
eredis:stop(Pid),
|
||||||
|
{noreply, State#state{connection = undefined}};
|
||||||
|
handle_info(disconnect, State) ->
|
||||||
|
%% Not connected
|
||||||
|
{noreply, State};
|
||||||
|
handle_info({'DOWN', MRef, _Type, Pid, Reason},
|
||||||
|
#state{connection = {Pid, MRef}} = State) ->
|
||||||
?INFO_MSG("Redis connection has failed: ~p", [Reason]),
|
?INFO_MSG("Redis connection has failed: ~p", [Reason]),
|
||||||
connect(),
|
connect(),
|
||||||
{noreply, State};
|
{noreply, State#state{connection = undefined}};
|
||||||
handle_info({'EXIT', _, _}, State) ->
|
handle_info({'EXIT', _, _}, State) ->
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
handle_info(Info, State) ->
|
handle_info(Info, State) ->
|
||||||
|
@ -110,7 +118,7 @@ handle_info(Info, State) ->
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
terminate(_Reason, _State) ->
|
terminate(_Reason, _State) ->
|
||||||
ok.
|
ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 20).
|
||||||
|
|
||||||
code_change(_OldVsn, State, _Extra) ->
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
{ok, State}.
|
{ok, State}.
|
||||||
|
@ -118,10 +126,8 @@ code_change(_OldVsn, State, _Extra) ->
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
do_start() ->
|
is_redis_configured() ->
|
||||||
Spec = {?MODULE, {?MODULE, start_link, []},
|
lists:any(fun is_redis_configured/1, ?MYHOSTS).
|
||||||
permanent, 5000, worker, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, Spec).
|
|
||||||
|
|
||||||
is_redis_configured(Host) ->
|
is_redis_configured(Host) ->
|
||||||
ServerConfigured = ejabberd_config:has_option({redis_server, Host}),
|
ServerConfigured = ejabberd_config:has_option({redis_server, Host}),
|
||||||
|
@ -181,9 +187,9 @@ connect() ->
|
||||||
{ok, Client} ->
|
{ok, Client} ->
|
||||||
?INFO_MSG("Connected to Redis at ~s:~p", [Server, Port]),
|
?INFO_MSG("Connected to Redis at ~s:~p", [Server, Port]),
|
||||||
unlink(Client),
|
unlink(Client),
|
||||||
erlang:monitor(process, Client),
|
MRef = erlang:monitor(process, Client),
|
||||||
register(?PROCNAME, Client),
|
register(?PROCNAME, Client),
|
||||||
{ok, Client};
|
{ok, {Client, MRef}};
|
||||||
{error, Why} ->
|
{error, Why} ->
|
||||||
erlang:error(Why)
|
erlang:error(Why)
|
||||||
end
|
end
|
||||||
|
@ -192,7 +198,8 @@ connect() ->
|
||||||
?ERROR_MSG("Redis connection at ~s:~p has failed: ~p; "
|
?ERROR_MSG("Redis connection at ~s:~p has failed: ~p; "
|
||||||
"reconnecting in ~p seconds",
|
"reconnecting in ~p seconds",
|
||||||
[Server, Port, Reason, Timeout]),
|
[Server, Port, Reason, Timeout]),
|
||||||
erlang:send_after(timer:seconds(Timeout), self(), connect)
|
erlang:send_after(timer:seconds(Timeout), self(), connect),
|
||||||
|
{error, Reason}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
opt_type(redis_connect_timeout) ->
|
opt_type(redis_connect_timeout) ->
|
||||||
|
|
|
@ -25,12 +25,13 @@
|
||||||
|
|
||||||
-module(ejabberd_riak_sup).
|
-module(ejabberd_riak_sup).
|
||||||
|
|
||||||
|
-behaviour(supervisor).
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
-author('alexey@process-one.net').
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
-export([start/0, stop/0, start_link/0, init/1, get_pids/0,
|
-export([start_link/0, init/1, get_pids/0,
|
||||||
transform_options/1, get_random_pid/0, get_random_pid/1,
|
transform_options/1, get_random_pid/0, get_random_pid/1,
|
||||||
host_up/1, opt_type/1]).
|
host_up/1, config_reloaded/0, opt_type/1]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
@ -44,34 +45,37 @@
|
||||||
% a timeout error to the request
|
% a timeout error to the request
|
||||||
-define(CONNECT_TIMEOUT, 500). % milliseconds
|
-define(CONNECT_TIMEOUT, 500). % milliseconds
|
||||||
|
|
||||||
start() ->
|
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, start, 20),
|
|
||||||
ejabberd_hooks:add(host_up, ?MODULE, host_up, 20),
|
|
||||||
case lists:any(
|
|
||||||
fun(Host) ->
|
|
||||||
is_riak_configured(Host)
|
|
||||||
end, ?MYHOSTS) of
|
|
||||||
true ->
|
|
||||||
ejabberd:start_app(riakc),
|
|
||||||
do_start();
|
|
||||||
false ->
|
|
||||||
stop()
|
|
||||||
end.
|
|
||||||
|
|
||||||
stop() ->
|
|
||||||
supervisor:terminate_child(ejabberd_sup, ?MODULE),
|
|
||||||
supervisor:delete_child(ejabberd_sup, ?MODULE),
|
|
||||||
ok.
|
|
||||||
|
|
||||||
host_up(Host) ->
|
host_up(Host) ->
|
||||||
case is_riak_configured(Host) of
|
case is_riak_configured(Host) of
|
||||||
true ->
|
true ->
|
||||||
ejabberd:start_app(riakc),
|
ejabberd:start_app(riakc),
|
||||||
do_start();
|
lists:foreach(
|
||||||
|
fun(Spec) ->
|
||||||
|
supervisor:start_child(?MODULE, Spec)
|
||||||
|
end, get_specs());
|
||||||
false ->
|
false ->
|
||||||
ok
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
config_reloaded() ->
|
||||||
|
case is_riak_configured() of
|
||||||
|
true ->
|
||||||
|
ejabberd:start_app(riakc),
|
||||||
|
lists:foreach(
|
||||||
|
fun(Spec) ->
|
||||||
|
supervisor:start_child(?MODULE, Spec)
|
||||||
|
end, get_specs());
|
||||||
|
false ->
|
||||||
|
lists:foreach(
|
||||||
|
fun({Id, _, _, _}) ->
|
||||||
|
supervisor:terminate_child(?MODULE, Id),
|
||||||
|
supervisor:delete_child(?MODULE, Id)
|
||||||
|
end, supervisor:which_children(?MODULE))
|
||||||
|
end.
|
||||||
|
|
||||||
|
is_riak_configured() ->
|
||||||
|
lists:any(fun is_riak_configured/1, ?MYHOSTS).
|
||||||
|
|
||||||
is_riak_configured(Host) ->
|
is_riak_configured(Host) ->
|
||||||
ServerConfigured = ejabberd_config:get_option(
|
ServerConfigured = ejabberd_config:get_option(
|
||||||
{riak_server, Host},
|
{riak_server, Host},
|
||||||
|
@ -92,30 +96,23 @@ is_riak_configured(Host) ->
|
||||||
ServerConfigured or PortConfigured
|
ServerConfigured or PortConfigured
|
||||||
or AuthConfigured or ModuleWithRiakDBConfigured.
|
or AuthConfigured or ModuleWithRiakDBConfigured.
|
||||||
|
|
||||||
do_start() ->
|
|
||||||
ChildSpec =
|
|
||||||
{?MODULE,
|
|
||||||
{?MODULE, start_link, []},
|
|
||||||
transient,
|
|
||||||
infinity,
|
|
||||||
supervisor,
|
|
||||||
[?MODULE]},
|
|
||||||
case supervisor:start_child(ejabberd_sup, ChildSpec) of
|
|
||||||
{ok, _PID} ->
|
|
||||||
ok;
|
|
||||||
{error, {already_started, _}} ->
|
|
||||||
ok;
|
|
||||||
_Error ->
|
|
||||||
?ERROR_MSG("Start of supervisor ~p failed:~n~p~nRetrying...~n",
|
|
||||||
[?MODULE, _Error]),
|
|
||||||
timer:sleep(5000),
|
|
||||||
start()
|
|
||||||
end.
|
|
||||||
|
|
||||||
start_link() ->
|
start_link() ->
|
||||||
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||||
|
|
||||||
init([]) ->
|
init([]) ->
|
||||||
|
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 20),
|
||||||
|
ejabberd_hooks:add(host_up, ?MODULE, host_up, 20),
|
||||||
|
Specs = case is_riak_configured() of
|
||||||
|
true ->
|
||||||
|
ejabberd:start_app(riakc),
|
||||||
|
get_specs();
|
||||||
|
false ->
|
||||||
|
[]
|
||||||
|
end,
|
||||||
|
{ok, {{one_for_one, 500, 1}, Specs}}.
|
||||||
|
|
||||||
|
-spec get_specs() -> [supervisor:child_spec()].
|
||||||
|
get_specs() ->
|
||||||
PoolSize = get_pool_size(),
|
PoolSize = get_pool_size(),
|
||||||
StartInterval = get_start_interval(),
|
StartInterval = get_start_interval(),
|
||||||
Server = get_riak_server(),
|
Server = get_riak_server(),
|
||||||
|
@ -133,16 +130,14 @@ init([]) ->
|
||||||
if (Username /= nil) and (Password /= nil) ->
|
if (Username /= nil) and (Password /= nil) ->
|
||||||
{credentials, Username, Password};
|
{credentials, Username, Password};
|
||||||
true -> nil
|
true -> nil
|
||||||
end
|
end]),
|
||||||
]),
|
lists:map(
|
||||||
{ok, {{one_for_one, PoolSize*10, 1},
|
fun(I) ->
|
||||||
lists:map(
|
{ejabberd_riak:get_proc(I),
|
||||||
fun(I) ->
|
{ejabberd_riak, start_link,
|
||||||
{ejabberd_riak:get_proc(I),
|
[I, Server, Port, StartInterval*1000, Options]},
|
||||||
{ejabberd_riak, start_link,
|
transient, 2000, worker, [?MODULE]}
|
||||||
[I, Server, Port, StartInterval*1000, Options]},
|
end, lists:seq(1, PoolSize)).
|
||||||
transient, 2000, worker, [?MODULE]}
|
|
||||||
end, lists:seq(1, PoolSize))}}.
|
|
||||||
|
|
||||||
get_start_interval() ->
|
get_start_interval() ->
|
||||||
ejabberd_config:get_option(
|
ejabberd_config:get_option(
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
is_my_host/1,
|
is_my_host/1,
|
||||||
get_backend/0]).
|
get_backend/0]).
|
||||||
|
|
||||||
-export([start/0, start_link/0]).
|
-export([start_link/0]).
|
||||||
|
|
||||||
-export([init/1, handle_call/3, handle_cast/2,
|
-export([init/1, handle_call/3, handle_cast/2,
|
||||||
handle_info/2, terminate/2, code_change/3, opt_type/1]).
|
handle_info/2, terminate/2, code_change/3, opt_type/1]).
|
||||||
|
@ -78,11 +78,6 @@
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
%% API
|
%% API
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
start() ->
|
|
||||||
ChildSpec = {?MODULE, {?MODULE, start_link, []},
|
|
||||||
transient, 1000, worker, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
|
||||||
|
|
||||||
start_link() ->
|
start_link() ->
|
||||||
?GEN_SERVER:start_link({local, ?MODULE}, ?MODULE, [], []).
|
?GEN_SERVER:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
unregister_route/1
|
unregister_route/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([start/0, start_link/0]).
|
-export([start_link/0]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
|
@ -56,11 +56,6 @@
|
||||||
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
|
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
|
||||||
%% Description: Starts the server
|
%% Description: Starts the server
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
start() ->
|
|
||||||
ChildSpec = {?MODULE, {?MODULE, start_link, []},
|
|
||||||
transient, 1000, worker, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
|
||||||
|
|
||||||
start_link() ->
|
start_link() ->
|
||||||
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,7 @@
|
||||||
-behaviour(?GEN_SERVER).
|
-behaviour(?GEN_SERVER).
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start/0,
|
-export([start_link/0,
|
||||||
stop/0,
|
|
||||||
start_link/0,
|
|
||||||
route/1,
|
route/1,
|
||||||
route/2,
|
route/2,
|
||||||
process_iq/1,
|
process_iq/1,
|
||||||
|
@ -110,17 +108,6 @@
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
-export_type([sid/0, info/0]).
|
-export_type([sid/0, info/0]).
|
||||||
|
|
||||||
start() ->
|
|
||||||
ChildSpec = {?MODULE, {?MODULE, start_link, []},
|
|
||||||
transient, 5000, worker, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
|
||||||
|
|
||||||
-spec stop() -> ok.
|
|
||||||
stop() ->
|
|
||||||
supervisor:terminate_child(ejabberd_sup, ?MODULE),
|
|
||||||
supervisor:delete_child(ejabberd_sup, ?MODULE),
|
|
||||||
ok.
|
|
||||||
|
|
||||||
start_link() ->
|
start_link() ->
|
||||||
?GEN_SERVER:start_link({local, ?MODULE}, ?MODULE, [], []).
|
?GEN_SERVER:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,40 @@ init([]) ->
|
||||||
infinity,
|
infinity,
|
||||||
supervisor,
|
supervisor,
|
||||||
[ejabberd_tmp_sup]},
|
[ejabberd_tmp_sup]},
|
||||||
|
BackendSupervisor = {ejabberd_backend_sup,
|
||||||
|
{ejabberd_backend_sup, start_link, []},
|
||||||
|
permanent, infinity, supervisor,
|
||||||
|
[ejabberd_backend_sup]},
|
||||||
|
ACL = {acl, {acl, start_link, []},
|
||||||
|
permanent, 5000, worker, [acl]},
|
||||||
|
Shaper = {shaper, {shaper, start_link, []},
|
||||||
|
permanent, 5000, worker, [shaper]},
|
||||||
|
SQLSupervisor = {ejabberd_rdbms,
|
||||||
|
{ejabberd_rdbms, start_link, []},
|
||||||
|
permanent, infinity, supervisor, [ejabberd_rdbms]},
|
||||||
|
RiakSupervisor = {ejabberd_riak_sup,
|
||||||
|
{ejabberd_riak_sup, start_link, []},
|
||||||
|
permanent, infinity, supervisor, [ejabberd_riak_sup]},
|
||||||
|
Redis = {ejabberd_redis, {ejabberd_redis, start_link, []},
|
||||||
|
permanent, 5000, worker, [ejabberd_redis]},
|
||||||
|
Router = {ejabberd_router, {ejabberd_router, start_link, []},
|
||||||
|
permanent, 5000, worker, [ejabberd_router]},
|
||||||
|
RouterMulticast = {ejabberd_router_multicast,
|
||||||
|
{ejabberd_router_multicast, start_link, []},
|
||||||
|
permanent, 5000, worker, [ejabberd_router_multicast]},
|
||||||
|
Local = {ejabberd_local, {ejabberd_local, start_link, []},
|
||||||
|
permanent, 5000, worker, [ejabberd_local]},
|
||||||
|
SM = {ejabberd_sm, {ejabberd_sm, start_link, []},
|
||||||
|
permanent, 5000, worker, [ejabberd_sm]},
|
||||||
|
GenModSupervisor = {ejabberd_gen_mod_sup, {gen_mod, start_link, []},
|
||||||
|
permanent, infinity, supervisor, [gen_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]},
|
||||||
{ok, {{one_for_one, 10, 1},
|
{ok, {{one_for_one, 10, 1},
|
||||||
[Hooks,
|
[Hooks,
|
||||||
|
Listener,
|
||||||
SystemMonitor,
|
SystemMonitor,
|
||||||
S2S,
|
S2S,
|
||||||
Captcha,
|
Captcha,
|
||||||
|
@ -110,4 +142,16 @@ init([]) ->
|
||||||
S2SOutSupervisor,
|
S2SOutSupervisor,
|
||||||
ServiceSupervisor,
|
ServiceSupervisor,
|
||||||
IQSupervisor,
|
IQSupervisor,
|
||||||
Listener]}}.
|
ACL,
|
||||||
|
Shaper,
|
||||||
|
BackendSupervisor,
|
||||||
|
SQLSupervisor,
|
||||||
|
RiakSupervisor,
|
||||||
|
Redis,
|
||||||
|
Router,
|
||||||
|
RouterMulticast,
|
||||||
|
Local,
|
||||||
|
SM,
|
||||||
|
GenModSupervisor,
|
||||||
|
Auth,
|
||||||
|
OAuth]}}.
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
-export([init/1, start_link/0, start_child/3, start_child/4,
|
-export([init/1, start_link/0, start_child/3, start_child/4,
|
||||||
stop_child/1, stop_child/2, config_reloaded/0]).
|
stop_child/1, stop_child/2, config_reloaded/0]).
|
||||||
-export([start/0, start_module/2, start_module/3,
|
-export([start_module/2, start_module/3,
|
||||||
stop_module/2, stop_module_keep_config/2, get_opt/3,
|
stop_module/2, stop_module_keep_config/2, get_opt/3,
|
||||||
get_opt/4, get_opt_host/3, opt_type/1, is_equal_opt/5,
|
get_opt/4, get_opt_host/3, opt_type/1, is_equal_opt/5,
|
||||||
get_module_opt/4, get_module_opt/5, get_module_opt_host/3,
|
get_module_opt/4, get_module_opt/5, get_module_opt_host/3,
|
||||||
|
@ -70,13 +70,14 @@
|
||||||
-define(GEN_SERVER, gen_server).
|
-define(GEN_SERVER, gen_server).
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
start() ->
|
|
||||||
Spec = {ejabberd_gen_mod_sup, {?MODULE, start_link, []},
|
|
||||||
permanent, infinity, supervisor, [?MODULE]},
|
|
||||||
supervisor:start_child(ejabberd_sup, Spec).
|
|
||||||
|
|
||||||
start_link() ->
|
start_link() ->
|
||||||
supervisor:start_link({local, ejabberd_gen_mod_sup}, ?MODULE, []).
|
case supervisor:start_link({local, ejabberd_gen_mod_sup}, ?MODULE, []) of
|
||||||
|
{ok, Pid} ->
|
||||||
|
gen_mod:start_modules(),
|
||||||
|
{ok, Pid};
|
||||||
|
Err ->
|
||||||
|
Err
|
||||||
|
end.
|
||||||
|
|
||||||
init([]) ->
|
init([]) ->
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 50),
|
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 50),
|
||||||
|
|
|
@ -96,12 +96,12 @@ start(Host, Opts) ->
|
||||||
TmpSupSpec = {TmpSup,
|
TmpSupSpec = {TmpSup,
|
||||||
{ejabberd_tmp_sup, start_link, [TmpSup, ejabberd_bosh]},
|
{ejabberd_tmp_sup, start_link, [TmpSup, ejabberd_bosh]},
|
||||||
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
||||||
supervisor:start_child(ejabberd_sup, TmpSupSpec).
|
supervisor:start_child(ejabberd_gen_mod_sup, TmpSupSpec).
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
TmpSup = gen_mod:get_module_proc(Host, ?MODULE),
|
TmpSup = gen_mod:get_module_proc(Host, ?MODULE),
|
||||||
supervisor:terminate_child(ejabberd_sup, TmpSup),
|
supervisor:terminate_child(ejabberd_gen_mod_sup, TmpSup),
|
||||||
supervisor:delete_child(ejabberd_sup, TmpSup).
|
supervisor:delete_child(ejabberd_gen_mod_sup, TmpSup).
|
||||||
|
|
||||||
reload(_Host, NewOpts, _OldOpts) ->
|
reload(_Host, NewOpts, _OldOpts) ->
|
||||||
start_jiffy(NewOpts),
|
start_jiffy(NewOpts),
|
||||||
|
|
|
@ -237,13 +237,13 @@ start_supervisor(Host) ->
|
||||||
{ejabberd_tmp_sup, start_link,
|
{ejabberd_tmp_sup, start_link,
|
||||||
[Proc, mod_irc_connection]},
|
[Proc, mod_irc_connection]},
|
||||||
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
supervisor:start_child(ejabberd_gen_mod_sup, ChildSpec).
|
||||||
|
|
||||||
stop_supervisor(Host) ->
|
stop_supervisor(Host) ->
|
||||||
Proc = gen_mod:get_module_proc(Host,
|
Proc = gen_mod:get_module_proc(Host,
|
||||||
ejabberd_mod_irc_sup),
|
ejabberd_mod_irc_sup),
|
||||||
supervisor:terminate_child(ejabberd_sup, Proc),
|
supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
|
||||||
supervisor:delete_child(ejabberd_sup, Proc).
|
supervisor:delete_child(ejabberd_gen_mod_sup, Proc).
|
||||||
|
|
||||||
do_route(Host, ServerHost, Access, Packet) ->
|
do_route(Host, ServerHost, Access, Packet) ->
|
||||||
#jid{luser = LUser, lresource = LResource} = xmpp:get_to(Packet),
|
#jid{luser = LUser, lresource = LResource} = xmpp:get_to(Packet),
|
||||||
|
|
|
@ -59,14 +59,14 @@ start(Host, Opts) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
||||||
transient, infinity, supervisor, [?MODULE]},
|
transient, infinity, supervisor, [?MODULE]},
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec)
|
supervisor:start_child(ejabberd_gen_mod_sup, ChildSpec)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
mod_proxy65_service:delete_listener(Host),
|
mod_proxy65_service:delete_listener(Host),
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
supervisor:terminate_child(ejabberd_sup, Proc),
|
supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
|
||||||
supervisor:delete_child(ejabberd_sup, Proc).
|
supervisor:delete_child(ejabberd_gen_mod_sup, Proc).
|
||||||
|
|
||||||
reload(Host, NewOpts, OldOpts) ->
|
reload(Host, NewOpts, OldOpts) ->
|
||||||
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
||||||
|
|
|
@ -50,7 +50,7 @@ start_link() ->
|
||||||
init() ->
|
init() ->
|
||||||
Spec = {?MODULE, {?MODULE, start_link, []}, transient,
|
Spec = {?MODULE, {?MODULE, start_link, []}, transient,
|
||||||
5000, worker, [?MODULE]},
|
5000, worker, [?MODULE]},
|
||||||
supervisor:start_child(ejabberd_sup, Spec).
|
supervisor:start_child(ejabberd_backend_sup, Spec).
|
||||||
|
|
||||||
register_stream(SHA1, StreamPid) ->
|
register_stream(SHA1, StreamPid) ->
|
||||||
F = fun () ->
|
F = fun () ->
|
||||||
|
|
|
@ -55,8 +55,8 @@ start(_Host, _Opts) ->
|
||||||
{ejabberd_tmp_sup, start_link,
|
{ejabberd_tmp_sup, start_link,
|
||||||
[mod_sip_proxy_sup, mod_sip_proxy]},
|
[mod_sip_proxy_sup, mod_sip_proxy]},
|
||||||
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
||||||
supervisor:start_child(ejabberd_sup, Spec),
|
supervisor:start_child(ejabberd_gen_mod_sup, Spec),
|
||||||
supervisor:start_child(ejabberd_sup, TmpSupSpec),
|
supervisor:start_child(ejabberd_gen_mod_sup, TmpSupSpec),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
stop(_Host) ->
|
stop(_Host) ->
|
||||||
|
|
|
@ -81,12 +81,12 @@ init(Host, Opts) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
||||||
transient, 1000, worker, [?MODULE]},
|
transient, 1000, worker, [?MODULE]},
|
||||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
supervisor:start_child(ejabberd_backend_sup, ChildSpec).
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
supervisor:terminate_child(ejabberd_sup, Proc),
|
supervisor:terminate_child(ejabberd_backend_sup, Proc),
|
||||||
supervisor:delete_child(ejabberd_sup, Proc),
|
supervisor:delete_child(ejabberd_backend_sup, Proc),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
is_search_supported(_LServer) ->
|
is_search_supported(_LServer) ->
|
||||||
|
|
|
@ -29,13 +29,8 @@
|
||||||
|
|
||||||
-export([get_string/0, uniform/0, uniform/1, bytes/1]).
|
-export([get_string/0, uniform/0, uniform/1, bytes/1]).
|
||||||
|
|
||||||
-export([start/0]).
|
|
||||||
|
|
||||||
-define(THRESHOLD, 16#10000000000000000).
|
-define(THRESHOLD, 16#10000000000000000).
|
||||||
|
|
||||||
start() ->
|
|
||||||
ok.
|
|
||||||
|
|
||||||
get_string() ->
|
get_string() ->
|
||||||
R = crypto:rand_uniform(0, ?THRESHOLD),
|
R = crypto:rand_uniform(0, ?THRESHOLD),
|
||||||
integer_to_binary(R).
|
integer_to_binary(R).
|
||||||
|
|
|
@ -25,13 +25,17 @@
|
||||||
|
|
||||||
-module(shaper).
|
-module(shaper).
|
||||||
|
|
||||||
|
-behaviour(gen_server).
|
||||||
-behaviour(ejabberd_config).
|
-behaviour(ejabberd_config).
|
||||||
|
|
||||||
-author('alexey@process-one.net').
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
-export([start/0, new/1, new1/1, update/2,
|
-export([start_link/0, new/1, new1/1, update/2,
|
||||||
get_max_rate/1, transform_options/1, load_from_config/0,
|
get_max_rate/1, transform_options/1, load_from_config/0,
|
||||||
opt_type/1]).
|
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.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
@ -43,13 +47,17 @@
|
||||||
-record(shaper, {name :: {atom(), global},
|
-record(shaper, {name :: {atom(), global},
|
||||||
maxrate :: integer()}).
|
maxrate :: integer()}).
|
||||||
|
|
||||||
|
-record(state, {}).
|
||||||
|
|
||||||
-type shaper() :: none | #maxrate{}.
|
-type shaper() :: none | #maxrate{}.
|
||||||
|
|
||||||
-export_type([shaper/0]).
|
-export_type([shaper/0]).
|
||||||
|
|
||||||
-spec start() -> ok.
|
-spec start_link() -> {ok, pid()} | {error, any()}.
|
||||||
|
start_link() ->
|
||||||
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
start() ->
|
init([]) ->
|
||||||
ejabberd_mnesia:create(?MODULE, shaper,
|
ejabberd_mnesia:create(?MODULE, shaper,
|
||||||
[{ram_copies, [node()]},
|
[{ram_copies, [node()]},
|
||||||
{local_content, true},
|
{local_content, true},
|
||||||
|
@ -57,8 +65,24 @@ start() ->
|
||||||
mnesia:add_table_copy(shaper, node(), ram_copies),
|
mnesia:add_table_copy(shaper, node(), ram_copies),
|
||||||
ejabberd_hooks:add(config_reloaded, ?MODULE, load_from_config, 20),
|
ejabberd_hooks:add(config_reloaded, ?MODULE, load_from_config, 20),
|
||||||
load_from_config(),
|
load_from_config(),
|
||||||
|
{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.
|
ok.
|
||||||
|
|
||||||
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
||||||
-spec load_from_config() -> ok | {error, any()}.
|
-spec load_from_config() -> ok | {error, any()}.
|
||||||
|
|
||||||
load_from_config() ->
|
load_from_config() ->
|
||||||
|
|
Loading…
Reference in New Issue