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 7356258c..bb18b0ea 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 c9be1570..6a42eb94 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 08073153..2cc96509 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 00000000..5ad9c096 --- /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 00000000..30c41aa1 --- /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 a5c3675e..2f6d2feb 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 68499e66..6cac0e99 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 97599026..171244c0 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 6978dbe3..2f9d0738 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 cc2f6727..6e6b7f90 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 bb3d40ff..705780a5 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 03a25d25..5f02c400 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. |