aboutsummaryrefslogtreecommitdiff
path: root/src/eldap_pool.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2013-04-08 11:12:54 +0200
committerChristophe Romain <christophe.romain@process-one.net>2013-06-13 11:11:02 +0200
commit4d8f7706240a1603468968f47fc7b150b788d62f (patch)
tree92d55d789cc7ac979b3c9e161ffb7f908eba043a /src/eldap_pool.erl
parentFix Guide: ejabberd_service expects a shaper_rule, not a shaper (diff)
Switch to rebar build tool
Use dynamic Rebar configuration Make iconv dependency optional Disable transient_supervisors compile option Add hipe compilation support Only compile ibrowse and lhttpc when needed Make it possible to generate an OTP application release Add --enable-debug compile option Add --enable-all compiler option Add --enable-tools configure option Add --with-erlang configure option. Add --enable-erlang-version-check configure option. Add lager support Improve the test suite
Diffstat (limited to 'src/eldap_pool.erl')
-rw-r--r--src/eldap_pool.erl87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/eldap_pool.erl b/src/eldap_pool.erl
new file mode 100644
index 000000000..35fabeb74
--- /dev/null
+++ b/src/eldap_pool.erl
@@ -0,0 +1,87 @@
+%%%-------------------------------------------------------------------
+%%% File : eldap_pool.erl
+%%% Author : Evgeniy Khramtsov <xram@jabber.ru>
+%%% Purpose : LDAP connections pool
+%%% Created : 12 Nov 2006 by Evgeniy Khramtsov <xram@jabber.ru>
+%%%
+%%%
+%%% ejabberd, Copyright (C) 2002-2013 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., 59 Temple Place, Suite 330, Boston, MA
+%%% 02111-1307 USA
+%%%
+%%%-------------------------------------------------------------------
+
+-module(eldap_pool).
+
+-author('xram@jabber.ru').
+
+%% API
+-export([start_link/7, bind/3, search/2,
+ modify_passwd/3]).
+
+-include("ejabberd.hrl").
+-include("logger.hrl").
+
+%%====================================================================
+%% API
+%%====================================================================
+bind(PoolName, DN, Passwd) ->
+ do_request(PoolName, {bind, [DN, Passwd]}).
+
+search(PoolName, Opts) ->
+ do_request(PoolName, {search, [Opts]}).
+
+modify_passwd(PoolName, DN, Passwd) ->
+ do_request(PoolName, {modify_passwd, [DN, Passwd]}).
+
+start_link(Name, Hosts, Backups, Port, Rootdn, Passwd,
+ Opts) ->
+ PoolName = make_id(Name),
+ pg2:create(PoolName),
+ lists:foreach(fun (Host) ->
+ ID = list_to_binary(erlang:ref_to_list(make_ref())),
+ case catch eldap:start_link(ID, [Host | Backups],
+ Port, Rootdn, Passwd,
+ Opts)
+ of
+ {ok, Pid} -> pg2:join(PoolName, Pid);
+ Err ->
+ ?INFO_MSG("Err = ~p", [Err]),
+ error
+ end
+ end,
+ Hosts).
+
+%%====================================================================
+%% Internal functions
+%%====================================================================
+do_request(Name, {F, Args}) ->
+ case pg2:get_closest_pid(make_id(Name)) of
+ Pid when is_pid(Pid) ->
+ case catch apply(eldap, F, [Pid | Args]) of
+ {'EXIT', {timeout, _}} ->
+ ?ERROR_MSG("LDAP request failed: timed out", []);
+ {'EXIT', Reason} ->
+ ?ERROR_MSG("LDAP request failed: eldap:~p(~p)~nReason: ~p",
+ [F, Args, Reason]),
+ {error, Reason};
+ Reply -> Reply
+ end;
+ Err -> Err
+ end.
+
+make_id(Name) ->
+ jlib:binary_to_atom(<<"eldap_pool_", Name/binary>>).