diff options
author | Badlop <badlop@process-one.net> | 2010-07-30 20:33:03 +0200 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2010-07-30 20:33:03 +0200 |
commit | 550363cd523c40d13ca204d247e0236c13405c5d (patch) | |
tree | cdc2b0b446d5ec61a93ba34fcea4842a0765e77c /src | |
parent | Don't say v1.2, because that number is never increased and is confusing (diff) |
Support parallel extauth script (thanks to Jesse Thompson)(EJAB-1280)
Diffstat (limited to 'src')
-rw-r--r-- | src/extauth.erl | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/extauth.erl b/src/extauth.erl index 1cbd33126..3f96c9ab2 100644 --- a/src/extauth.erl +++ b/src/extauth.erl @@ -43,16 +43,29 @@ -define(CALL_TIMEOUT, 10000). % Timeout is in milliseconds: 10 seconds == 10000 start(Host, ExtPrg) -> - spawn(?MODULE, init, [Host, ExtPrg]). - -init(Host, ExtPrg) -> - register(gen_mod:get_module_proc(Host, eauth), self()), + lists:foreach( + fun(This) -> + spawn(?MODULE, init, [get_process_name(Host, This), ExtPrg]) + end, + lists:seq(0, get_instances(Host)-1) + ). + +init(ProcessName, ExtPrg) -> + register(ProcessName, self()), process_flag(trap_exit,true), Port = open_port({spawn, ExtPrg}, [{packet,2}]), loop(Port, ?INIT_TIMEOUT). stop(Host) -> - gen_mod:get_module_proc(Host, eauth) ! stop. + lists:foreach( + fun(This) -> + get_process_name(Host, This) ! stop + end, + lists:seq(0, get_instances(Host)-1) + ). + +get_process_name(Host, Integer) -> + gen_mod:get_module_proc(lists:append([Host, integer_to_list(Integer)]), eauth). check_password(User, Server, Password) -> call_port(Server, ["auth", User, Server, Password]). @@ -77,12 +90,24 @@ remove_user(User, Server, Password) -> call_port(Server, Msg) -> LServer = jlib:nameprep(Server), - gen_mod:get_module_proc(LServer, eauth) ! {call, self(), Msg}, + ProcessName = get_process_name(LServer, random_instance(get_instances(LServer))), + ProcessName ! {call, self(), Msg}, receive {eauth,Result} -> Result end. +random_instance(MaxNum) -> + {A1,A2,A3} = now(), + random:seed(A1, A2, A3), + random:uniform(MaxNum) - 1. + +get_instances(Server) -> + case ejabberd_config:get_local_option({extauth_instances, Server}) of + Num when is_integer(Num) -> Num; + _ -> 1 + end. + loop(Port, Timeout) -> receive {call, Caller, Msg} -> |