mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-20 16:15:59 +01:00
* src/web/ejabberd_web_admin.erl: WebAdmin serves Guide and links
to related sections; the path to guide.html can be configured with option doc_path (EJAB-837) * src/web/ejabberd_web_admin.hrl: Likewise * src/mod_shared_roster.erl: Likewise * doc/guide.tex: Likewise * doc/guide.html: Likewise SVN Revision: 1777
This commit is contained in:
parent
a0d48c63a3
commit
9f80ec4fb6
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2009-01-07 Badlop <badlop@process-one.net>
|
||||||
|
|
||||||
|
* src/web/ejabberd_web_admin.erl: WebAdmin serves Guide and links
|
||||||
|
to related sections; the path to guide.html can be configured with
|
||||||
|
option doc_path (EJAB-837)
|
||||||
|
* src/web/ejabberd_web_admin.hrl: Likewise
|
||||||
|
* src/mod_shared_roster.erl: Likewise
|
||||||
|
* doc/guide.tex: Likewise
|
||||||
|
* doc/guide.html: Likewise
|
||||||
|
|
||||||
2009-01-06 Badlop <badlop@process-one.net>
|
2009-01-06 Badlop <badlop@process-one.net>
|
||||||
|
|
||||||
* src/msgs/ru.po: Fix typo (thanks to Dominges)
|
* src/msgs/ru.po: Fix typo (thanks to Dominges)
|
||||||
|
@ -3072,7 +3072,17 @@ web browser to <CODE>https://192.168.1.1:5280/admin/</CODE>:
|
|||||||
tls, {certfile, "/usr/local/etc/server.pem"}]},
|
tls, {certfile, "/usr/local/etc/server.pem"}]},
|
||||||
...
|
...
|
||||||
]}.
|
]}.
|
||||||
</PRE></LI></UL><P> <A NAME="adhoccommands"></A> </P><!--TOC section Ad-hoc Commands-->
|
</PRE></LI></UL><P>Certain pages in the ejabberd Web Admin contain a link to a related
|
||||||
|
section in the ejabberd Installation and Operation Guide.
|
||||||
|
In order to view such links, a copy in HTML format of the Guide must
|
||||||
|
be installed in the system.
|
||||||
|
The file is searched by default in
|
||||||
|
<TT>"/share/doc/ejabberd/guide.html"</TT>.
|
||||||
|
The directory of the documentation can be specified in
|
||||||
|
<TT>ejabberd.cfg</TT> with the option <TT>doc_path</TT>.
|
||||||
|
For example:
|
||||||
|
</P><PRE CLASS="verbatim">{doc_path, "/usr/local/share/doc/ejabberd/"}.
|
||||||
|
</PRE><P> <A NAME="adhoccommands"></A> </P><!--TOC section Ad-hoc Commands-->
|
||||||
<H2 CLASS="section"><!--SEC ANCHOR --><A NAME="htoc65">4.3</A>  <A HREF="#adhoccommands">Ad-hoc Commands</A></H2><!--SEC END --><P> <A NAME="adhoccommands"></A> </P><P>If you enable <TT>mod_configure</TT> and <TT>mod_adhoc</TT>,
|
<H2 CLASS="section"><!--SEC ANCHOR --><A NAME="htoc65">4.3</A>  <A HREF="#adhoccommands">Ad-hoc Commands</A></H2><!--SEC END --><P> <A NAME="adhoccommands"></A> </P><P>If you enable <TT>mod_configure</TT> and <TT>mod_adhoc</TT>,
|
||||||
you can perform several administrative tasks in <TT>ejabberd</TT>
|
you can perform several administrative tasks in <TT>ejabberd</TT>
|
||||||
with a Jabber client.
|
with a Jabber client.
|
||||||
|
@ -3943,6 +3943,18 @@ Examples:
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
Certain pages in the ejabberd Web Admin contain a link to a related
|
||||||
|
section in the ejabberd Installation and Operation Guide.
|
||||||
|
In order to view such links, a copy in HTML format of the Guide must
|
||||||
|
be installed in the system.
|
||||||
|
The file is searched by default in
|
||||||
|
\term{"/share/doc/ejabberd/guide.html"}.
|
||||||
|
The directory of the documentation can be specified in
|
||||||
|
\term{ejabberd.cfg} with the option \term{doc\_path}.
|
||||||
|
For example:
|
||||||
|
\begin{verbatim}
|
||||||
|
{doc_path, "/usr/local/share/doc/ejabberd/"}.
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
\makesection{adhoccommands}{Ad-hoc Commands}
|
\makesection{adhoccommands}{Ad-hoc Commands}
|
||||||
|
|
||||||
|
@ -723,7 +723,7 @@ list_shared_roster_groups(Host, Query, Lang) ->
|
|||||||
]
|
]
|
||||||
)]
|
)]
|
||||||
)]),
|
)]),
|
||||||
[?XC("h1", ?T("Shared Roster Groups"))] ++
|
?H1GL(?T("Shared Roster Groups"), "modsharedroster", "mod_shared_roster") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -822,7 +822,7 @@ shared_roster_group(Host, Group, Query, Lang) ->
|
|||||||
]
|
]
|
||||||
)]
|
)]
|
||||||
)]),
|
)]),
|
||||||
[?XC("h1", ?T("Shared Roster Groups"))] ++
|
?H1GL(?T("Shared Roster Groups"), "modsharedroster", "mod_shared_roster") ++
|
||||||
[?XC("h2", ?T("Group ") ++ Group)] ++
|
[?XC("h2", ?T("Group ") ++ Group)] ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
|
@ -40,6 +40,30 @@
|
|||||||
-include("ejabberd_web_admin.hrl").
|
-include("ejabberd_web_admin.hrl").
|
||||||
|
|
||||||
|
|
||||||
|
process(["doc", LocalFile], _Request) ->
|
||||||
|
DocPath = case ejabberd_config:get_global_option(doc_path) of
|
||||||
|
P when is_list(P) -> P;
|
||||||
|
_ -> "/share/doc/ejabberd/"
|
||||||
|
end,
|
||||||
|
%% Code based in mod_http_fileserver
|
||||||
|
FileName = filename:join(DocPath, LocalFile),
|
||||||
|
case file:read_file(FileName) of
|
||||||
|
{ok, FileContents} ->
|
||||||
|
?DEBUG("Delivering content.", []),
|
||||||
|
{200,
|
||||||
|
[{"Server", "ejabberd"}],
|
||||||
|
FileContents};
|
||||||
|
{error, Error} ->
|
||||||
|
?DEBUG("Delivering error: ~p", [Error]),
|
||||||
|
Help = " " ++ FileName ++ " - Try to specify the path to ejabberd guide.html "
|
||||||
|
"with the option doc_path. Check the ejabberd Guide for more information",
|
||||||
|
case Error of
|
||||||
|
eacces -> {403, [], "Forbidden"++Help};
|
||||||
|
enoent -> {404, [], "Not found"++Help};
|
||||||
|
_Else -> {404, [], atom_to_list(Error)++Help}
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
process(["server", SHost | RPath], #request{auth = Auth} = Request) ->
|
process(["server", SHost | RPath], #request{auth = Auth} = Request) ->
|
||||||
Host = jlib:nameprep(SHost),
|
Host = jlib:nameprep(SHost),
|
||||||
case lists:member(Host, ?MYHOSTS) of
|
case lists:member(Host, ?MYHOSTS) of
|
||||||
@ -509,8 +533,13 @@ h3 {
|
|||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
*.alignright {
|
div.guidelink {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
*.alignright {
|
||||||
|
font-size: 10pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
".
|
".
|
||||||
@ -556,8 +585,8 @@ process_admin(global,
|
|||||||
lang = Lang}) ->
|
lang = Lang}) ->
|
||||||
Base = get_base_path(global, cluster),
|
Base = get_base_path(global, cluster),
|
||||||
MenuItems2 = make_menu_items(global, cluster, Base, Lang),
|
MenuItems2 = make_menu_items(global, cluster, Base, Lang),
|
||||||
make_xhtml([?XCT("h1", "Administration"),
|
make_xhtml(?H1GL(?T("Administration"), "toc", "Contents") ++
|
||||||
?XE("ul",
|
[?XE("ul",
|
||||||
[?LI([?ACT("/admin/acls/", "Access Control Lists"), ?C(" "),
|
[?LI([?ACT("/admin/acls/", "Access Control Lists"), ?C(" "),
|
||||||
?ACT("/admin/acls-raw/", "(Raw)")]),
|
?ACT("/admin/acls-raw/", "(Raw)")]),
|
||||||
?LI([?ACT("/admin/access/", "Access Rules"), ?C(" "),
|
?LI([?ACT("/admin/access/", "Access Rules"), ?C(" "),
|
||||||
@ -631,7 +660,7 @@ process_admin(Host,
|
|||||||
"~p.", [lists:keysort(
|
"~p.", [lists:keysort(
|
||||||
2, ets:select(acl, [{{acl, {'$1', Host}, '$2'},
|
2, ets:select(acl, [{{acl, {'$1', Host}, '$2'},
|
||||||
[], [{{acl, '$1', '$2'}}]}]))])),
|
[], [{{acl, '$1', '$2'}}]}]))])),
|
||||||
make_xhtml([?XCT("h1", "Access Control Lists")] ++
|
make_xhtml(?H1GL(?T("Access Control Lists"), "ACLDefinition", "ACL Definition") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -674,7 +703,7 @@ process_admin(Host,
|
|||||||
ACLs = lists:keysort(
|
ACLs = lists:keysort(
|
||||||
2, ets:select(acl, [{{acl, {'$1', Host}, '$2'},
|
2, ets:select(acl, [{{acl, {'$1', Host}, '$2'},
|
||||||
[], [{{acl, '$1', '$2'}}]}])),
|
[], [{{acl, '$1', '$2'}}]}])),
|
||||||
make_xhtml([?XCT("h1", "Access Control Lists")] ++
|
make_xhtml(?H1GL(?T("Access Control Lists"), "ACLDefinition", "ACL Definition") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -742,7 +771,7 @@ process_admin(Host,
|
|||||||
[{{config, {access, '$1', Host}, '$2'},
|
[{{config, {access, '$1', Host}, '$2'},
|
||||||
[],
|
[],
|
||||||
[{{access, '$1', '$2'}}]}])])),
|
[{{access, '$1', '$2'}}]}])])),
|
||||||
make_xhtml([?XCT("h1", "Access Rules")] ++
|
make_xhtml(?H1GL(?T("Access Rules"), "AccessRights", "Access Rights") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -780,7 +809,7 @@ process_admin(Host,
|
|||||||
[{{config, {access, '$1', Host}, '$2'},
|
[{{config, {access, '$1', Host}, '$2'},
|
||||||
[],
|
[],
|
||||||
[{{access, '$1', '$2'}}]}]),
|
[{{access, '$1', '$2'}}]}]),
|
||||||
make_xhtml([?XCT("h1", "Access Rules")] ++
|
make_xhtml(?H1GL(?T("Access Rules"), "AccessRights", "Access Rights") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -837,7 +866,7 @@ process_admin(global,
|
|||||||
#request{path = ["vhosts"],
|
#request{path = ["vhosts"],
|
||||||
lang = Lang}) ->
|
lang = Lang}) ->
|
||||||
Res = list_vhosts(Lang),
|
Res = list_vhosts(Lang),
|
||||||
make_xhtml([?XCT("h1", "ejabberd virtual hosts")] ++ Res, global, Lang);
|
make_xhtml(?H1GL(?T("ejabberd virtual hosts"), "virtualhost", "Virtual Hosting") ++ Res, global, Lang);
|
||||||
|
|
||||||
process_admin(Host,
|
process_admin(Host,
|
||||||
#request{path = ["users"],
|
#request{path = ["users"],
|
||||||
@ -1786,7 +1815,8 @@ get_node(global, Node, ["ports"], Query, Lang) ->
|
|||||||
end,
|
end,
|
||||||
NewPorts = lists:sort(
|
NewPorts = lists:sort(
|
||||||
rpc:call(Node, ejabberd_config, get_local_option, [listen])),
|
rpc:call(Node, ejabberd_config, get_local_option, [listen])),
|
||||||
[?XC("h1", ?T("Listened Ports at ") ++ atom_to_list(Node))] ++
|
H1String = ?T("Listened Ports at ") ++ atom_to_list(Node),
|
||||||
|
?H1GL(H1String, "listened", "Listening Ports") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
@ -1809,7 +1839,8 @@ get_node(Host, Node, ["modules"], Query, Lang) when is_list(Host) ->
|
|||||||
end,
|
end,
|
||||||
NewModules = lists:sort(
|
NewModules = lists:sort(
|
||||||
rpc:call(Node, gen_mod, loaded_modules_with_opts, [Host])),
|
rpc:call(Node, gen_mod, loaded_modules_with_opts, [Host])),
|
||||||
[?XC("h1", ?T("Modules at ") ++ atom_to_list(Node))] ++
|
H1String = ?T("Modules at ") ++ atom_to_list(Node),
|
||||||
|
?H1GL(H1String, "modoverview", "Modules Overview") ++
|
||||||
case Res of
|
case Res of
|
||||||
ok -> [?CT("Submitted"), ?P];
|
ok -> [?CT("Submitted"), ?P];
|
||||||
error -> [?CT("Bad format"), ?P];
|
error -> [?CT("Bad format"), ?P];
|
||||||
|
@ -50,3 +50,17 @@
|
|||||||
{"size", Size}])).
|
{"size", Size}])).
|
||||||
-define(INPUTST(Type, Name, Value, Size), ?INPUT(Type, Name, ?T(Value), Size)).
|
-define(INPUTST(Type, Name, Value, Size), ?INPUT(Type, Name, ?T(Value), Size)).
|
||||||
-define(ACLINPUT(Text), ?XE("td", [?INPUT("text", "value" ++ ID, Text)])).
|
-define(ACLINPUT(Text), ?XE("td", [?INPUT("text", "value" ++ ID, Text)])).
|
||||||
|
|
||||||
|
%% Guide Link
|
||||||
|
-define(GL(Ref, Title),
|
||||||
|
?XAE("div",
|
||||||
|
[{"class", "guidelink"}],
|
||||||
|
[?XAE("a",
|
||||||
|
[{"href", "/admin/doc/guide.html#"++ Ref},
|
||||||
|
{"target", "_blank"}],
|
||||||
|
[?C("[Guide: " ++ Title ++ "]")])
|
||||||
|
])).
|
||||||
|
|
||||||
|
|
||||||
|
%% h1 with a Guide Link
|
||||||
|
-define(H1GL(Name, Ref, Title), [?XC("h1", Name), ?GL(Ref, Title)]).
|
||||||
|
Loading…
Reference in New Issue
Block a user