SRV DNS records
karma
SSL
+JEP-62,63
\ No newline at end of file
<H3>2.3 Compilation</H3><!--SEC END -->
-<A NAME="sec:compilation"></A><!--TOC section Configuration-->
+<A NAME="sec:compilation"></A><PRE>
+./configure
+make
+</PRE>TBD<BR>
+<BR>
+<!--TOC subsection Starting-->
+
+<H3>2.4 Starting</H3><!--SEC END -->
+
+<A NAME="sec:starting"></A><PRE>
+erl -name ejabberd -s ejabberd
+</PRE>TBD<BR>
+<BR>
+<!--TOC section Configuration-->
<H2>3 Configuration</H2><!--SEC END -->
<H3>4.1 How it works</H3><!--SEC END -->
<A NAME="sec:howitworks"></A>Jabber domain is served by one or more <TT>ejabberd</TT> nodes. This nodes can be
-runned on different computers that can be connected via network. They all must
+runned on different machines that can be connected via network. They all must
have access to connect to port 4369 of all another nodes, and must have same
magic cookie (see Erlang/OTP documentation, in short file
<TT>ejabberd/.erlang.cookie</TT> must be the same on all nodes). This is
needed because all nodes exchange information about connected users, S2S
-connection ,registered services, etc...<BR>
+connection, registered services, etc...<BR>
<BR>
Each <TT>ejabberd</TT> node run following modules:
<UL>
\subsection{Compilation}
\label{sec:compilation}
+\begin{verbatim}
+./configure
+make
+\end{verbatim}
+
+TBD
%\label{sec:initconfig}
+\subsection{Starting}
+\label{sec:starting}
+
+\begin{verbatim}
+erl -name ejabberd -s ejabberd
+\end{verbatim}
+
+TBD
+
\section{Configuration}
\label{sec:configuration}
# $Id$
+include Makefile.inc
+
INCLUDES = -I/usr/lib/erlang/usr/include \
- -I/usr/lib/erlang/lib/erl_interface-3.3.0/include
+ -I$(EI_DIR)/include
-LIBDIRS = -L/usr/lib/erlang/lib/erl_interface-3.3.0/lib
+LIBDIRS = -L$(EI_DIR)/lib
ERLSHLIBS = expat_erl.so
clean:
rm -f *.beam
+Makefile.inc:
+ ./configure
--- /dev/null
+#!/bin/sh
+
+erlc configure.erl
+erl -s configure -noshell
+
--- /dev/null
+%%%----------------------------------------------------------------------
+%%% File : configure.erl
+%%% Author : Alexey Shchepin <alexey@sevcom.net>
+%%% Purpose :
+%%% Created : 27 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
+%%% Id : $Id$
+%%%----------------------------------------------------------------------
+
+-module(configure).
+-author('alexey@sevcom.net').
+-vsn('$Revision$ ').
+
+-export([start/0]).
+
+start() ->
+ EIDirS = "EI_DIR = " ++ code:lib_dir("erl_interface") ++ "\n",
+ file:write_file("Makefile.inc", list_to_binary(EIDirS)),
+ halt().
+
+
sha:start(),
translate:start(),
acl:start(),
+ gen_mod:start(),
ejabberd_config:start(),
ejabberd_auth:start(),
ejabberd_router:start(),
-define(VERSION, "0.0.1-alpha").
--define(ejabberd_debug, true).
--define(DBGFSM, true).
+%-define(ejabberd_debug, true).
+%-define(DBGFSM, true).
-ifdef(ejabberd_debug).
-define(DEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n",
%-define(MYNAME,"e.localhost").
-define(MYNAME, ejabberd_config:get_global_option(host)).
--define(S2STIMEOUT, 1200000).
+-define(S2STIMEOUT, 600000).
+%-define(S2STIMEOUT, 6000).
-define(MSGS_DIR, "msgs").
-define(CONFIG_PATH, "ejabberd.cfg").
loop();
{register_route, Domain, Pid, Node} ->
F = fun() ->
- case mnesia:wread({route, Domain}) of
- [] ->
- ok;
- [Old] ->
- % TODO: notify
- ok
- end,
+ %case mnesia:wread({route, Domain}) of
+ % [] ->
+ % ok;
+ % [Old] ->
+ % % TODO: notify
+ % ok
+ %end,
mnesia:write(#route{domain = Domain,
node = Node,
pid = Pid})
loop();
{unregister_route, Domain} ->
F = fun() ->
- case mnesia:wread({route, Domain}) of
- [] ->
- ok;
- [Old] ->
- % TODO: notify
- ok
- end,
+ %case mnesia:wread({route, Domain}) of
+ % [] ->
+ % ok;
+ % [Old] ->
+ % % TODO: notify
+ % ok
+ %end,
mnesia:delete({route, Domain})
end,
mnesia:transaction(F),
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start_module/2,
+-export([start/0,
+ start_module/2,
stop_module/1,
get_opt/2,
- get_opt/3]).
+ get_opt/3,
+ loaded_modules/0]).
-export([behaviour_info/1]).
-include("ejabberd.hrl").
+-record(ejabberd_module, {module, opts}).
behaviour_info(callbacks) ->
[{start, 1},
behaviour_info(Other) ->
undefined.
+start() ->
+ ets:new(ejabberd_modules, [named_table,
+ public,
+ {keypos, #ejabberd_module.module}]),
+ ok.
+
start_module(Module, Opts) ->
case catch Module:start(Opts) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
+ ets:insert(ejabberd_modules, #ejabberd_module{module = Module,
+ opts = Opts}),
ok
end.
stop_module(Module) ->
- Module:stop().
+ case catch Module:stop() of
+ {'EXIT', Reason} ->
+ ?ERROR_MSG("~p", [Reason]);
+ _ ->
+ ets:delete(ejabberd_modules, Module),
+ ok
+ end.
get_opt(Opt, Opts) ->
Val
end.
+loaded_modules() ->
+ ets:select(ejabberd_modules,
+ [{#ejabberd_module{_ = '_', module = '$1'}, [],['$1']}]).
%%%----------------------------------------------------------------------
%%% File : mod_configure.erl
%%% Author : Alexey Shchepin <alexey@sevcom.net>
-%%% Purpose :
+%%% Purpose : Support for online configuration of ejabberd via x:data
%%% Created : 19 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
%%% Id : $Id$
%%%----------------------------------------------------------------------
end
end;
+get_form(["running nodes", ENode, "modules", "stop"], Lang) ->
+ case search_running_node(ENode) of
+ false ->
+ {error, "404", "Not Found"};
+ Node ->
+ case rpc:call(Node, gen_mod, loaded_modules, []) of
+ {badrpc, Reason} ->
+ {error, "500", "Internal Server Error"};
+ Modules ->
+ SModules = lists:sort(Modules),
+ {result, [{xmlelement, "title", [],
+ [{xmlcdata,
+ translate:translate(
+ Lang, "Stop Modules")}]},
+ {xmlelement, "instructions", [],
+ [{xmlcdata,
+ translate:translate(
+ Lang, "Choose modules to stop")}]} |
+ lists:map(fun(M) ->
+ S = atom_to_list(M),
+ ?XFIELD("boolean", S, S, "0")
+ end, SModules)
+ ]}
+ end
+ end;
+
+get_form(["running nodes", ENode, "modules", "start"], Lang) ->
+ {result, [{xmlelement, "title", [],
+ [{xmlcdata,
+ translate:translate(
+ Lang, "Start Modules")}]},
+ {xmlelement, "instructions", [],
+ [{xmlcdata,
+ translate:translate(
+ Lang, "Enter list of {Module, [Options]}")}]},
+ {xmlelement, "field", [{"type", "text-multi"},
+ {"label",
+ translate:translate(
+ Lang, "List of modules to start")},
+ {"var", "modules"}],
+ [{xmlelement, "value", [], [{xmlcdata, "[]."}]}]
+ }
+ ]};
+
get_form(["config", "hostname"], Lang) ->
{result, [{xmlelement, "title", [],
[{xmlcdata,
{result, []}
end;
+set_form(["running nodes", ENode, "modules", "stop"], Lang, XData) ->
+ case search_running_node(ENode) of
+ false ->
+ {error, "404", "Not Found"};
+ Node ->
+ lists:foreach(
+ fun({Var, Vals}) ->
+ case Vals of
+ ["1"] ->
+ Module = list_to_atom(Var),
+ rpc:call(Node, gen_mod, stop_module, [Module]);
+ _ ->
+ ok
+ end
+ end, XData),
+ {result, []}
+ end;
+
+set_form(["running nodes", ENode, "modules", "start"], Lang, XData) ->
+ case search_running_node(ENode) of
+ false ->
+ {error, "404", "Not Found"};
+ Node ->
+ case lists:keysearch("modules", 1, XData) of
+ false ->
+ {error, "406", "Not Acceptable"};
+ {value, {_, Strings}} ->
+ String = lists:foldl(fun(S, Res) ->
+ Res ++ S ++ "\n"
+ end, "", Strings),
+ case erl_scan:string(String) of
+ {ok, Tokens, _} ->
+ case erl_parse:parse_term(Tokens) of
+ {ok, Modules} ->
+ case catch lists:foreach(
+ fun({Module, Args}) ->
+ gen_mod:start_module(
+ Module, Args)
+ end, Modules) of
+ {'EXIT', Reason} ->
+ {error,
+ "500", "Internal Server Error"};
+ _ ->
+ {result, []}
+ end;
+ _ ->
+ {error, "500", "Internal Server Error"}
+ end;
+ _ ->
+ {error, "500", "Internal Server Error"}
+ end;
+ _ ->
+ {error, "406", "Not Acceptable"}
+ end
+ end;
+
+
set_form(["config", "hostname"], Lang, XData) ->
case lists:keysearch("hostname", 1, XData) of
false ->
%%%----------------------------------------------------------------------
%%% File : mod_disco.erl
%%% Author : Alexey Shchepin <alexey@sevcom.net>
-%%% Purpose :
+%%% Purpose : Service Discovery (JEP-0030) support
%%% Created : 1 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
%%% Id : $Id$
%%%----------------------------------------------------------------------
[feature_to_xml({?NS_XDATA})
]
}]};
+ ["running nodes", ENode, "modules"] -> ?EMPTY_INFO_RESULT;
+ ["running nodes", ENode, "modules", _] ->
+ {iq, ID, result, XMLNS,
+ [{xmlelement, "query", [{"xmlns", XMLNS}],
+ [feature_to_xml({?NS_XDATA})]}]};
["config", _] ->
{iq, ID, result, XMLNS,
[{xmlelement, "query", [{"xmlns", XMLNS}],
[?NODE("Host Name", "config/hostname"),
?NODE("ACLs", "config/acls"),
?NODE("Access Rules", "config/access"),
- ?NODE("Loaded Modules", "config/modules"),
?NODE("Remove Users", "config/remusers")
]};
get_local_items(["running nodes", ENode], Server, Lang) ->
{result,
- [?NODE("DB", "running nodes/" ++ ENode ++ "/DB")]};
+ [?NODE("DB", "running nodes/" ++ ENode ++ "/DB"),
+ ?NODE("Modules", "running nodes/" ++ ENode ++ "/modules")
+ ]};
get_local_items(["running nodes", ENode, "DB"], Server, Lang) ->
{result, []};
+get_local_items(["running nodes", ENode, "modules"], Server, Lang) ->
+ {result,
+ [?NODE("Start Modules", "running nodes/" ++ ENode ++ "/modules/start"),
+ ?NODE("Stop Modules", "running nodes/" ++ ENode ++ "/modules/stop")
+ ]};
+
+get_local_items(["running nodes", ENode, "modules", _], Server, Lang) ->
+ {result, []};
+
get_local_items(_, _, _) ->
{error, "501", "Not Implemented"}.
-behaviour(gen_mod).
--export([start/1, init/1]).
+-export([start/1, init/1, stop/0]).
-include("ejabberd.hrl").
-include("namespaces.hrl").
start(Opts) ->
%Host = gen_mod:get_opt(host, Opts),
Host = gen_mod:get_opt(host, Opts, "echo." ++ ?MYNAME),
- spawn(?MODULE, init, [Host]).
+ register(ejabberd_mod_echo, spawn(?MODULE, init, [Host])).
init(Host) ->
ejabberd_router:register_local_route(Host),
- loop().
+ loop(Host).
-loop() ->
+loop(Host) ->
receive
{route, From, To, Packet} ->
ejabberd_router:route(To, From, Packet),
- loop();
+ loop(Host);
+ stop ->
+ ejabberd_router:unregister_local_route(Host),
+ ok;
_ ->
- loop()
+ loop(Host)
end.
+stop() ->
+ ejabberd_mod_echo ! stop,
+ ok.