1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
%% The contents of this file are subject to the Mozilla Public License
%% Version 1.1 (the "License"); you may not use this file except in
%% compliance with the License. You may obtain a copy of the License at
%% http://www.mozilla.org/MPL/
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
%% License for the specific language governing rights and limitations
%% under the License.
%%
%% The Original Code is RabbitMQ Management Plugin.
%%
%% The Initial Developer of the Original Code is GoPivotal, Inc.
%% Copyright (c) 2007-2018 Pivotal Software, Inc. All rights reserved.
%%
-module(rabbit_mgmt_wm_overview).
-export([init/2]).
-export([to_json/2, content_types_provided/2, is_authorized/2]).
-export([variances/2]).
-import(rabbit_misc, [pget/2, pget/3]).
-include_lib("rabbitmq_management_agent/include/rabbit_mgmt_records.hrl").
-include_lib("rabbit_common/include/rabbit.hrl").
%%--------------------------------------------------------------------
init(Req, _State) ->
{cowboy_rest, rabbit_mgmt_cors:set_headers(Req, ?MODULE), #context{}}.
variances(Req, Context) ->
{[<<"accept-encoding">>, <<"origin">>], Req, Context}.
content_types_provided(ReqData, Context) ->
{rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
to_json(ReqData, Context = #context{user = User = #user{tags = Tags}}) ->
RatesMode = rabbit_mgmt_agent_config:get_env(rates_mode),
%% NB: this duplicates what's in /nodes but we want a global idea
%% of this. And /nodes is not accessible to non-monitor users.
ExchangeTypes = rabbit_mgmt_external_stats:list_registry_plugins(exchange),
Overview0 = [{management_version, version(rabbitmq_management)},
{rates_mode, RatesMode},
{exchange_types, ExchangeTypes},
{rabbitmq_version, version(rabbit)},
{cluster_name, rabbit_nodes:cluster_name()},
{erlang_version, erlang_version()},
{erlang_full_version, erlang_full_version()}],
try
Range = rabbit_mgmt_util:range(ReqData),
Overview =
case rabbit_mgmt_util:is_monitor(Tags) of
true ->
Overview0 ++
[{K, maybe_map(V)} ||
{K,V} <- rabbit_mgmt_db:get_overview(Range)] ++
[{node, node()},
{listeners, listeners()},
{contexts, web_contexts(ReqData)}];
_ ->
Overview0 ++
[{K, maybe_map(V)} ||
{K, V} <- rabbit_mgmt_db:get_overview(User, Range)]
end,
rabbit_mgmt_util:reply(Overview, ReqData, Context)
catch
{error, invalid_range_parameters, Reason} ->
rabbit_mgmt_util:bad_request(iolist_to_binary(Reason), ReqData, Context)
end.
is_authorized(ReqData, Context) ->
rabbit_mgmt_util:is_authorized(ReqData, Context).
%%--------------------------------------------------------------------
version(App) ->
{ok, V} = application:get_key(App, vsn),
list_to_binary(V).
listeners() ->
rabbit_mgmt_util:sort_list(
[rabbit_mgmt_format:listener(L)
|| L <- rabbit_networking:active_listeners()],
["protocol", "port", "node"] ).
maybe_map(L) when is_list(L) -> maps:from_list(L);
maybe_map(V) -> V.
%%--------------------------------------------------------------------
web_contexts(ReqData) ->
rabbit_mgmt_util:sort_list(
lists:append(
[fmt_contexts(N) || N <- rabbit_mgmt_wm_nodes:all_nodes(ReqData)]),
["description", "port", "node"]).
fmt_contexts(Node) ->
[fmt_context(Node, C) || C <- pget(contexts, Node, [])].
fmt_context(Node, C) ->
rabbit_mgmt_format:web_context([{node, pget(name, Node)} | C]).
erlang_version() -> list_to_binary(rabbit_misc:otp_release()).
erlang_full_version() ->
list_to_binary(rabbit_misc:otp_system_version()).
|