]> granicus.if.org Git - ejabberd/commitdiff
*** empty log message ***
authorAlexey Shchepin <alexey@process-one.net>
Tue, 28 Jan 2003 19:45:13 +0000 (19:45 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Tue, 28 Jan 2003 19:45:13 +0000 (19:45 +0000)
SVN Revision: 52

13 files changed:
TODO
doc/guide.html
doc/guide.tex
src/Makefile
src/configure [new file with mode: 0755]
src/configure.erl [new file with mode: 0644]
src/ejabberd.erl
src/ejabberd.hrl
src/ejabberd_router.erl
src/gen_mod.erl
src/mod_configure.erl
src/mod_disco.erl
src/mod_echo.erl

diff --git a/TODO b/TODO
index cbd8e27b79784305c002dd6d08ac965596aa771c..e3f828c9fe2b437f65bf51d2cb0b4b036d0f6fcf 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,3 +8,4 @@ iq:browse(?)
 SRV DNS records
 karma
 SSL
+JEP-62,63
\ No newline at end of file
index 7356258cb37a286bbf20e3acf32bd827f7b63a37..bb18b0eab9996ea074641261844d70c38cf3e1e2 100644 (file)
@@ -72,7 +72,20 @@ Latest alpha version can be retrieved via CVS. Do following steps:
 
 <H3>2.3&nbsp;&nbsp; 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&nbsp;&nbsp; Starting</H3><!--SEC END -->
+
+<A NAME="sec:starting"></A><PRE>
+erl -name ejabberd -s ejabberd
+</PRE>TBD<BR>
+<BR>
+<!--TOC section Configuration-->
 
 <H2>3&nbsp;&nbsp; Configuration</H2><!--SEC END -->
 
@@ -216,12 +229,12 @@ TBD<BR>
 <H3>4.1&nbsp;&nbsp; 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>
+connectionregistered services, etc...<BR>
 <BR>
 Each <TT>ejabberd</TT> node run following modules:
 <UL>
index c9be157087a32b43cbbe58d50fb970b14c052e63..6a42eb947ba175844a55970e0f8d78f414ec3e3e 100644 (file)
@@ -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}
 
index 08073153e9bdcec21d8244cf0a603dd535968161..2cc96509ca01e0a8f644f5cf3a057b43f2e53061 100644 (file)
@@ -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 (executable)
index 0000000..5ad9c09
--- /dev/null
@@ -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 (file)
index 0000000..30c41aa
--- /dev/null
@@ -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().
+
+
index a5c3675e385b2dde1771e4c24e1686aacb60c53d..2f6d2febab34be7041ffd45efa8314c86e180835 100644 (file)
@@ -31,6 +31,7 @@ init() ->
     sha:start(),
     translate:start(),
     acl:start(),
+    gen_mod:start(),
     ejabberd_config:start(),
     ejabberd_auth:start(),
     ejabberd_router:start(),
index 68499e663cd760482c90baf34e1f70652e4cf26b..6cac0e99550769bdeec1950dd717888e2a7b48af 100644 (file)
@@ -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").
index 97599026320bf49d8d384845012e732bccf36303..171244c03ee2f560671e43b3b509a01122a0ed19 100644 (file)
@@ -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),
index 6978dbe372e584b4f0cce1c0e4e257ee34039bbe..2f9d07382d3d6ba5195b42b45f82a8addb31176f 100644 (file)
 -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']}]).
index cc2f6727c4e68581daecac7f7ae26cf3640a5dc1..6e6b7f903d6dc007aa53a74ca7b13bc69748f827 100644 (file)
@@ -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 ->
index bb3d40ffa543d92b12c2e19fef1fd3156393c319..705780a5ccf6300e1be08a2f2f989975dd4e321b 100644 (file)
@@ -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"}.
 
index 03a25d25e2e0d1f98481c5d59384a27681ea4e43..5f02c40022381741995197ff5f53c095423c0d67 100644 (file)
@@ -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").
 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.