Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-01-28 22:45:13 +0300
committerAlexey Shchepin <alexey@process-one.net>2003-01-28 22:45:13 +0300
commit275b31b0cf7c91a549a996b9c714def5bac5c4a4 (patch)
treed668270265dd3402075cb3949bad11599d61dbf7 /src
parentaed24c637fea62e0a72636fd0a1714a9ecd16a6b (diff)
*** empty log message ***
SVN Revision: 52
Diffstat (limited to 'src')
-rw-r--r--src/Makefile8
-rwxr-xr-xsrc/configure5
-rw-r--r--src/configure.erl20
-rw-r--r--src/ejabberd.erl1
-rw-r--r--src/ejabberd.hrl7
-rw-r--r--src/ejabberd_router.erl28
-rw-r--r--src/gen_mod.erl26
-rw-r--r--src/mod_configure.erl103
-rw-r--r--src/mod_disco.erl21
-rw-r--r--src/mod_echo.erl18
10 files changed, 205 insertions, 32 deletions
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.