* src/web/ejabberd_web_admin.erl: Added configuration of listened
ports * src/ejabberd_listener.erl: Added API for configuration of port listeners * src/web/ejabberd_web_admin.erl: Fixed "Stop" button on node management page SVN Revision: 238
This commit is contained in:
parent
ab8be3658f
commit
84c4d93ca5
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2004-06-18 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
|
* src/web/ejabberd_web_admin.erl: Added configuration of listened
|
||||||
|
ports
|
||||||
|
* src/ejabberd_listener.erl: Added API for configuration of port
|
||||||
|
listeners
|
||||||
|
|
||||||
|
* src/web/ejabberd_web_admin.erl: Fixed "Stop" button on node
|
||||||
|
management page
|
||||||
|
|
||||||
2004-05-22 Alexey Shchepin <alexey@sevcom.net>
|
2004-05-22 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
* src/msgs/nl.msg: Dutch translation (thanks to Sander Devrieze)
|
* src/msgs/nl.msg: Dutch translation (thanks to Sander Devrieze)
|
||||||
|
|
|
@ -14,7 +14,9 @@
|
||||||
init/3,
|
init/3,
|
||||||
init_ssl/4,
|
init_ssl/4,
|
||||||
start_listener/3,
|
start_listener/3,
|
||||||
stop_listener/1
|
stop_listener/1,
|
||||||
|
add_listener/3,
|
||||||
|
delete_listener/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
@ -33,7 +35,7 @@ init(_) ->
|
||||||
fun({Port, Module, Opts}) ->
|
fun({Port, Module, Opts}) ->
|
||||||
{Port,
|
{Port,
|
||||||
{?MODULE, start, [Port, Module, Opts]},
|
{?MODULE, start, [Port, Module, Opts]},
|
||||||
permanent,
|
transient,
|
||||||
brutal_kill,
|
brutal_kill,
|
||||||
worker,
|
worker,
|
||||||
[?MODULE]}
|
[?MODULE]}
|
||||||
|
@ -63,13 +65,21 @@ init(Port, Module, Opts) ->
|
||||||
(inet) -> true;
|
(inet) -> true;
|
||||||
(_) -> false
|
(_) -> false
|
||||||
end, Opts),
|
end, Opts),
|
||||||
{ok, ListenSocket} = gen_tcp:listen(Port, [binary,
|
|
||||||
{packet, 0},
|
Res = gen_tcp:listen(Port, [binary,
|
||||||
{active, false},
|
{packet, 0},
|
||||||
{reuseaddr, true},
|
{active, false},
|
||||||
{nodelay, true} |
|
{reuseaddr, true},
|
||||||
SockOpts]),
|
{nodelay, true} |
|
||||||
accept(ListenSocket, Module, Opts).
|
SockOpts]),
|
||||||
|
case Res of
|
||||||
|
{ok, ListenSocket} ->
|
||||||
|
accept(ListenSocket, Module, Opts);
|
||||||
|
{error, Reason} ->
|
||||||
|
?ERROR_MSG("Failed to open socket for ~p: ~p",
|
||||||
|
[{Port, Module, Opts}, Reason]),
|
||||||
|
error
|
||||||
|
end.
|
||||||
|
|
||||||
accept(ListenSocket, Module, Opts) ->
|
accept(ListenSocket, Module, Opts) ->
|
||||||
case gen_tcp:accept(ListenSocket) of
|
case gen_tcp:accept(ListenSocket) of
|
||||||
|
@ -104,12 +114,19 @@ init_ssl(Port, Module, Opts, SSLOpts) ->
|
||||||
({ciphers, _}) -> true;
|
({ciphers, _}) -> true;
|
||||||
(_) -> false
|
(_) -> false
|
||||||
end, Opts),
|
end, Opts),
|
||||||
{ok, ListenSocket} = ssl:listen(Port, [binary,
|
Res = ssl:listen(Port, [binary,
|
||||||
{packet, 0},
|
{packet, 0},
|
||||||
{active, false},
|
{active, false},
|
||||||
{nodelay, true} |
|
{nodelay, true} |
|
||||||
SockOpts ++ SSLOpts]),
|
SockOpts ++ SSLOpts]),
|
||||||
accept_ssl(ListenSocket, Module, Opts).
|
case Res of
|
||||||
|
{ok, ListenSocket} ->
|
||||||
|
accept_ssl(ListenSocket, Module, Opts);
|
||||||
|
{error, Reason} ->
|
||||||
|
?ERROR_MSG("Failed to open socket for ~p: ~p",
|
||||||
|
[{Port, Module, Opts}, Reason]),
|
||||||
|
error
|
||||||
|
end.
|
||||||
|
|
||||||
accept_ssl(ListenSocket, Module, Opts) ->
|
accept_ssl(ListenSocket, Module, Opts) ->
|
||||||
case ssl:accept(ListenSocket, 200) of
|
case ssl:accept(ListenSocket, 200) of
|
||||||
|
@ -136,7 +153,7 @@ accept_ssl(ListenSocket, Module, Opts) ->
|
||||||
start_listener(Port, Module, Opts) ->
|
start_listener(Port, Module, Opts) ->
|
||||||
ChildSpec = {Port,
|
ChildSpec = {Port,
|
||||||
{?MODULE, start, [Port, Module, Opts]},
|
{?MODULE, start, [Port, Module, Opts]},
|
||||||
permanent,
|
transient,
|
||||||
brutal_kill,
|
brutal_kill,
|
||||||
worker,
|
worker,
|
||||||
[?MODULE]},
|
[?MODULE]},
|
||||||
|
@ -146,3 +163,26 @@ stop_listener(Port) ->
|
||||||
supervisor:terminate_child(ejabberd_listeners, Port),
|
supervisor:terminate_child(ejabberd_listeners, Port),
|
||||||
supervisor:delete_child(ejabberd_listeners, Port).
|
supervisor:delete_child(ejabberd_listeners, Port).
|
||||||
|
|
||||||
|
add_listener(Port, Module, Opts) ->
|
||||||
|
Ports = case ejabberd_config:get_local_option(listen) of
|
||||||
|
undefined ->
|
||||||
|
[];
|
||||||
|
Ls ->
|
||||||
|
Ls
|
||||||
|
end,
|
||||||
|
Ports1 = lists:keydelete(Port, 1, Ports),
|
||||||
|
Ports2 = [{Port, Module, Opts} | Ports1],
|
||||||
|
ejabberd_config:add_local_option(listen, Ports2),
|
||||||
|
start_listener(Port, Module, Opts).
|
||||||
|
|
||||||
|
delete_listener(Port) ->
|
||||||
|
Ports = case ejabberd_config:get_local_option(listen) of
|
||||||
|
undefined ->
|
||||||
|
[];
|
||||||
|
Ls ->
|
||||||
|
Ls
|
||||||
|
end,
|
||||||
|
Ports1 = lists:keydelete(Port, 1, Ports),
|
||||||
|
ejabberd_config:add_local_option(listen, Ports1),
|
||||||
|
stop_listener(Port).
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,12 @@
|
||||||
{"name", Name},
|
{"name", Name},
|
||||||
{"value", Value}])).
|
{"value", Value}])).
|
||||||
-define(INPUTT(Type, Name, Value), ?INPUT(Type, Name, ?T(Value))).
|
-define(INPUTT(Type, Name, Value), ?INPUT(Type, Name, ?T(Value))).
|
||||||
|
-define(INPUTS(Type, Name, Value, Size),
|
||||||
|
?XA("input", [{"type", Type},
|
||||||
|
{"name", Name},
|
||||||
|
{"value", Value},
|
||||||
|
{"size", Size}])).
|
||||||
|
-define(INPUTST(Type, Name, Value, Size), ?INPUT(Type, Name, ?T(Value), Size)).
|
||||||
|
|
||||||
make_xhtml(Els, Lang) ->
|
make_xhtml(Els, Lang) ->
|
||||||
{200, [html],
|
{200, [html],
|
||||||
|
@ -1184,6 +1190,7 @@ get_node(Node, [], Query, Lang) ->
|
||||||
[?XE("ul",
|
[?XE("ul",
|
||||||
[?LI([?ACT("db/", "DB Management")]),
|
[?LI([?ACT("db/", "DB Management")]),
|
||||||
?LI([?ACT("backup/", "Backup Management")]),
|
?LI([?ACT("backup/", "Backup Management")]),
|
||||||
|
?LI([?ACT("ports/", "Listened Ports Management")]),
|
||||||
?LI([?ACT("stats/", "Statistics")])
|
?LI([?ACT("stats/", "Statistics")])
|
||||||
]),
|
]),
|
||||||
?XAE("form", [{"method", "post"}],
|
?XAE("form", [{"method", "post"}],
|
||||||
|
@ -1304,6 +1311,28 @@ get_node(Node, ["backup"], Query, Lang) ->
|
||||||
])
|
])
|
||||||
])])];
|
])])];
|
||||||
|
|
||||||
|
get_node(Node, ["ports"], Query, Lang) ->
|
||||||
|
Ports = rpc:call(Node, ejabberd_config, get_local_option, [listen]),
|
||||||
|
Res = case catch node_ports_parse_query(Node, Ports, Query) of
|
||||||
|
submitted ->
|
||||||
|
ok;
|
||||||
|
{'EXIT', _Reason} ->
|
||||||
|
error;
|
||||||
|
_ ->
|
||||||
|
nothing
|
||||||
|
end,
|
||||||
|
NewPorts = lists:sort(
|
||||||
|
rpc:call(Node, ejabberd_config, get_local_option, [listen])),
|
||||||
|
[?XC("h1", "Listened Ports at " ++ atom_to_list(Node))] ++
|
||||||
|
case Res of
|
||||||
|
ok -> [?C("submitted"), ?P];
|
||||||
|
error -> [?C("bad format"), ?P];
|
||||||
|
nothing -> []
|
||||||
|
end ++
|
||||||
|
[?XAE("form", [{"method", "post"}],
|
||||||
|
[node_ports_to_xhtml(NewPorts, Lang)])
|
||||||
|
];
|
||||||
|
|
||||||
get_node(Node, ["stats"], Query, Lang) ->
|
get_node(Node, ["stats"], Query, Lang) ->
|
||||||
UpTime = rpc:call(Node, erlang, statistics, [wall_clock]),
|
UpTime = rpc:call(Node, erlang, statistics, [wall_clock]),
|
||||||
UpTimeS = io_lib:format("~.3f", [element(1, UpTime)/1000]),
|
UpTimeS = io_lib:format("~.3f", [element(1, UpTime)/1000]),
|
||||||
|
@ -1361,9 +1390,9 @@ node_parse_query(Node, Query) ->
|
||||||
ok
|
ok
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
case lists:keysearch("delete", 1, Query) of
|
case lists:keysearch("stop", 1, Query) of
|
||||||
{value, _} ->
|
{value, _} ->
|
||||||
case rpc:call(Node, init, restart, []) of
|
case rpc:call(Node, init, stop, []) of
|
||||||
{badrpc, _Reason} ->
|
{badrpc, _Reason} ->
|
||||||
error;
|
error;
|
||||||
_ ->
|
_ ->
|
||||||
|
@ -1470,3 +1499,86 @@ node_backup_parse_query(Node, Query) ->
|
||||||
end, nothing, ["store", "restore", "fallback", "dump", "load"]).
|
end, nothing, ["store", "restore", "fallback", "dump", "load"]).
|
||||||
|
|
||||||
|
|
||||||
|
node_ports_to_xhtml(Ports, Lang) ->
|
||||||
|
?XAE("table", [],
|
||||||
|
[?XE("thead",
|
||||||
|
[?XE("tr",
|
||||||
|
[?XCT("td", "Port"),
|
||||||
|
?XCT("td", "Module"),
|
||||||
|
?XCT("td", "Options")
|
||||||
|
])]),
|
||||||
|
?XE("tbody",
|
||||||
|
lists:map(
|
||||||
|
fun({Port, Module, Opts} = E) ->
|
||||||
|
SPort = integer_to_list(Port),
|
||||||
|
SModule = atom_to_list(Module),
|
||||||
|
ID = term_to_id(E),
|
||||||
|
?XE("tr",
|
||||||
|
[?XC("td", SPort),
|
||||||
|
?XE("td", [?INPUT("text", "module" ++ SPort,
|
||||||
|
SModule)]),
|
||||||
|
?XE("td", [?INPUTS("text", "opts" ++ SPort,
|
||||||
|
term_to_string(Opts), "40")]),
|
||||||
|
?XE("td", [?INPUTT("submit", "add" ++ SPort,
|
||||||
|
"Update")]),
|
||||||
|
?XE("td", [?INPUTT("submit", "delete" ++ SPort,
|
||||||
|
"Delete")])
|
||||||
|
]
|
||||||
|
)
|
||||||
|
end, Ports) ++
|
||||||
|
[?XE("tr",
|
||||||
|
[?XE("td", [?INPUTS("text", "portnew", "", "6")]),
|
||||||
|
?XE("td", [?INPUT("text", "modulenew", "")]),
|
||||||
|
?XE("td", [?INPUTS("text", "optsnew", "", "40")]),
|
||||||
|
?XAE("td", [{"colspan", "2"}],
|
||||||
|
[?INPUTT("submit", "addnew", "Add New")])
|
||||||
|
]
|
||||||
|
)]
|
||||||
|
)]).
|
||||||
|
|
||||||
|
|
||||||
|
node_ports_parse_query(Node, Ports, Query) ->
|
||||||
|
lists:foreach(
|
||||||
|
fun({Port, _Module1, _Opts1}) ->
|
||||||
|
SPort = integer_to_list(Port),
|
||||||
|
case lists:keysearch("add" ++ SPort, 1, Query) of
|
||||||
|
{value, _} ->
|
||||||
|
{{value, {_, SModule}}, {value, {_, SOpts}}} =
|
||||||
|
{lists:keysearch("module" ++ SPort, 1, Query),
|
||||||
|
lists:keysearch("opts" ++ SPort, 1, Query)},
|
||||||
|
Module = list_to_atom(SModule),
|
||||||
|
{ok, Tokens, _} = erl_scan:string(SOpts ++ "."),
|
||||||
|
{ok, Opts} = erl_parse:parse_term(Tokens),
|
||||||
|
ejabberd_listener:delete_listener(Port),
|
||||||
|
ejabberd_listener:add_listener(Port, Module, Opts),
|
||||||
|
throw(submitted);
|
||||||
|
_ ->
|
||||||
|
case lists:keysearch("delete" ++ SPort, 1, Query) of
|
||||||
|
{value, _} ->
|
||||||
|
ejabberd_listener:delete_listener(Port),
|
||||||
|
throw(submitted);
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end, Ports),
|
||||||
|
case lists:keysearch("addnew", 1, Query) of
|
||||||
|
{value, _} ->
|
||||||
|
{{value, {_, SPort}},
|
||||||
|
{value, {_, SModule}},
|
||||||
|
{value, {_, SOpts}}} =
|
||||||
|
{lists:keysearch("portnew", 1, Query),
|
||||||
|
lists:keysearch("modulenew", 1, Query),
|
||||||
|
lists:keysearch("optsnew", 1, Query)},
|
||||||
|
Port = list_to_integer(SPort),
|
||||||
|
Module = list_to_atom(SModule),
|
||||||
|
{ok, Tokens, _} = erl_scan:string(SOpts ++ "."),
|
||||||
|
{ok, Opts} = erl_parse:parse_term(Tokens),
|
||||||
|
ejabberd_listener:add_listener(Port, Module, Opts),
|
||||||
|
throw(submitted);
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue