2011-07-06 19:45:46 +08:00
|
|
|
///////////////////////
|
|
|
|
// //
|
|
|
|
// Genuine constants //
|
|
|
|
// //
|
|
|
|
///////////////////////
|
|
|
|
|
|
|
|
// Just used below
|
2011-07-06 19:32:00 +08:00
|
|
|
function map(list) {
|
|
|
|
var res = {};
|
|
|
|
for (i in list) {
|
|
|
|
res[list[i]] = '';
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// Extension arguments that we know about and present specially in the UI.
|
2012-01-25 20:00:24 +08:00
|
|
|
var KNOWN_ARGS = {'alternate-exchange': {'short': 'AE', 'type': 'string'},
|
|
|
|
'x-message-ttl': {'short': 'TTL', 'type': 'int'},
|
|
|
|
'x-expires': {'short': 'Exp', 'type': 'int'},
|
2013-04-10 23:16:45 +08:00
|
|
|
'x-max-length': {'short': 'Lim', 'type': 'int'},
|
2014-08-13 00:23:23 +08:00
|
|
|
'x-max-length-bytes': {'short': 'Lim B', 'type': 'int'},
|
2012-01-25 20:00:24 +08:00
|
|
|
'x-dead-letter-exchange': {'short': 'DLX', 'type': 'string'},
|
2015-02-13 22:34:03 +08:00
|
|
|
'x-dead-letter-routing-key': {'short': 'DLK', 'type': 'string'},
|
|
|
|
'x-max-priority': {'short': 'Pri', 'type': 'int'}};
|
2011-07-06 19:32:00 +08:00
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// Things that are like arguments that we format the same way in listings.
|
2017-08-06 20:02:16 +08:00
|
|
|
var IMPLICIT_ARGS = {'durable': {'short': 'D', 'type': 'boolean'},
|
|
|
|
'auto-delete': {'short': 'AD', 'type': 'boolean'},
|
|
|
|
'exclusive': {'short': 'Excl', 'type': 'boolean'},
|
|
|
|
'internal': {'short': 'I', 'type': 'boolean'}};
|
2011-07-06 19:32:00 +08:00
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// Both the above
|
2011-07-06 19:32:00 +08:00
|
|
|
var ALL_ARGS = {};
|
|
|
|
for (var k in IMPLICIT_ARGS) ALL_ARGS[k] = IMPLICIT_ARGS[k];
|
2014-08-13 01:22:32 +08:00
|
|
|
for (var k in KNOWN_ARGS) ALL_ARGS[k] = KNOWN_ARGS[k];
|
2011-07-06 19:32:00 +08:00
|
|
|
|
2013-09-19 20:29:25 +08:00
|
|
|
var NAVIGATION = {'Overview': ['#/', "management"],
|
|
|
|
'Connections': ['#/connections', "management"],
|
|
|
|
'Channels': ['#/channels', "management"],
|
|
|
|
'Exchanges': ['#/exchanges', "management"],
|
|
|
|
'Queues': ['#/queues', "management"],
|
|
|
|
'Admin':
|
|
|
|
[{'Users': ['#/users', "administrator"],
|
|
|
|
'Virtual Hosts': ['#/vhosts', "administrator"],
|
2016-03-22 01:44:29 +08:00
|
|
|
'Policies': ['#/policies', "management"]},
|
|
|
|
"management"]
|
2012-06-13 00:36:24 +08:00
|
|
|
};
|
2011-07-06 19:45:46 +08:00
|
|
|
|
2013-01-30 01:26:20 +08:00
|
|
|
var CHART_PERIODS = {'60|5': 'Last minute',
|
2013-02-22 19:48:31 +08:00
|
|
|
'600|5': 'Last ten minutes',
|
2013-01-30 01:26:20 +08:00
|
|
|
'3600|60': 'Last hour',
|
2013-02-22 19:48:31 +08:00
|
|
|
'28800|600': 'Last eight hours',
|
|
|
|
'86400|1800': 'Last day'};
|
2013-01-30 01:26:20 +08:00
|
|
|
|
2014-09-19 22:44:43 +08:00
|
|
|
var COLUMNS =
|
2014-10-07 22:33:40 +08:00
|
|
|
{'exchanges' :
|
|
|
|
{'Overview': [['type', 'Type', true],
|
|
|
|
['features', 'Features (with policy)', true],
|
|
|
|
['features_no_policy', 'Features (no policy)', false],
|
|
|
|
['policy', 'Policy', false]],
|
|
|
|
'Message rates': [['rate-in', 'rate in', true],
|
|
|
|
['rate-out', 'rate out', true]]},
|
|
|
|
'queues' :
|
|
|
|
{'Overview': [['features', 'Features (with policy)', true],
|
|
|
|
['features_no_policy', 'Features (no policy)', false],
|
|
|
|
['policy', 'Policy', false],
|
|
|
|
['consumers', 'Consumer count', false],
|
|
|
|
['consumer_utilisation', 'Consumer utilisation', false],
|
|
|
|
['state', 'State', true]],
|
2014-09-19 22:44:43 +08:00
|
|
|
'Messages': [['msgs-ready', 'Ready', true],
|
|
|
|
['msgs-unacked', 'Unacknowledged', true],
|
|
|
|
['msgs-ram', 'In memory', false],
|
|
|
|
['msgs-persistent', 'Persistent', false],
|
|
|
|
['msgs-total', 'Total', true]],
|
|
|
|
'Message bytes': [['msg-bytes-ready', 'Ready', false],
|
|
|
|
['msg-bytes-unacked', 'Unacknowledged', false],
|
|
|
|
['msg-bytes-ram', 'In memory', false],
|
|
|
|
['msg-bytes-persistent', 'Persistent', false],
|
|
|
|
['msg-bytes-total', 'Total', false]],
|
|
|
|
'Message rates': [['rate-incoming', 'incoming', true],
|
|
|
|
['rate-deliver', 'deliver / get', true],
|
|
|
|
['rate-redeliver', 'redelivered', false],
|
2014-09-20 01:15:29 +08:00
|
|
|
['rate-ack', 'ack', true]]},
|
|
|
|
'channels' :
|
|
|
|
{'Overview': [['user', 'User name', true],
|
|
|
|
['mode', 'Mode', true],
|
|
|
|
['state', 'State', true]],
|
|
|
|
'Details': [['msgs-unconfirmed', 'Unconfirmed', true],
|
|
|
|
['prefetch', 'Prefetch', true],
|
|
|
|
['msgs-unacked', 'Unacked', true]],
|
|
|
|
'Transactions': [['msgs-uncommitted', 'Msgs uncommitted', false],
|
|
|
|
['acks-uncommitted', 'Acks uncommitted', false]],
|
|
|
|
'Message rates': [['rate-publish', 'publish', true],
|
|
|
|
['rate-confirm', 'confirm', true],
|
|
|
|
['rate-return', 'return (mandatory)', false],
|
|
|
|
['rate-deliver', 'deliver / get', true],
|
|
|
|
['rate-redeliver', 'redelivered', false],
|
2014-09-22 21:13:11 +08:00
|
|
|
['rate-ack', 'ack', true]]},
|
|
|
|
'connections':
|
|
|
|
{'Overview': [['user', 'User name', true],
|
|
|
|
['state', 'State', true]],
|
2014-10-21 18:04:30 +08:00
|
|
|
'Details': [['ssl', 'SSL / TLS', true],
|
|
|
|
['ssl_info', 'SSL Details', false],
|
2014-09-22 21:13:11 +08:00
|
|
|
['protocol', 'Protocol', true],
|
|
|
|
['channels', 'Channels', true],
|
|
|
|
['channel_max', 'Channel max', false],
|
|
|
|
['frame_max', 'Frame max', false],
|
|
|
|
['auth_mechanism', 'Auth mechanism', false],
|
|
|
|
['client', 'Client', false]],
|
|
|
|
'Network': [['from_client', 'From client', true],
|
|
|
|
['to_client', 'To client', true],
|
|
|
|
['heartbeat', 'Heartbeat', false],
|
2014-09-22 21:29:01 +08:00
|
|
|
['connected_at', 'Connected at', false]]},
|
|
|
|
|
|
|
|
'vhosts':
|
|
|
|
{'Messages': [['msgs-ready', 'Ready', true],
|
|
|
|
['msgs-unacked', 'Unacknowledged', true],
|
|
|
|
['msgs-total', 'Total', true]],
|
|
|
|
'Network': [['from_client', 'From client', true],
|
|
|
|
['to_client', 'To client', true]],
|
|
|
|
'Message rates': [['rate-publish', 'publish', true],
|
2014-09-27 01:09:25 +08:00
|
|
|
['rate-deliver', 'deliver / get', true]]},
|
|
|
|
'overview':
|
|
|
|
{'Statistics': [['file_descriptors', 'File descriptors', true],
|
|
|
|
['socket_descriptors', 'Socket descriptors', true],
|
|
|
|
['erlang_processes', 'Erlang processes', true],
|
|
|
|
['memory', 'Memory', true],
|
|
|
|
['disk_space', 'Disk space', true]],
|
|
|
|
'General': [['uptime', 'Uptime', false],
|
2016-04-15 20:54:52 +08:00
|
|
|
['rates_mode', 'Rates mode', true],
|
2014-09-27 01:09:25 +08:00
|
|
|
['info', 'Info', true]]}};
|
2014-09-19 22:19:43 +08:00
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
// //
|
|
|
|
// Mostly constant, typically get set once at startup (or rarely anyway) //
|
|
|
|
// //
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// All these are to do with hiding UI elements if
|
2014-04-12 00:41:02 +08:00
|
|
|
var rates_mode; // ...there are no fine stats
|
2012-12-04 00:49:03 +08:00
|
|
|
var user_administrator; // ...user is not an admin
|
2016-03-22 21:53:27 +08:00
|
|
|
var is_user_policymaker; // ...user is not a policymaker
|
2012-12-04 00:49:03 +08:00
|
|
|
var user_monitor; // ...user cannot monitor
|
|
|
|
var nodes_interesting; // ...we are not in a cluster
|
|
|
|
var vhosts_interesting; // ...there is only one vhost
|
|
|
|
var rabbit_versions_interesting; // ...all cluster nodes run the same version
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// Extensions write to this, the dispatcher maker reads it
|
2011-07-06 19:32:00 +08:00
|
|
|
var dispatcher_modules = [];
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// We need to know when all extension script files have loaded
|
2011-07-06 19:32:00 +08:00
|
|
|
var extension_count;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// The dispatcher needs access to the Sammy app
|
2011-07-06 19:32:00 +08:00
|
|
|
var app;
|
|
|
|
|
2012-10-23 23:35:17 +08:00
|
|
|
// Used for the new exchange form, and to display broken exchange types
|
2012-01-25 21:13:04 +08:00
|
|
|
var exchange_types;
|
|
|
|
|
2014-01-31 21:40:48 +08:00
|
|
|
// Used for access control
|
2013-09-19 20:29:25 +08:00
|
|
|
var user_tags;
|
2014-01-31 21:40:48 +08:00
|
|
|
var user;
|
2013-09-19 20:29:25 +08:00
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// Set up the above vars
|
2014-01-31 21:40:48 +08:00
|
|
|
function setup_global_vars() {
|
2012-01-25 21:13:04 +08:00
|
|
|
var overview = JSON.parse(sync_get('/overview'));
|
2014-04-12 00:41:02 +08:00
|
|
|
rates_mode = overview.rates_mode;
|
2014-02-20 21:35:23 +08:00
|
|
|
user_tags = expand_user_tags(user.tags.split(","));
|
|
|
|
user_administrator = jQuery.inArray("administrator", user_tags) != -1;
|
2016-03-22 21:53:27 +08:00
|
|
|
is_user_policymaker = jQuery.inArray("policymaker", user_tags) != -1;
|
2014-02-20 21:35:23 +08:00
|
|
|
user_monitor = jQuery.inArray("monitoring", user_tags) != -1;
|
2012-10-23 23:35:17 +08:00
|
|
|
replace_content('login-details',
|
2015-01-06 20:34:57 +08:00
|
|
|
'<p>User: <b>' + fmt_escape_html(user.name) + '</b></p>' +
|
|
|
|
'<p>Cluster: <b>' + fmt_escape_html(overview.cluster_name) + '</b> ' +
|
2014-02-20 21:35:23 +08:00
|
|
|
(user_administrator ?
|
|
|
|
'(<a href="#/cluster-name">change</a>)' : '') + '</p>' +
|
2015-01-06 20:34:57 +08:00
|
|
|
'<p>RabbitMQ ' + fmt_escape_html(overview.rabbitmq_version) +
|
2013-03-01 23:12:01 +08:00
|
|
|
', <acronym class="normal" title="' +
|
2015-01-06 20:34:57 +08:00
|
|
|
fmt_escape_html(overview.erlang_full_version) + '">Erlang ' +
|
|
|
|
fmt_escape_html(overview.erlang_version) + '</acronym></p>');
|
2012-12-04 00:49:03 +08:00
|
|
|
nodes_interesting = false;
|
|
|
|
rabbit_versions_interesting = false;
|
|
|
|
if (user_monitor) {
|
|
|
|
var nodes = JSON.parse(sync_get('/nodes'));
|
|
|
|
if (nodes.length > 1) {
|
|
|
|
nodes_interesting = true;
|
|
|
|
var v = '';
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
|
|
var v1 = fmt_rabbit_version(nodes[i].applications);
|
|
|
|
if (v1 != 'unknown') {
|
|
|
|
if (v != '' && v != v1) rabbit_versions_interesting = true;
|
|
|
|
v = v1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-07-06 19:32:00 +08:00
|
|
|
vhosts_interesting = JSON.parse(sync_get('/vhosts')).length > 1;
|
|
|
|
current_vhost = get_pref('vhost');
|
2012-03-21 19:42:19 +08:00
|
|
|
exchange_types = overview.exchange_types;
|
2011-07-06 19:32:00 +08:00
|
|
|
}
|
|
|
|
|
2013-09-19 20:29:25 +08:00
|
|
|
function expand_user_tags(tags) {
|
|
|
|
var new_tags = [];
|
|
|
|
for (var i = 0; i < tags.length; i++) {
|
|
|
|
var tag = tags[i];
|
|
|
|
new_tags.push(tag);
|
|
|
|
switch (tag) { // Note deliberate fall-through
|
|
|
|
case "administrator": new_tags.push("monitoring");
|
|
|
|
new_tags.push("policymaker");
|
|
|
|
case "monitoring": new_tags.push("management");
|
|
|
|
break;
|
|
|
|
case "policymaker": new_tags.push("management");
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new_tags;
|
|
|
|
}
|
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
////////////////////////////////////////////////////
|
|
|
|
// //
|
|
|
|
// Change frequently (typically every "new page") //
|
|
|
|
// //
|
|
|
|
////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// Which top level template we're showing
|
2011-07-06 19:32:00 +08:00
|
|
|
var current_template;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// Which JSON requests do we need to populate it
|
2011-07-06 19:32:00 +08:00
|
|
|
var current_reqs;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
2014-11-05 20:03:54 +08:00
|
|
|
// And which of those have yet to return (so we can cancel them when
|
|
|
|
// changing current_template).
|
|
|
|
var outstanding_reqs = [];
|
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// Which tab is highlighted
|
2011-07-06 19:32:00 +08:00
|
|
|
var current_highlight;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// Which vhost are we looking at
|
2011-07-06 19:32:00 +08:00
|
|
|
var current_vhost = '';
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// What is our current sort order
|
2011-07-06 19:32:00 +08:00
|
|
|
var current_sort;
|
|
|
|
var current_sort_reverse = false;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
2013-03-06 02:04:15 +08:00
|
|
|
var current_filter = '';
|
2013-11-13 00:41:31 +08:00
|
|
|
var current_filter_regex_on = false;
|
2015-11-13 05:25:01 +08:00
|
|
|
|
2013-11-13 00:41:31 +08:00
|
|
|
var current_filter_regex;
|
2013-04-25 23:13:44 +08:00
|
|
|
var current_truncate;
|
2013-03-06 02:04:15 +08:00
|
|
|
|
2011-07-06 19:45:46 +08:00
|
|
|
// The timer object for auto-updates, and how often it goes off
|
2011-07-06 19:32:00 +08:00
|
|
|
var timer;
|
|
|
|
var timer_interval;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// When did we last connect successfully (for the "could not connect" error)
|
2011-07-06 19:32:00 +08:00
|
|
|
var last_successful_connect;
|
2011-07-06 19:45:46 +08:00
|
|
|
|
|
|
|
// Every 200 updates without user interaction we do a full refresh, to
|
|
|
|
// work around memory leaks in browser DOM implementations.
|
|
|
|
// TODO: maybe we don't need this any more?
|
2011-07-06 19:32:00 +08:00
|
|
|
var update_counter = 0;
|
|
|
|
|
2013-02-15 21:10:04 +08:00
|
|
|
// Holds chart data in between writing the div in an ejs and rendering
|
|
|
|
// the chart.
|
2012-11-16 21:27:31 +08:00
|
|
|
var chart_data = {};
|
2015-10-22 15:55:36 +08:00
|
|
|
|
2015-11-03 16:23:05 +08:00
|
|
|
// whenever a UI requests a page that doesn't exist
|
|
|
|
// because things were deleted between refreshes
|
|
|
|
var last_page_out_of_range_error = 0;
|