diff options
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | doc/guide.html | 19 | ||||
-rw-r--r-- | doc/guide.tex | 15 | ||||
-rw-r--r-- | src/Makefile | 8 | ||||
-rwxr-xr-x | src/configure | 5 | ||||
-rw-r--r-- | src/configure.erl | 20 | ||||
-rw-r--r-- | src/ejabberd.erl | 1 | ||||
-rw-r--r-- | src/ejabberd.hrl | 7 | ||||
-rw-r--r-- | src/ejabberd_router.erl | 28 | ||||
-rw-r--r-- | src/gen_mod.erl | 26 | ||||
-rw-r--r-- | src/mod_configure.erl | 103 | ||||
-rw-r--r-- | src/mod_disco.erl | 21 | ||||
-rw-r--r-- | src/mod_echo.erl | 18 |
13 files changed, 237 insertions, 35 deletions
@@ -8,3 +8,4 @@ iq:browse(?) SRV DNS records karma SSL +JEP-62,63
\ No newline at end of file diff --git a/doc/guide.html b/doc/guide.html index 7356258cb..bb18b0eab 100644 --- a/doc/guide.html +++ b/doc/guide.html @@ -72,7 +72,20 @@ Latest alpha version can be retrieved via CVS. Do following steps: <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 --> @@ -216,12 +229,12 @@ TBD<BR> <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> diff --git a/doc/guide.tex b/doc/guide.tex index c9be15708..6a42eb947 100644 --- a/doc/guide.tex +++ b/doc/guide.tex @@ -94,6 +94,12 @@ Latest alpha version can be retrieved via CVS\@. Do following steps: \subsection{Compilation} \label{sec:compilation} +\begin{verbatim} +./configure +make +\end{verbatim} + +TBD @@ -101,6 +107,15 @@ Latest alpha version can be retrieved via CVS\@. Do following steps: %\label{sec:initconfig} +\subsection{Starting} +\label{sec:starting} + +\begin{verbatim} +erl -name ejabberd -s ejabberd +\end{verbatim} + +TBD + \section{Configuration} \label{sec:configuration} diff --git a/src/Makefile b/src/Makefile index 08073153e..2cc96509c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,9 +1,11 @@ # $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 @@ -22,3 +24,5 @@ $(ERLSHLIBS): %.so: %.c clean: rm -f *.beam +Makefile.inc: + ./configure diff --git a/src/configure b/src/configure new file mode 100755 index 000000000..5ad9c096e --- /dev/null +++ b/src/configure @@ -0,0 +1,5 @@ +#!/bin/sh + +erlc configure.erl +erl -s configure -noshell + diff --git a/src/configure.erl b/src/configure.erl new file mode 100644 index 000000000..30c41aa15 --- /dev/null +++ b/src/configure.erl @@ -0,0 +1,20 @@ +%%%---------------------------------------------------------------------- +%%% 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(). + + diff --git a/src/ejabberd.erl b/src/ejabberd.erl index a5c3675e3..2f6d2feba 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -31,6 +31,7 @@ init() -> sha:start(), translate:start(), acl:start(), + gen_mod:start(), ejabberd_config:start(), ejabberd_auth:start(), ejabberd_router:start(), diff --git a/src/ejabberd.hrl b/src/ejabberd.hrl index 68499e663..6cac0e995 100644 --- a/src/ejabberd.hrl +++ b/src/ejabberd.hrl @@ -8,8 +8,8 @@ -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", @@ -25,7 +25,8 @@ %-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"). diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 975990263..171244c03 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -56,13 +56,13 @@ loop() -> 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}) @@ -78,13 +78,13 @@ loop() -> 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), diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 6978dbe37..2f9d07382 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -10,15 +10,18 @@ -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}, @@ -26,17 +29,31 @@ behaviour_info(callbacks) -> 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) -> @@ -56,3 +73,6 @@ get_opt(Opt, Opts, Default) -> Val end. +loaded_modules() -> + ets:select(ejabberd_modules, + [{#ejabberd_module{_ = '_', module = '$1'}, [],['$1']}]). diff --git a/src/mod_configure.erl b/src/mod_configure.erl index cc2f6727c..6e6b7f903 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -1,7 +1,7 @@ %%%---------------------------------------------------------------------- %%% 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$ %%%---------------------------------------------------------------------- @@ -162,6 +162,50 @@ get_form(["running nodes", ENode, "DB"], Lang) -> 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, @@ -260,6 +304,63 @@ set_form(["running nodes", ENode, "DB"], Lang, XData) -> {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 -> diff --git a/src/mod_disco.erl b/src/mod_disco.erl index bb3d40ffa..705780a5c 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -1,7 +1,7 @@ %%%---------------------------------------------------------------------- %%% 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$ %%%---------------------------------------------------------------------- @@ -114,6 +114,11 @@ process_local_iq_info(From, To, {iq, ID, Type, XMLNS, SubEl}) -> [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}], @@ -160,7 +165,6 @@ get_local_items(["config"], Server, Lang) -> [?NODE("Host Name", "config/hostname"), ?NODE("ACLs", "config/acls"), ?NODE("Access Rules", "config/access"), - ?NODE("Loaded Modules", "config/modules"), ?NODE("Remove Users", "config/remusers") ]}; @@ -187,11 +191,22 @@ get_local_items(["stopped nodes"], Server, Lang) -> 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"}. diff --git a/src/mod_echo.erl b/src/mod_echo.erl index 03a25d25e..5f02c4002 100644 --- a/src/mod_echo.erl +++ b/src/mod_echo.erl @@ -12,7 +12,7 @@ -behaviour(gen_mod). --export([start/1, init/1]). +-export([start/1, init/1, stop/0]). -include("ejabberd.hrl"). -include("namespaces.hrl"). @@ -22,18 +22,24 @@ 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. |