+2003-10-12 Alexey Shchepin <alexey@sevcom.net>
+
+ * doc/guide.tex: Updated
+
+ * src/ejabberd_s2s_out.erl: Added support for IPv6 and
+ "_jabber-server.tcp" lookups
+
+ * src/jlib.erl (string_to_jid1): Bugfix
+
+ * src/ejabberd_config.erl: Now possible to specify path to config
+ file in command line
+
2003-10-11 Alexey Shchepin <alexey@sevcom.net>
* doc/guide.tex: Updated
<BR>
The main features of <TT>ejabberd</TT> is:
<UL><LI>
-Works on most of popular platforms: *nix (tested on Linux and FreeBSD)
- and Win32
+Works on most of popular platforms: *nix (tested on Linux, FreeBSD and
+ NetBSD) and Win32
<LI>Distributed: You can run <TT>ejabberd</TT> on a cluster of machines and all of
them will serve one Jabber domain.
<LI>Fault-tolerance: You can setup an <TT>ejabberd</TT> cluster so that all the
<H3><A NAME="htoc10">2.4</A> Starting</H3><!--SEC END -->
<A NAME="sec:starting"></A>
-... To use more than 1024 connections, you will need to set environment
-variable <TT>ERL_MAX_PORTS</TT>:
+To start <TT>ejabberd</TT>, use the following command:
+<PRE>
+erl -name ejabberd -s ejabberd
+</PRE>or
+<PRE>
+erl -sname ejabberd -s ejabberd
+</PRE>In second case Erlang node will be identified using only first part of host
+name, i. e. other Erlang nodes not inside this domain can't contact this node.<BR>
+<BR>
+To specify path to config file, use command like this:
+<PRE>
+erl -sname ejabberd -s ejabberd -ejabberd config \"/etc/ejabberd/ejabberd.cfg\"
+</PRE>
+To use more than 1024 connections, you will need to set environment variable
+<CODE>ERL_MAX_PORTS</CODE>:
<PRE>
export ERL_MAX_PORTS=32000
</PRE>Note that with this value <TT>ejabberd</TT> will use more memory (approximately 6MB
-more)...
+more).<BR>
+<BR>
+To reduce memory usage, you can set environment variable
+<CODE>ERL_FULLSWEEP_AFTER</CODE>:
<PRE>
-erl -name ejabberd -s ejabberd
-</PRE>
-TBD<BR>
+export ERL_FULLSWEEP_AFTER=0
+</PRE>But in this case <TT>ejabberd</TT> can start to work slower.<BR>
<BR>
<!--TOC section Configuration-->
</UL>
Currently three modules are implemented:
<DL COMPACT=compact><DT>
-<B><TT>ejabberd_c2s</TT></B><DD> This module serves C2S connections.<BR>
+<CODE><B>ejabberd_c2s</B></CODE><DD> This module serves C2S connections.<BR>
<BR>
The following options are defined:
<DL COMPACT=compact><DT>
- <B><TT>{access, <access rule>}</TT></B><DD> This option defines access of users
+ <CODE><B>{access, <access rule>}</B></CODE><DD> This option defines access of users
to this C2S port. Default value is ``<TT>all</TT>''.
- <DT><B><TT>{shaper, <access rule>}</TT></B><DD> This option is like previous, but
+ <DT><CODE><B>{shaper, <access rule>}</B></CODE><DD> This option is like previous, but
use shapers instead of ``<TT>allow</TT>'' and ``<TT>deny</TT>''. Default
value is ``<TT>none</TT>''.
+ <DT><CODE><B>{ssl, SSLOpts}</B></CODE><DD> This option defines that traffic on this port
+ will be encrypted using SSL. SSL options are the same as described by
+ ``<CODE>erl -man ssl</CODE>'' command
</DL>
-<DT><B><TT>ejabberd_s2s_in</TT></B><DD> This module serves incoming S2S connections.
-<DT><B><TT>ejabberd_service</TT></B><DD> This module serves connections from Jabber
+<DT><CODE><B>ejabberd_s2s_in</B></CODE><DD> This module serves incoming S2S connections.
+<DT><CODE><B>ejabberd_service</B></CODE><DD> This module serves connections from Jabber
services (i. e. that use the <TT>jabber:component:accept</TT> namespace).
</DL>
For example, the following configuration defines that C2S connections are
The main features of \ejabberd{} is:
\begin{itemize}
-\item Works on most of popular platforms: *nix (tested on Linux and FreeBSD)
- and Win32
+\item Works on most of popular platforms: *nix (tested on Linux, FreeBSD and
+ NetBSD) and Win32
\item Distributed: You can run \ejabberd{} on a cluster of machines and all of
them will serve one Jabber domain.
\item Fault-tolerance: You can setup an \ejabberd{} cluster so that all the
\subsection{Starting}
\label{sec:starting}
-\ldots{} To use more than 1024 connections, you will need to set environment
-variable \texttt{ERL\_MAX\_PORTS}:
+To start \ejabberd{}, use the following command:
+\begin{verbatim}
+erl -name ejabberd -s ejabberd
+\end{verbatim}
+or
+\begin{verbatim}
+erl -sname ejabberd -s ejabberd
+\end{verbatim}
+In second case Erlang node will be identified using only first part of host
+name, i.\,e. other Erlang nodes not inside this domain can't contact this node.
+
+To specify path to config file, use command like this:
+\begin{verbatim}
+erl -sname ejabberd -s ejabberd -ejabberd config \"/etc/ejabberd/ejabberd.cfg\"
+\end{verbatim}
+
+
+To use more than 1024 connections, you will need to set environment variable
+\verb|ERL_MAX_PORTS|:
\begin{verbatim}
export ERL_MAX_PORTS=32000
\end{verbatim}
Note that with this value \ejabberd{} will use more memory (approximately 6MB
-more)\ldots{}
+more).
+To reduce memory usage, you can set environment variable
+\verb|ERL_FULLSWEEP_AFTER|:
\begin{verbatim}
-erl -name ejabberd -s ejabberd
+export ERL_FULLSWEEP_AFTER=0
\end{verbatim}
+But in this case \ejabberd{} can start to work slower.
+
+
-TBD
\section{Configuration}
\label{sec:configuration}
Currently three modules are implemented:
\begin{description}
-\item[\texttt{ejabberd\_c2s}] This module serves C2S connections.
+\item[\verb|ejabberd_c2s|] This module serves C2S connections.
The following options are defined:
\begin{description}
- \item[\texttt{\{access, <access rule>\}}] This option defines access of users
+ \item[\verb|{access, <access rule>}|] This option defines access of users
to this C2S port. Default value is ``\texttt{all}''.
- \item[\texttt{\{shaper, <access rule>\}}] This option is like previous, but
+ \item[\verb|{shaper, <access rule>}|] This option is like previous, but
use shapers instead of ``\texttt{allow}'' and ``\texttt{deny}''. Default
value is ``\texttt{none}''.
+ \item[\verb|{ssl, SSLOpts}|] This option defines that traffic on this port
+ will be encrypted using SSL. SSL options are the same as described by
+ ``\verb|erl -man ssl|'' command
\end{description}
-\item[\texttt{ejabberd\_s2s\_in}] This module serves incoming S2S connections.
-\item[\texttt{ejabberd\_service}] This module serves connections from \Jabber{}
+\item[\verb|ejabberd_s2s_in|] This module serves incoming S2S connections.
+\item[\verb|ejabberd_service|] This module serves connections from \Jabber{}
services (i.\,e.\ that use the \texttt{jabber:component:accept} namespace).
\end{description}
% Another examples of ACLs:
%{acl, jabberorg, {server, "jabber.org"}}.
%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
-%{acl, test, {user_regexp, "^test"}}.
+%{acl, test, {user_regexp, "^test"}}.
%{acl, test, {user_glob, "test*"}}.
{local_content, true},
{attributes, record_info(fields, local_config)}]),
mnesia:add_table_copy(local_config, node(), ram_copies),
- load_file(?CONFIG_PATH).
+ Config = case application:get_env(config) of
+ {ok, Path} -> Path;
+ undefined -> ?CONFIG_PATH
+ end,
+ load_file(Config).
load_file(File) ->
Res = lists:foldl(fun process_term/2, #state{}, Terms),
set_opts(Res);
{error, Reason} ->
- ?ERROR_MSG("~p", [Reason]),
+ ?ERROR_MSG("Can't load config file ~p: ~p", [File, Reason]),
exit(file:format_error(Reason))
end.
open_socket(init, StateData) ->
{Addr, Port} = get_addr_port(StateData#state.server),
?DEBUG("s2s_out: connecting to ~s:~p~n", [Addr, Port]),
- case gen_tcp:connect(Addr,
- Port,
- [binary, {packet, 0}]) of
+ Res = case gen_tcp:connect(Addr, Port,
+ [binary, {packet, 0}]) of
+ {ok, _Socket} = R -> R;
+ {error, Reason1} ->
+ ?DEBUG("s2s_out: connect return ~p~n", [Reason1]),
+ gen_tcp:connect(Addr, Port,
+ [binary, {packet, 0},
+ {tcp_module, inet6_tcp}])
+ end,
+ case Res of
{ok, Socket} ->
XMLStreamPid = xml_stream:start(self()),
send_text(Socket, io_lib:format(?STREAM_HEADER,
streamid = new_id()},
?S2STIMEOUT};
{error, Reason} ->
- ?DEBUG("s2s_out: connect return ~p~n", [Reason]),
- Error = case Reason of
- timeout -> ?ERR_REMOTE_SERVER_TIMEOUT;
- _ -> ?ERR_REMOTE_SERVER_NOT_FOUND
- end,
+ ?DEBUG("s2s_out: inet6 connect return ~p~n", [Reason]),
+ Error = ?ERR_REMOTE_SERVER_NOT_FOUND,
bounce_messages(Error),
{stop, normal, StateData}
end.
-include_lib("kernel/include/inet.hrl").
get_addr_port(Server) ->
- case inet_res:getbyname("_jabber._tcp." ++ Server, srv) of
+ Res = case inet_res:getbyname("_jabber-server._tcp." ++ Server, srv) of
+ {error, _Reason} ->
+ inet_res:getbyname("_jabber._tcp." ++ Server, srv);
+ {ok, _HEnt} = R -> R
+ end,
+ case Res of
{error, Reason} ->
?DEBUG("srv lookup of '~s' failed: ~p~n", [Server, Reason]),
{Server, ejabberd_config:get_local_option(outgoing_s2s_port)};
error;
string_to_jid1([$/ | J], N) ->
string_to_jid3(J, "", lists:reverse(N), "");
-string_to_jid1([C | J], N)
- when (C =< 32) or
- (C == $") or
- (C == $&) or
- (C == $') or
- (C == $:) or
- (C == $<) or
- (C == $>) or
- (C == 127)
- ->
- error;
string_to_jid1([C | J], N) ->
string_to_jid1(J, [C | N]);
string_to_jid1([], "") ->