2010-07-12 22:04:42 +08:00
|
|
|
$(document).ready(function() {
|
2012-10-23 23:35:17 +08:00
|
|
|
replace_content('outer', format('login', {}));
|
2013-10-10 00:55:23 +08:00
|
|
|
start_app_login();
|
2011-05-06 01:30:45 +08:00
|
|
|
});
|
|
|
|
|
2011-05-06 21:39:09 +08:00
|
|
|
function dispatcher_add(fun) {
|
|
|
|
dispatcher_modules.push(fun);
|
2011-05-06 23:01:20 +08:00
|
|
|
if (dispatcher_modules.length == extension_count) {
|
2011-05-06 21:39:09 +08:00
|
|
|
start_app();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function dispatcher() {
|
|
|
|
for (var i in dispatcher_modules) {
|
|
|
|
dispatcher_modules[i](this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-23 00:45:53 +08:00
|
|
|
function set_auth_pref(userinfo) {
|
2017-03-22 20:44:21 +08:00
|
|
|
// clear a local storage value used by earlier versions
|
|
|
|
clear_local_pref('auth');
|
|
|
|
|
2013-10-31 19:22:31 +08:00
|
|
|
var b64 = b64_encode_utf8(userinfo);
|
2017-03-22 20:44:21 +08:00
|
|
|
var date = new Date();
|
2018-06-21 22:23:37 +08:00
|
|
|
var login_session_timeout = get_login_session_timeout();
|
|
|
|
|
2018-06-21 22:39:04 +08:00
|
|
|
if (login_session_timeout) {
|
2018-06-22 05:18:46 +08:00
|
|
|
date.setMinutes(date.getMinutes() + login_session_timeout);
|
2018-06-21 22:23:37 +08:00
|
|
|
} else {
|
|
|
|
// 8 hours from now
|
|
|
|
date.setHours(date.getHours() + 8);
|
|
|
|
}
|
2017-03-22 20:44:21 +08:00
|
|
|
store_cookie_value_with_expiration('auth', encodeURIComponent(b64), date);
|
2013-10-10 00:55:23 +08:00
|
|
|
}
|
|
|
|
|
2013-11-06 23:51:08 +08:00
|
|
|
function login_route () {
|
|
|
|
var userpass = '' + this.params['username'] + ':' + this.params['password'],
|
|
|
|
location = window.location.href,
|
|
|
|
hash = window.location.hash;
|
2014-09-23 00:45:53 +08:00
|
|
|
set_auth_pref(decodeURIComponent(userpass));
|
2013-11-06 23:51:08 +08:00
|
|
|
location = location.substr(0, location.length - hash.length);
|
|
|
|
window.location.replace(location);
|
|
|
|
// because we change url, we don't need to hit check_login as
|
|
|
|
// we'll end up doing that at the bottom of start_app_login after
|
|
|
|
// we've changed url.
|
|
|
|
}
|
|
|
|
|
2016-09-28 19:45:43 +08:00
|
|
|
function login_route_with_path() {
|
|
|
|
var params = ('' + this.params['splat']).split('/');
|
2016-09-19 20:14:20 +08:00
|
|
|
var user = params.shift();
|
|
|
|
var pass = params.shift();
|
|
|
|
var userpass = '' + user + ':' + pass,
|
|
|
|
location = window.location.href,
|
|
|
|
hash = window.location.hash;
|
|
|
|
set_auth_pref(decodeURIComponent(userpass));
|
|
|
|
location = location.substr(0, location.length - hash.length) + '#/' + params.join('/');
|
|
|
|
check_login();
|
|
|
|
window.location.replace(location);
|
|
|
|
}
|
|
|
|
|
2012-10-23 23:35:17 +08:00
|
|
|
function start_app_login() {
|
2012-11-14 21:51:04 +08:00
|
|
|
app = new Sammy.Application(function () {
|
2017-10-14 01:20:27 +08:00
|
|
|
this.get('#/', function() {});
|
2012-10-23 23:35:17 +08:00
|
|
|
this.put('#/login', function() {
|
|
|
|
username = this.params['username'];
|
|
|
|
password = this.params['password'];
|
2014-09-23 00:45:53 +08:00
|
|
|
set_auth_pref(username + ':' + password);
|
2012-11-03 00:31:30 +08:00
|
|
|
check_login();
|
2012-10-23 23:35:17 +08:00
|
|
|
});
|
2015-04-14 05:22:19 +08:00
|
|
|
this.get('#/login/:username/:password', login_route);
|
2016-09-28 19:45:43 +08:00
|
|
|
this.get(/\#\/login\/(.*)/, login_route_with_path);
|
2012-10-23 23:35:17 +08:00
|
|
|
});
|
|
|
|
app.run();
|
2017-03-22 20:44:21 +08:00
|
|
|
if (get_cookie_value('auth') != null) {
|
2012-11-03 00:31:30 +08:00
|
|
|
check_login();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function check_login() {
|
2014-01-31 21:40:48 +08:00
|
|
|
user = JSON.parse(sync_get('/whoami'));
|
2012-11-03 00:31:30 +08:00
|
|
|
if (user == false) {
|
2017-03-22 20:44:21 +08:00
|
|
|
// clear a local storage value used by earlier versions
|
2014-09-23 00:45:53 +08:00
|
|
|
clear_pref('auth');
|
2017-03-22 20:44:21 +08:00
|
|
|
clear_cookie_value('auth');
|
2012-11-03 00:31:30 +08:00
|
|
|
replace_content('login-status', '<p>Login failed</p>');
|
|
|
|
}
|
|
|
|
else {
|
2018-09-19 22:02:31 +08:00
|
|
|
hide_popup_warn();
|
2013-11-06 23:58:32 +08:00
|
|
|
replace_content('outer', format('layout', {}));
|
2018-06-21 22:23:37 +08:00
|
|
|
var user_login_session_timeout = parseInt(user.login_session_timeout);
|
|
|
|
// Update auth login_session_timeout if changed
|
|
|
|
if (has_auth_cookie_value() && !isNaN(user_login_session_timeout) &&
|
|
|
|
user_login_session_timeout !== get_login_session_timeout()) {
|
|
|
|
|
|
|
|
update_login_session_timeout(user_login_session_timeout);
|
|
|
|
}
|
2014-01-31 21:40:48 +08:00
|
|
|
setup_global_vars();
|
2012-11-03 00:31:30 +08:00
|
|
|
setup_constant_events();
|
|
|
|
update_vhosts();
|
|
|
|
update_interval();
|
|
|
|
setup_extensions();
|
|
|
|
}
|
2012-10-23 23:35:17 +08:00
|
|
|
}
|
|
|
|
|
2018-06-21 22:23:37 +08:00
|
|
|
function get_login_session_timeout() {
|
|
|
|
parseInt(get_cookie_value('login_session_timeout'));
|
|
|
|
}
|
|
|
|
|
|
|
|
function update_login_session_timeout(login_session_timeout) {
|
2018-06-22 05:18:46 +08:00
|
|
|
var auth_info = get_cookie_value('auth');
|
2018-06-21 22:23:37 +08:00
|
|
|
var date = new Date();
|
2018-06-22 05:18:46 +08:00
|
|
|
// `login_session_timeout` minutes from now
|
|
|
|
date.setMinutes(date.getMinutes() + login_session_timeout);
|
2018-06-21 22:23:37 +08:00
|
|
|
store_cookie_value('login_session_timeout', login_session_timeout);
|
|
|
|
store_cookie_value_with_expiration('auth', auth_info, date);
|
|
|
|
}
|
|
|
|
|
2011-05-06 01:30:45 +08:00
|
|
|
function start_app() {
|
2013-10-10 00:24:41 +08:00
|
|
|
if (app !== undefined) {
|
2013-10-10 00:16:47 +08:00
|
|
|
app.unload();
|
|
|
|
}
|
2012-11-14 21:51:04 +08:00
|
|
|
// Oh boy. Sammy uses various different methods to determine if
|
|
|
|
// the URL hash has changed. Unsurprisingly this is a native event
|
|
|
|
// in modern browsers, and falls back to an icky polling function
|
|
|
|
// in MSIE. But it looks like there's a bug. The polling function
|
|
|
|
// should get installed when the app is started. But it's guarded
|
|
|
|
// behind if (Sammy.HashLocationProxy._interval != null). And of
|
|
|
|
// course that's not specific to the application; it's pretty
|
|
|
|
// global. So we need to manually clear that in order for links to
|
|
|
|
// work in MSIE.
|
|
|
|
// Filed as https://github.com/quirkey/sammy/issues/171
|
|
|
|
//
|
|
|
|
// Note for when we upgrade: HashLocationProxy has become
|
|
|
|
// DefaultLocationProxy in later versions, but otherwise the issue
|
|
|
|
// remains.
|
2016-02-17 13:31:29 +08:00
|
|
|
|
2016-01-28 06:00:09 +08:00
|
|
|
// updated to the version 0.7.6 this _interval = null is fixed
|
|
|
|
// just leave the history here.
|
|
|
|
//Sammy.HashLocationProxy._interval = null;
|
|
|
|
|
|
|
|
|
2012-11-14 21:51:04 +08:00
|
|
|
app = new Sammy.Application(dispatcher);
|
2010-08-23 23:32:17 +08:00
|
|
|
app.run();
|
2012-11-03 01:41:31 +08:00
|
|
|
var url = this.location.toString();
|
|
|
|
if (url.indexOf('#') == -1) {
|
|
|
|
this.location = url + '#/';
|
|
|
|
}
|
2011-05-06 01:30:45 +08:00
|
|
|
}
|
2010-07-12 22:04:42 +08:00
|
|
|
|
2010-10-08 00:23:11 +08:00
|
|
|
function setup_constant_events() {
|
|
|
|
$('#update-every').change(function() {
|
|
|
|
var interval = $(this).val();
|
2011-01-18 02:06:02 +08:00
|
|
|
store_pref('interval', interval);
|
2011-01-14 19:33:34 +08:00
|
|
|
if (interval == '')
|
|
|
|
interval = null;
|
|
|
|
else
|
|
|
|
interval = parseInt(interval);
|
2010-10-08 00:23:11 +08:00
|
|
|
set_timer_interval(interval);
|
|
|
|
});
|
|
|
|
$('#show-vhost').change(function() {
|
|
|
|
current_vhost = $(this).val();
|
2011-01-18 01:23:54 +08:00
|
|
|
store_pref('vhost', current_vhost);
|
2010-10-08 00:23:11 +08:00
|
|
|
update();
|
|
|
|
});
|
2010-11-09 19:42:43 +08:00
|
|
|
if (!vhosts_interesting) {
|
|
|
|
$('#vhost-form').hide();
|
|
|
|
}
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function update_vhosts() {
|
|
|
|
var vhosts = JSON.parse(sync_get('/vhosts'));
|
2010-11-09 19:42:43 +08:00
|
|
|
vhosts_interesting = vhosts.length > 1;
|
|
|
|
if (vhosts_interesting)
|
|
|
|
$('#vhost-form').show();
|
|
|
|
else
|
|
|
|
$('#vhost-form').hide();
|
2010-10-08 00:23:11 +08:00
|
|
|
var select = $('#show-vhost').get(0);
|
|
|
|
select.options.length = vhosts.length + 1;
|
|
|
|
var index = 0;
|
|
|
|
for (var i = 0; i < vhosts.length; i++) {
|
|
|
|
var vhost = vhosts[i].name;
|
2011-01-18 21:32:47 +08:00
|
|
|
select.options[i + 1] = new Option(vhost, vhost);
|
2010-10-08 00:23:11 +08:00
|
|
|
if (vhost == current_vhost) index = i + 1;
|
|
|
|
}
|
|
|
|
select.selectedIndex = index;
|
2011-01-18 21:32:47 +08:00
|
|
|
current_vhost = select.options[index].value;
|
2011-01-18 01:32:26 +08:00
|
|
|
store_pref('vhost', current_vhost);
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
|
|
|
|
2011-05-06 01:30:45 +08:00
|
|
|
function setup_extensions() {
|
|
|
|
var extensions = JSON.parse(sync_get('/extensions'));
|
2016-07-15 05:35:35 +08:00
|
|
|
extension_count = 0;
|
2011-05-06 01:30:45 +08:00
|
|
|
for (var i in extensions) {
|
|
|
|
var extension = extensions[i];
|
2016-07-15 05:35:35 +08:00
|
|
|
if ($.isPlainObject(extension) && extension.hasOwnProperty("javascript")) {
|
|
|
|
dynamic_load(extension.javascript);
|
|
|
|
extension_count++;
|
|
|
|
}
|
2011-05-06 01:30:45 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function dynamic_load(filename) {
|
|
|
|
var element = document.createElement('script');
|
|
|
|
element.setAttribute('type', 'text/javascript');
|
|
|
|
element.setAttribute('src', 'js/' + filename);
|
|
|
|
document.getElementsByTagName("head")[0].appendChild(element);
|
|
|
|
}
|
|
|
|
|
2011-01-18 02:06:02 +08:00
|
|
|
function update_interval() {
|
2011-01-21 19:20:01 +08:00
|
|
|
var intervalStr = get_pref('interval');
|
|
|
|
var interval;
|
|
|
|
|
|
|
|
if (intervalStr == null) interval = 5000;
|
|
|
|
else if (intervalStr == '') interval = null;
|
|
|
|
else interval = parseInt(intervalStr);
|
|
|
|
|
|
|
|
if (isNaN(interval)) interval = null; // Prevent DoS if cookie malformed
|
|
|
|
|
2011-01-18 02:06:02 +08:00
|
|
|
set_timer_interval(interval);
|
|
|
|
|
|
|
|
var select = $('#update-every').get(0);
|
|
|
|
var opts = select.options;
|
|
|
|
for (var i = 0; i < opts.length; i++) {
|
2011-01-21 19:20:01 +08:00
|
|
|
if (opts[i].value == intervalStr) {
|
2011-01-18 02:06:02 +08:00
|
|
|
select.selectedIndex = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
|
|
|
|
2010-08-24 01:32:33 +08:00
|
|
|
function go_to(url) {
|
2012-11-21 01:02:41 +08:00
|
|
|
this.location = url;
|
2010-08-24 01:32:33 +08:00
|
|
|
}
|
|
|
|
|
2010-09-29 22:59:39 +08:00
|
|
|
function set_timer_interval(interval) {
|
|
|
|
timer_interval = interval;
|
2010-10-14 20:15:26 +08:00
|
|
|
reset_timer();
|
|
|
|
}
|
|
|
|
|
|
|
|
function reset_timer() {
|
2010-09-29 22:59:39 +08:00
|
|
|
clearInterval(timer);
|
|
|
|
if (timer_interval != null) {
|
2017-11-07 07:20:51 +08:00
|
|
|
timer = setInterval(partial_update, timer_interval);
|
2010-09-29 22:59:39 +08:00
|
|
|
}
|
|
|
|
}
|
2010-07-13 00:11:42 +08:00
|
|
|
|
2012-10-09 20:17:19 +08:00
|
|
|
function update_manual(div, query) {
|
|
|
|
var path;
|
|
|
|
var template;
|
2014-10-03 00:09:06 +08:00
|
|
|
if (query == 'memory' || query == 'binary') {
|
|
|
|
path = current_reqs['node']['path'] + '?' + query + '=true';
|
|
|
|
template = query;
|
2012-10-09 20:17:19 +08:00
|
|
|
}
|
2017-06-03 05:02:25 +08:00
|
|
|
|
2012-10-09 20:17:19 +08:00
|
|
|
var data = JSON.parse(sync_get(path));
|
|
|
|
|
|
|
|
replace_content(div, format(template, data));
|
2012-10-09 23:33:44 +08:00
|
|
|
postprocess_partial();
|
2012-10-09 20:17:19 +08:00
|
|
|
}
|
|
|
|
|
2010-08-23 23:32:17 +08:00
|
|
|
function render(reqs, template, highlight) {
|
2018-07-20 17:53:40 +08:00
|
|
|
var old_template = current_template;
|
2010-08-23 23:32:17 +08:00
|
|
|
current_template = template;
|
|
|
|
current_reqs = reqs;
|
2014-11-05 20:03:54 +08:00
|
|
|
for (var i in outstanding_reqs) {
|
|
|
|
outstanding_reqs[i].abort();
|
|
|
|
}
|
|
|
|
outstanding_reqs = [];
|
2010-08-23 23:32:17 +08:00
|
|
|
current_highlight = highlight;
|
2018-07-20 22:04:58 +08:00
|
|
|
if (old_template !== current_template) {
|
2018-07-20 17:53:40 +08:00
|
|
|
window.scrollTo(0, 0);
|
|
|
|
}
|
2010-09-29 23:56:03 +08:00
|
|
|
update();
|
2010-09-29 22:59:39 +08:00
|
|
|
}
|
|
|
|
|
2010-09-29 23:56:03 +08:00
|
|
|
function update() {
|
2012-12-07 19:35:40 +08:00
|
|
|
replace_content('debug', '');
|
2010-09-29 22:59:39 +08:00
|
|
|
clearInterval(timer);
|
2010-10-08 00:23:11 +08:00
|
|
|
with_update(function(html) {
|
2012-06-13 00:36:24 +08:00
|
|
|
update_navigation();
|
2010-09-29 22:59:39 +08:00
|
|
|
replace_content('main', html);
|
|
|
|
postprocess();
|
2010-10-12 00:05:06 +08:00
|
|
|
postprocess_partial();
|
2012-11-16 21:27:31 +08:00
|
|
|
render_charts();
|
2011-01-27 20:15:23 +08:00
|
|
|
maybe_scroll();
|
2010-10-14 20:15:26 +08:00
|
|
|
reset_timer();
|
2010-09-29 22:59:39 +08:00
|
|
|
});
|
2010-07-13 20:03:36 +08:00
|
|
|
}
|
|
|
|
|
2010-09-29 23:56:03 +08:00
|
|
|
function partial_update() {
|
2015-10-13 21:53:20 +08:00
|
|
|
if (!$(".pagination_class").is(":focus")) {
|
|
|
|
if ($('.updatable').length > 0) {
|
|
|
|
if (update_counter >= 200) {
|
|
|
|
update_counter = 0;
|
|
|
|
full_refresh();
|
|
|
|
return;
|
2010-09-29 22:59:39 +08:00
|
|
|
}
|
2015-10-13 21:53:20 +08:00
|
|
|
with_update(function(html) {
|
|
|
|
update_counter++;
|
|
|
|
replace_content('scratch', html);
|
|
|
|
var befores = $('#main .updatable');
|
|
|
|
var afters = $('#scratch .updatable');
|
|
|
|
if (befores.length != afters.length) {
|
2017-03-28 19:40:08 +08:00
|
|
|
console.log("before/after mismatch! Doing a full reload...");
|
|
|
|
full_refresh();
|
2015-10-13 21:53:20 +08:00
|
|
|
}
|
|
|
|
for (var i = 0; i < befores.length; i++) {
|
|
|
|
$(befores[i]).empty().append($(afters[i]).contents());
|
|
|
|
}
|
|
|
|
replace_content('scratch', '');
|
|
|
|
postprocess_partial();
|
|
|
|
render_charts();
|
|
|
|
});
|
|
|
|
}
|
2017-11-07 07:20:51 +08:00
|
|
|
}
|
2010-09-29 22:59:39 +08:00
|
|
|
}
|
|
|
|
|
2012-06-13 00:36:24 +08:00
|
|
|
function update_navigation() {
|
|
|
|
var l1 = '';
|
|
|
|
var l2 = '';
|
|
|
|
var descend = null;
|
|
|
|
|
|
|
|
for (var k in NAVIGATION) {
|
|
|
|
var val = NAVIGATION[k];
|
|
|
|
var path = val;
|
|
|
|
while (!leaf(path)) {
|
2013-09-19 20:29:25 +08:00
|
|
|
path = first_showable_child(path);
|
2012-06-13 00:36:24 +08:00
|
|
|
}
|
|
|
|
var selected = false;
|
|
|
|
if (contains_current_highlight(val)) {
|
|
|
|
selected = true;
|
|
|
|
if (!leaf(val)) {
|
|
|
|
descend = nav(val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (show(path)) {
|
|
|
|
l1 += '<li><a href="' + nav(path) + '"' +
|
|
|
|
(selected ? ' class="selected"' : '') + '>' + k + '</a></li>';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (descend) {
|
|
|
|
l2 = obj_to_ul(descend);
|
|
|
|
$('#main').addClass('with-rhs');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$('#main').removeClass('with-rhs');
|
|
|
|
}
|
|
|
|
|
|
|
|
replace_content('tabs', l1);
|
|
|
|
replace_content('rhs', l2);
|
|
|
|
}
|
|
|
|
|
|
|
|
function nav(pair) {
|
|
|
|
return pair[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
function show(pair) {
|
2013-09-19 20:29:25 +08:00
|
|
|
return jQuery.inArray(pair[1], user_tags) != -1;
|
2012-06-13 00:36:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function leaf(pair) {
|
|
|
|
return typeof(nav(pair)) == 'string';
|
|
|
|
}
|
|
|
|
|
2013-09-19 20:29:25 +08:00
|
|
|
function first_showable_child(pair) {
|
|
|
|
var items = pair[0];
|
|
|
|
var ks = keys(items);
|
|
|
|
for (var i = 0; i < ks.length; i++) {
|
|
|
|
var child = items[ks[i]];
|
|
|
|
if (show(child)) return child;
|
|
|
|
}
|
|
|
|
return items[ks[0]]; // We'll end up not showing it anyway
|
|
|
|
}
|
|
|
|
|
2012-06-13 00:36:24 +08:00
|
|
|
function contains_current_highlight(val) {
|
|
|
|
if (leaf(val)) {
|
|
|
|
return current_highlight == nav(val);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var b = false;
|
|
|
|
for (var k in val) {
|
|
|
|
b |= contains_current_highlight(val[k]);
|
|
|
|
}
|
|
|
|
return b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function obj_to_ul(val) {
|
|
|
|
var res = '<ul>';
|
|
|
|
for (var k in val) {
|
|
|
|
var obj = val[k];
|
2013-09-19 20:29:25 +08:00
|
|
|
if (show(obj)) {
|
|
|
|
res += '<li>';
|
|
|
|
if (leaf(obj)) {
|
|
|
|
res += '<a href="' + nav(obj) + '"' +
|
|
|
|
(current_highlight == nav(obj) ? ' class="selected"' : '') +
|
|
|
|
'>' + k + '</a>';
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
res += obj_to_ul(nav(obj));
|
|
|
|
}
|
|
|
|
res += '</li>';
|
2012-06-13 00:36:24 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return res + '</ul>';
|
|
|
|
}
|
|
|
|
|
2011-01-27 20:15:23 +08:00
|
|
|
function full_refresh() {
|
|
|
|
store_pref('position', x_position() + ',' + y_position());
|
|
|
|
location.reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
function maybe_scroll() {
|
|
|
|
var pos = get_pref('position');
|
|
|
|
if (pos) {
|
|
|
|
clear_pref('position');
|
|
|
|
var xy = pos.split(",");
|
|
|
|
window.scrollTo(parseInt(xy[0]), parseInt(xy[1]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function x_position() {
|
|
|
|
return window.pageXOffset ?
|
|
|
|
window.pageXOffset :
|
|
|
|
document.documentElement.scrollLeft ?
|
|
|
|
document.documentElement.scrollLeft :
|
|
|
|
document.body.scrollLeft;
|
|
|
|
}
|
|
|
|
|
|
|
|
function y_position() {
|
|
|
|
return window.pageYOffset ?
|
|
|
|
window.pageYOffset :
|
|
|
|
document.documentElement.scrollTop ?
|
|
|
|
document.documentElement.scrollTop :
|
|
|
|
document.body.scrollTop;
|
|
|
|
}
|
|
|
|
|
2010-10-08 00:23:11 +08:00
|
|
|
function with_update(fun) {
|
2016-10-05 23:50:36 +08:00
|
|
|
if(outstanding_reqs.length > 0){
|
|
|
|
return false;
|
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
with_reqs(apply_state(current_reqs), [], function(json) {
|
2010-08-23 23:32:17 +08:00
|
|
|
var html = format(current_template, json);
|
2010-09-29 22:59:39 +08:00
|
|
|
fun(html);
|
2010-08-31 23:44:12 +08:00
|
|
|
update_status('ok');
|
2010-08-24 01:32:33 +08:00
|
|
|
});
|
2016-10-05 23:50:36 +08:00
|
|
|
return true;
|
2010-08-24 01:32:33 +08:00
|
|
|
}
|
|
|
|
|
2010-10-12 00:05:06 +08:00
|
|
|
function apply_state(reqs) {
|
|
|
|
var reqs2 = {};
|
|
|
|
for (k in reqs) {
|
|
|
|
var req = reqs[k];
|
2013-01-25 22:57:04 +08:00
|
|
|
var options = {};
|
|
|
|
if (typeof(req) == "object") {
|
|
|
|
options = req.options;
|
|
|
|
req = req.path;
|
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
var req2;
|
2013-01-25 22:57:04 +08:00
|
|
|
if (options['vhost'] != undefined && current_vhost != '') {
|
2015-10-22 18:46:52 +08:00
|
|
|
var indexPage = req.indexOf("?page=");
|
|
|
|
if (indexPage >- 1) {
|
2015-10-13 21:53:20 +08:00
|
|
|
pageUrl = req.substr(indexPage);
|
2015-10-22 20:35:37 +08:00
|
|
|
req2 = req.substr(0,indexPage) + '/' + esc(current_vhost) + pageUrl;
|
2015-10-13 21:53:20 +08:00
|
|
|
} else
|
|
|
|
|
|
|
|
req2 = req + '/' + esc(current_vhost);
|
2010-10-12 00:05:06 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
req2 = req;
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
2012-12-20 01:58:36 +08:00
|
|
|
var qs = [];
|
2013-01-25 22:57:04 +08:00
|
|
|
if (options['sort'] != undefined && current_sort != null) {
|
2012-12-20 01:58:36 +08:00
|
|
|
qs.push('sort=' + current_sort);
|
|
|
|
qs.push('sort_reverse=' + current_sort_reverse);
|
2010-10-12 00:05:06 +08:00
|
|
|
}
|
2013-02-01 02:27:20 +08:00
|
|
|
if (options['ranges'] != undefined) {
|
|
|
|
for (i in options['ranges']) {
|
|
|
|
var type = options['ranges'][i];
|
2014-09-25 18:44:51 +08:00
|
|
|
var range = get_pref('chart-range').split('|');
|
2013-02-01 02:27:20 +08:00
|
|
|
var prefix;
|
|
|
|
if (type.substring(0, 8) == 'lengths-') {
|
|
|
|
prefix = 'lengths';
|
|
|
|
}
|
|
|
|
else if (type.substring(0, 10) == 'msg-rates-') {
|
|
|
|
prefix = 'msg_rates';
|
|
|
|
}
|
|
|
|
else if (type.substring(0, 11) == 'data-rates-') {
|
|
|
|
prefix = 'data_rates';
|
|
|
|
}
|
2014-06-11 23:33:53 +08:00
|
|
|
else if (type == 'node-stats') {
|
|
|
|
prefix = 'node_stats';
|
|
|
|
}
|
2013-02-01 02:27:20 +08:00
|
|
|
qs.push(prefix + '_age=' + parseInt(range[0]));
|
|
|
|
qs.push(prefix + '_incr=' + parseInt(range[1]));
|
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
}
|
2016-06-16 18:31:54 +08:00
|
|
|
/* Unknown options are used as query parameters as is. */
|
|
|
|
Object.keys(options).forEach(function (key) {
|
|
|
|
/* Skip known keys we already handled and undefined parameters. */
|
|
|
|
if (key == 'vhost' || key == 'sort' || key == 'ranges')
|
|
|
|
return;
|
|
|
|
if (!key || options[key] == undefined)
|
|
|
|
return;
|
|
|
|
|
|
|
|
qs.push(esc(key) + '=' + esc(options[key]));
|
|
|
|
});
|
2012-12-20 01:58:36 +08:00
|
|
|
qs = qs.join('&');
|
2015-11-03 16:23:05 +08:00
|
|
|
if (qs != '')
|
|
|
|
if (req2.indexOf("?page=") >- 1)
|
2015-10-22 15:55:36 +08:00
|
|
|
qs = '&' + qs;
|
|
|
|
else
|
|
|
|
qs = '?' + qs;
|
2015-11-03 16:23:05 +08:00
|
|
|
|
2010-10-12 00:05:06 +08:00
|
|
|
reqs2[k] = req2 + qs;
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
return reqs2;
|
2010-10-08 00:23:11 +08:00
|
|
|
}
|
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
function show_popup(type, text, _mode) {
|
2010-10-16 01:11:42 +08:00
|
|
|
var cssClass = '.form-popup-' + type;
|
2010-10-15 01:09:36 +08:00
|
|
|
function hide() {
|
2017-10-11 00:57:05 +08:00
|
|
|
$(cssClass).fadeOut(100, function() {
|
|
|
|
$(this).remove();
|
|
|
|
});
|
2010-10-15 01:09:36 +08:00
|
|
|
}
|
|
|
|
hide();
|
2017-10-27 00:17:52 +08:00
|
|
|
$('#outer').after(format('popup', {'type': type, 'text': text}));
|
2017-10-11 00:57:05 +08:00
|
|
|
$(cssClass).fadeIn(100);
|
2013-02-28 21:23:53 +08:00
|
|
|
$(cssClass + ' span').click(function () {
|
|
|
|
$('.popup-owner').removeClass('popup-owner');
|
|
|
|
hide();
|
|
|
|
});
|
2010-09-09 01:00:32 +08:00
|
|
|
}
|
|
|
|
|
2018-09-19 22:02:31 +08:00
|
|
|
function hide_popup_warn() {
|
|
|
|
var cssClass = '.form-popup-warn';
|
|
|
|
$('.popup-owner').removeClass('popup-owner');
|
|
|
|
$(cssClass).fadeOut(100, function() {
|
|
|
|
$(this).remove();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-05-18 06:27:48 +08:00
|
|
|
function submit_import(form) {
|
2017-05-18 06:47:00 +08:00
|
|
|
if (form.file.value) {
|
2017-05-18 22:33:35 +08:00
|
|
|
var confirm_upload = confirm('Are you sure you want to import a definitions file? Some entities (vhosts, users, queues, etc) may be overwritten!');
|
2017-05-18 22:22:50 +08:00
|
|
|
if (confirm_upload === true) {
|
2017-06-26 06:29:47 +08:00
|
|
|
var file = form.file.files[0]; // FUTURE: limit upload file size (?)
|
|
|
|
var vhost_upload = $("select[name='vhost-upload'] option:selected");
|
|
|
|
var vhost_selected = vhost_upload.index() > 0;
|
|
|
|
|
|
|
|
var vhost_name = null;
|
|
|
|
if (vhost_selected) {
|
|
|
|
vhost_name = vhost_upload.val();
|
|
|
|
}
|
|
|
|
|
|
|
|
var vhost_part = '';
|
|
|
|
if (vhost_name) {
|
|
|
|
vhost_part = '/' + esc(vhost_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
var form_action = "/definitions" + vhost_part + '?auth=' + get_cookie_value('auth');
|
|
|
|
var fd = new FormData();
|
|
|
|
fd.append('file', file);
|
|
|
|
with_req('POST', form_action, fd, function(resp) {
|
|
|
|
show_popup('info', 'Your definitions were imported successfully.');
|
|
|
|
});
|
2017-05-18 06:47:00 +08:00
|
|
|
}
|
2017-05-18 06:27:48 +08:00
|
|
|
}
|
2017-06-26 06:29:47 +08:00
|
|
|
return false;
|
2017-05-18 06:27:48 +08:00
|
|
|
};
|
2016-02-16 18:50:03 +08:00
|
|
|
|
2010-08-24 01:32:33 +08:00
|
|
|
function postprocess() {
|
2016-12-30 23:52:13 +08:00
|
|
|
$('form.confirm-queue').submit(function() {
|
|
|
|
return confirm("Are you sure? The queue is going to be deleted. " +
|
|
|
|
"Messages cannot be recovered after deletion.");
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2016-12-30 23:52:13 +08:00
|
|
|
$('form.confirm-purge-queue').submit(function() {
|
|
|
|
return confirm("Are you sure? Messages cannot be recovered after purging.");
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2010-08-24 17:24:50 +08:00
|
|
|
$('form.confirm').submit(function() {
|
|
|
|
return confirm("Are you sure? This object cannot be recovered " +
|
|
|
|
"after deletion.");
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2010-08-25 17:46:08 +08:00
|
|
|
$('label').map(function() {
|
|
|
|
if ($(this).attr('for') == '') {
|
|
|
|
var id = 'auto-label-' + Math.floor(Math.random()*1000000000);
|
|
|
|
var input = $(this).parents('tr').first().find('input, select');
|
2010-09-29 20:22:46 +08:00
|
|
|
if (input.attr('id') == '') {
|
|
|
|
$(this).attr('for', id);
|
|
|
|
input.attr('id', id);
|
|
|
|
}
|
2010-08-25 17:46:08 +08:00
|
|
|
}
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2011-10-13 23:32:55 +08:00
|
|
|
$('#download-definitions').click(function() {
|
2017-03-22 20:44:21 +08:00
|
|
|
var idx = $("select[name='vhost-download'] option:selected").index();
|
2016-02-16 00:33:01 +08:00
|
|
|
var vhost = ((idx <=0 ) ? "" : "/" + esc($("select[name='vhost-download'] option:selected").val()));
|
2016-02-16 00:21:14 +08:00
|
|
|
var path = 'api/definitions' + vhost + '?download=' +
|
2013-05-10 00:26:19 +08:00
|
|
|
esc($('#download-filename').val()) +
|
2017-03-22 20:44:21 +08:00
|
|
|
'&auth=' + get_cookie_value('auth');
|
2010-10-01 01:28:28 +08:00
|
|
|
window.location = path;
|
|
|
|
setTimeout('app.run()');
|
2010-09-29 20:22:46 +08:00
|
|
|
return false;
|
|
|
|
});
|
2016-02-16 18:50:03 +08:00
|
|
|
|
2012-10-09 20:17:19 +08:00
|
|
|
$('.update-manual').click(function() {
|
|
|
|
update_manual($(this).attr('for'), $(this).attr('query'));
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-11-28 01:09:58 +08:00
|
|
|
$(document).on('keyup', '.multifield input', function() {
|
2013-05-14 01:10:59 +08:00
|
|
|
update_multifields();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-11-28 01:09:58 +08:00
|
|
|
$(document).on('change', '.multifield select', function() {
|
2010-10-12 21:08:17 +08:00
|
|
|
update_multifields();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2011-05-25 22:50:31 +08:00
|
|
|
$('.controls-appearance').change(function() {
|
2013-11-22 23:32:44 +08:00
|
|
|
var params = $(this).get(0).options;
|
|
|
|
var selected = $(this).val();
|
|
|
|
|
|
|
|
for (i = 0; i < params.length; i++) {
|
|
|
|
var param = params[i].value;
|
|
|
|
if (param == selected) {
|
|
|
|
$('#' + param + '-div').slideDown(100);
|
|
|
|
} else {
|
|
|
|
$('#' + param + '-div').slideUp(100);
|
|
|
|
}
|
2010-12-09 01:40:10 +08:00
|
|
|
}
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$(document).on('click', '.help', function() {
|
|
|
|
show_popup('help', HELP[$(this).attr('id')]);
|
2011-01-17 21:25:21 +08:00
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$(document).on('click', '.popup-options-link', function() {
|
2013-02-28 21:23:53 +08:00
|
|
|
$('.popup-owner').removeClass('popup-owner');
|
2017-10-27 00:17:52 +08:00
|
|
|
$(this).addClass('popup-owner');
|
|
|
|
var template = $(this).attr('type') + '-options';
|
|
|
|
show_popup('options', format(template, {span: $(this)}), 'fade');
|
2012-11-16 21:27:31 +08:00
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$(document).on('click', '.rate-visibility-option', function() {
|
2014-06-05 00:44:19 +08:00
|
|
|
var k = $(this).attr('data-pref');
|
|
|
|
var show = get_pref(k) !== 'true';
|
|
|
|
store_pref(k, '' + show);
|
|
|
|
partial_update();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$(document).on('focus', 'input, select', function() {
|
2011-01-28 01:18:21 +08:00
|
|
|
update_counter = 0; // If there's interaction, reset the counter.
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2012-12-11 19:22:29 +08:00
|
|
|
$('.tag-link').click(function() {
|
|
|
|
$('#tags').val($(this).attr('tag'));
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2014-09-11 23:27:39 +08:00
|
|
|
$('.argument-link').click(function() {
|
|
|
|
var field = $(this).attr('field');
|
|
|
|
var row = $('#' + field).find('.mf').last();
|
|
|
|
var key = row.find('input').first();
|
2017-01-03 15:49:36 +08:00
|
|
|
var value = row.find('input').last();
|
2014-09-11 23:27:39 +08:00
|
|
|
var type = row.find('select').last();
|
|
|
|
key.val($(this).attr('key'));
|
2017-01-03 15:49:36 +08:00
|
|
|
value.val($(this).attr('value'));
|
2014-09-11 23:27:39 +08:00
|
|
|
type.val($(this).attr('type'));
|
|
|
|
update_multifields();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$(document).on('click', 'form.auto-submit select, form.auto-submit input', function(){
|
2012-11-16 21:27:31 +08:00
|
|
|
$(this).parents('form').submit();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$('#filter').on('keyup', debounce(update_filter, 500));
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2013-11-13 19:09:44 +08:00
|
|
|
$('#filter-regex-mode').change(update_filter_regex_mode);
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-10-27 00:17:52 +08:00
|
|
|
$('#truncate').on('keyup', debounce(update_truncate, 500));
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2010-09-30 20:19:54 +08:00
|
|
|
if (! user_administrator) {
|
|
|
|
$('.administrator-only').remove();
|
|
|
|
}
|
2015-11-03 16:23:05 +08:00
|
|
|
|
2010-10-12 21:08:17 +08:00
|
|
|
update_multifields();
|
2010-08-07 00:52:26 +08:00
|
|
|
}
|
|
|
|
|
2015-10-22 18:46:52 +08:00
|
|
|
function url_pagination_template(template, defaultPage, defaultPageSize){
|
2017-06-21 02:08:24 +08:00
|
|
|
var page_number_request = fmt_page_number_request(template, defaultPage);
|
|
|
|
var page_size = fmt_page_size_request(template, defaultPageSize);
|
|
|
|
var name_request = fmt_filter_name_request(template, "");
|
|
|
|
var use_regex = fmt_regex_request(template, "") == "checked";
|
|
|
|
if (use_regex) {
|
|
|
|
name_request = esc(name_request);
|
|
|
|
}
|
|
|
|
return '/' + template +
|
|
|
|
'?page=' + page_number_request +
|
|
|
|
'&page_size=' + page_size +
|
|
|
|
'&name=' + name_request +
|
|
|
|
'&use_regex=' + use_regex;
|
2015-10-15 18:44:36 +08:00
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:49 +08:00
|
|
|
function stored_page_info(template, page_start){
|
2017-03-24 23:59:23 +08:00
|
|
|
var pageSize = fmt_strip_tags($('#' + template+'-pagesize').val());
|
|
|
|
var filterName = fmt_strip_tags($('#' + template+'-name').val());
|
2016-01-26 06:51:53 +08:00
|
|
|
|
2015-11-17 23:59:49 +08:00
|
|
|
store_pref(template + '_current_page_number', page_start);
|
2015-11-13 05:25:01 +08:00
|
|
|
if (filterName != null && filterName != undefined) {
|
2015-11-17 23:59:49 +08:00
|
|
|
store_pref(template + '_current_filter_name', filterName);
|
2015-11-13 05:25:01 +08:00
|
|
|
}
|
2015-11-17 23:59:49 +08:00
|
|
|
var regex_on = $("#" + template + "-filter-regex-mode").is(':checked');
|
|
|
|
|
|
|
|
if (regex_on != null && regex_on != undefined) {
|
|
|
|
store_pref(template + '_current_regex', regex_on ? "checked" : " " );
|
|
|
|
}
|
|
|
|
|
2015-10-22 18:46:52 +08:00
|
|
|
if (pageSize != null && pageSize != undefined) {
|
2015-11-17 23:59:49 +08:00
|
|
|
store_pref(template + '_current_page_size', pageSize);
|
|
|
|
}
|
2015-10-13 21:53:20 +08:00
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:49 +08:00
|
|
|
function update_pages(template, page_start){
|
2015-11-18 00:31:55 +08:00
|
|
|
stored_page_info(template, page_start);
|
2015-11-17 23:59:49 +08:00
|
|
|
switch (template) {
|
|
|
|
case 'queues' : renderQueues(); break;
|
|
|
|
case 'exchanges' : renderExchanges(); break;
|
2015-11-20 16:57:22 +08:00
|
|
|
case 'connections' : renderConnections(); break;
|
2015-11-17 23:59:49 +08:00
|
|
|
case 'channels' : renderChannels(); break;
|
|
|
|
}
|
|
|
|
}
|
2015-10-13 21:53:20 +08:00
|
|
|
|
2015-11-17 23:59:49 +08:00
|
|
|
function renderQueues() {
|
|
|
|
render({'queues': {path: url_pagination_template('queues', 1, 100),
|
|
|
|
options: {sort:true, vhost:true, pagination:true}},
|
|
|
|
'vhosts': '/vhosts'}, 'queues', '#/queues');
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderExchanges() {
|
|
|
|
render({'exchanges': {path: url_pagination_template('exchanges', 1, 100),
|
|
|
|
options: {sort:true, vhost:true, pagination:true}},
|
|
|
|
'vhosts': '/vhosts'}, 'exchanges', '#/exchanges');
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderConnections() {
|
2016-01-26 06:51:53 +08:00
|
|
|
render({'connections': {path: url_pagination_template('connections', 1, 100),
|
2015-11-17 23:59:49 +08:00
|
|
|
options: {sort:true}}},
|
|
|
|
'connections', '#/connections');
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderChannels() {
|
2016-01-26 06:51:53 +08:00
|
|
|
render({'channels': {path: url_pagination_template('channels', 1, 100),
|
2015-11-17 23:59:49 +08:00
|
|
|
options: {sort:true}}},
|
|
|
|
'channels', '#/channels');
|
|
|
|
}
|
|
|
|
|
2016-01-24 18:28:51 +08:00
|
|
|
function update_pages_from_ui(sender) {
|
2017-03-24 23:59:23 +08:00
|
|
|
var val = $(sender).val();
|
|
|
|
var raw = !!$(sender).attr('data-page-start') ? $(sender).attr('data-page-start') : val;
|
|
|
|
var s = fmt_strip_tags(raw);
|
|
|
|
update_pages(current_template, s);
|
2016-01-24 18:28:51 +08:00
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:49 +08:00
|
|
|
function postprocess_partial() {
|
2016-01-24 18:28:51 +08:00
|
|
|
$('.pagination_class_input').keypress(function(e) {
|
|
|
|
if (e.keyCode == 13) {
|
|
|
|
update_pages_from_ui(this);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$('.pagination_class_checkbox').click(function(e) {
|
|
|
|
update_pages_from_ui(this);
|
|
|
|
});
|
|
|
|
|
|
|
|
$('.pagination_class_select').change(function(e) {
|
|
|
|
update_pages_from_ui(this);
|
2015-11-13 05:25:01 +08:00
|
|
|
});
|
|
|
|
|
2015-02-27 20:34:04 +08:00
|
|
|
setup_visibility();
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2017-11-28 03:51:52 +08:00
|
|
|
$('#main').off('click', 'div.section h2, div.section-hidden h2');
|
|
|
|
$('#main').on('click', 'div.section h2, div.section-hidden h2', function() {
|
2017-11-07 07:20:51 +08:00
|
|
|
toggle_visibility($(this));
|
|
|
|
});
|
|
|
|
|
2010-10-12 00:05:06 +08:00
|
|
|
$('.sort').click(function() {
|
|
|
|
var sort = $(this).attr('sort');
|
|
|
|
if (current_sort == sort) {
|
|
|
|
current_sort_reverse = ! current_sort_reverse;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
current_sort = sort;
|
|
|
|
current_sort_reverse = false;
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
});
|
2017-11-07 07:20:51 +08:00
|
|
|
|
2013-04-26 19:30:52 +08:00
|
|
|
// TODO remove this hack when we get rid of "updatable"
|
|
|
|
if ($('#filter-warning-show').length > 0) {
|
|
|
|
$('#filter-truncate').addClass('filter-warning');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$('#filter-truncate').removeClass('filter-warning');
|
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
}
|
|
|
|
|
2010-10-12 21:08:17 +08:00
|
|
|
function update_multifields() {
|
2013-05-14 01:10:59 +08:00
|
|
|
$('div.multifield').each(function(index) {
|
|
|
|
update_multifield($(this), true);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function update_multifield(multifield, dict) {
|
|
|
|
var largest_id = 0;
|
|
|
|
var empty_found = false;
|
|
|
|
var name = multifield.attr('id');
|
2014-09-11 23:27:39 +08:00
|
|
|
var type_inputs = $('#' + name + ' *[name$="_mftype"]');
|
|
|
|
type_inputs.each(function(index) {
|
2013-05-14 01:10:59 +08:00
|
|
|
var re = new RegExp(name + '_([0-9]*)_mftype');
|
|
|
|
var match = $(this).attr('name').match(re);
|
|
|
|
if (!match) return;
|
|
|
|
var id = parseInt(match[1]);
|
|
|
|
largest_id = Math.max(id, largest_id);
|
|
|
|
var prefix = name + '_' + id;
|
|
|
|
var type = $(this).val();
|
|
|
|
var input = $('#' + prefix + '_mfvalue');
|
|
|
|
if (type == 'list') {
|
|
|
|
if (input.size() == 1) {
|
|
|
|
input.replaceWith('<div class="multifield-sub" id="' + prefix +
|
|
|
|
'"></div>');
|
|
|
|
}
|
|
|
|
update_multifield($('#' + prefix), false);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (input.size() == 1) {
|
|
|
|
var key = dict ? $('#' + prefix + '_mfkey').val() : '';
|
|
|
|
var value = input.val();
|
|
|
|
if (key == '' && value == '') {
|
2014-09-11 23:27:39 +08:00
|
|
|
if (index == type_inputs.length - 1) {
|
|
|
|
empty_found = true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$(this).parents('.mf').first().remove();
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
2012-05-02 00:52:04 +08:00
|
|
|
}
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
2013-05-14 01:10:59 +08:00
|
|
|
else {
|
|
|
|
$('#' + prefix).replaceWith(multifield_input(prefix, 'value',
|
|
|
|
'text'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (!empty_found) {
|
|
|
|
var prefix = name + '_' + (largest_id + 1);
|
|
|
|
var t = multifield.hasClass('string-only') ? 'hidden' : 'select';
|
|
|
|
var val_type = multifield_input(prefix, 'value', 'text') + ' ' +
|
|
|
|
multifield_input(prefix, 'type', t);
|
|
|
|
|
|
|
|
if (dict) {
|
2014-09-11 23:27:39 +08:00
|
|
|
multifield.append('<table class="mf"><tr><td>' +
|
2013-05-14 01:10:59 +08:00
|
|
|
multifield_input(prefix, 'key', 'text') +
|
|
|
|
'</td><td class="equals"> = </td><td>' +
|
|
|
|
val_type + '</td></tr></table>');
|
|
|
|
}
|
|
|
|
else {
|
2014-09-11 23:27:39 +08:00
|
|
|
multifield.append('<div class="mf">' + val_type + '</div>');
|
2013-05-14 01:10:59 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function multifield_input(prefix, suffix, type) {
|
|
|
|
if (type == 'hidden' ) {
|
|
|
|
return '<input type="hidden" id="' + prefix + '_mf' + suffix +
|
|
|
|
'" name="' + prefix + '_mf' + suffix + '" value="string"/>';
|
|
|
|
}
|
|
|
|
else if (type == 'text' ) {
|
|
|
|
return '<input type="text" id="' + prefix + '_mf' + suffix +
|
|
|
|
'" name="' + prefix + '_mf' + suffix + '" value=""/>';
|
|
|
|
}
|
|
|
|
else if (type == 'select' ) {
|
|
|
|
return '<select id="' + prefix + '_mf' + suffix + '" name="' + prefix +
|
|
|
|
'_mf' + suffix + '">' +
|
|
|
|
'<option value="string">String</option>' +
|
|
|
|
'<option value="number">Number</option>' +
|
|
|
|
'<option value="boolean">Boolean</option>' +
|
|
|
|
'<option value="list">List</option>' +
|
|
|
|
'</select>';
|
|
|
|
}
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
|
|
|
|
2013-11-13 19:09:44 +08:00
|
|
|
function update_filter_regex(jElem) {
|
2013-11-13 00:41:31 +08:00
|
|
|
current_filter_regex = null;
|
2013-11-13 19:09:44 +08:00
|
|
|
jElem.parents('.filter').children('.status-error').remove();
|
|
|
|
if (current_filter_regex_on && $.trim(current_filter).length > 0) {
|
2013-11-13 00:41:31 +08:00
|
|
|
try {
|
|
|
|
current_filter_regex = new RegExp(current_filter,'i');
|
2013-11-13 19:09:44 +08:00
|
|
|
} catch (e) {
|
|
|
|
jElem.parents('.filter').append('<p class="status-error">' +
|
2017-03-24 23:59:23 +08:00
|
|
|
fmt_escape_html(e.message) + '</p>');
|
2013-11-13 19:09:44 +08:00
|
|
|
}
|
2013-11-13 00:41:31 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function update_filter_regex_mode() {
|
|
|
|
current_filter_regex_on = $(this).is(':checked');
|
2013-11-13 19:09:44 +08:00
|
|
|
update_filter_regex($(this));
|
2013-11-13 00:41:31 +08:00
|
|
|
partial_update();
|
|
|
|
}
|
|
|
|
|
2013-04-08 21:00:06 +08:00
|
|
|
function update_filter() {
|
|
|
|
current_filter = $(this).val();
|
2013-11-13 01:09:02 +08:00
|
|
|
var table = $(this).parents('table').first();
|
|
|
|
table.removeClass('filter-active');
|
|
|
|
if ($(this).val() != '') {
|
|
|
|
table.addClass('filter-active');
|
2013-04-26 17:50:46 +08:00
|
|
|
}
|
2013-11-13 19:09:44 +08:00
|
|
|
update_filter_regex($(this));
|
2013-04-26 17:50:46 +08:00
|
|
|
partial_update();
|
2013-04-25 23:13:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function update_truncate() {
|
2013-04-26 19:59:53 +08:00
|
|
|
var current_truncate_str =
|
|
|
|
$(this).val().replace(new RegExp('\\D', 'g'), '');
|
|
|
|
if (current_truncate_str == '')
|
|
|
|
current_truncate_str = '0';
|
|
|
|
if ($(this).val() != current_truncate_str)
|
|
|
|
$(this).val(current_truncate_str);
|
|
|
|
current_truncate = parseInt(current_truncate_str, 10);
|
2013-04-25 23:13:44 +08:00
|
|
|
store_pref('truncate', current_truncate);
|
2013-04-08 21:00:06 +08:00
|
|
|
partial_update();
|
|
|
|
}
|
|
|
|
|
2011-01-18 01:12:03 +08:00
|
|
|
function setup_visibility() {
|
|
|
|
$('div.section,div.section-hidden').each(function(_index) {
|
|
|
|
var pref = section_pref(current_template,
|
|
|
|
$(this).children('h2').text());
|
|
|
|
var show = get_pref(pref);
|
|
|
|
if (show == null) {
|
|
|
|
show = $(this).hasClass('section');
|
|
|
|
}
|
|
|
|
else {
|
2011-01-18 02:13:00 +08:00
|
|
|
show = show == 't';
|
2011-01-18 01:12:03 +08:00
|
|
|
}
|
|
|
|
if (show) {
|
|
|
|
$(this).addClass('section-visible');
|
2014-10-02 22:41:36 +08:00
|
|
|
// Workaround for... something. Although div.hider is
|
|
|
|
// display:block anyway, not explicitly setting this
|
|
|
|
// prevents the first slideToggle() from animating
|
|
|
|
// successfully; instead the element just vanishes.
|
|
|
|
$(this).find('.hider').attr('style', 'display:block;');
|
2011-01-18 01:12:03 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
$(this).addClass('section-invisible');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggle_visibility(item) {
|
|
|
|
var hider = item.next();
|
|
|
|
var all = item.parent();
|
|
|
|
var pref = section_pref(current_template, item.text());
|
|
|
|
item.next().slideToggle(100);
|
|
|
|
if (all.hasClass('section-visible')) {
|
|
|
|
if (all.hasClass('section'))
|
2011-01-18 02:13:00 +08:00
|
|
|
store_pref(pref, 'f');
|
2011-01-18 01:12:03 +08:00
|
|
|
else
|
|
|
|
clear_pref(pref);
|
|
|
|
all.removeClass('section-visible');
|
|
|
|
all.addClass('section-invisible');
|
|
|
|
}
|
|
|
|
else {
|
2017-11-07 07:20:51 +08:00
|
|
|
if (all.hasClass('section-hidden')) {
|
2011-01-18 02:13:00 +08:00
|
|
|
store_pref(pref, 't');
|
2017-11-07 07:20:51 +08:00
|
|
|
} else {
|
2011-01-18 01:12:03 +08:00
|
|
|
clear_pref(pref);
|
2017-11-07 07:20:51 +08:00
|
|
|
}
|
2011-01-18 01:12:03 +08:00
|
|
|
all.removeClass('section-invisible');
|
|
|
|
all.addClass('section-visible');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-25 22:17:27 +08:00
|
|
|
function publish_msg(params0) {
|
2017-03-23 19:07:47 +08:00
|
|
|
try {
|
|
|
|
var params = params_magic(params0);
|
|
|
|
publish_msg0(params);
|
|
|
|
} catch (e) {
|
2017-03-23 20:43:42 +08:00
|
|
|
show_popup('warn', fmt_escape_html(e));
|
2017-03-23 19:07:47 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function publish_msg0(params) {
|
2011-02-24 01:59:34 +08:00
|
|
|
var path = fill_path_template('/exchanges/:vhost/:name/publish', params);
|
2011-02-25 22:17:27 +08:00
|
|
|
params['payload_encoding'] = 'string';
|
|
|
|
params['properties'] = {};
|
2011-02-25 22:27:09 +08:00
|
|
|
params['properties']['delivery_mode'] = parseInt(params['delivery_mode']);
|
2011-02-25 22:17:27 +08:00
|
|
|
if (params['headers'] != '')
|
|
|
|
params['properties']['headers'] = params['headers'];
|
2014-04-24 20:20:29 +08:00
|
|
|
var props = [['content_type', 'str'],
|
|
|
|
['content_encoding', 'str'],
|
|
|
|
['correlation_id', 'str'],
|
|
|
|
['reply_to', 'str'],
|
|
|
|
['expiration', 'str'],
|
|
|
|
['message_id', 'str'],
|
|
|
|
['type', 'str'],
|
|
|
|
['user_id', 'str'],
|
|
|
|
['app_id', 'str'],
|
|
|
|
['cluster_id', 'str'],
|
|
|
|
['priority', 'int'],
|
|
|
|
['timestamp', 'int']];
|
2011-02-25 22:17:27 +08:00
|
|
|
for (var i in props) {
|
2014-04-24 20:20:29 +08:00
|
|
|
var name = props[i][0];
|
|
|
|
var type = props[i][1];
|
|
|
|
if (params['props'][name] != undefined && params['props'][name] != '') {
|
|
|
|
var value = params['props'][name];
|
|
|
|
if (type == 'int') value = parseInt(value);
|
|
|
|
params['properties'][name] = value;
|
|
|
|
}
|
2011-02-25 22:17:27 +08:00
|
|
|
}
|
2011-02-24 01:59:34 +08:00
|
|
|
with_req('POST', path, JSON.stringify(params), function(resp) {
|
|
|
|
var result = jQuery.parseJSON(resp.responseText);
|
|
|
|
if (result.routed) {
|
|
|
|
show_popup('info', 'Message published.');
|
|
|
|
} else {
|
|
|
|
show_popup('warn', 'Message published, but not routed.');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-02-22 22:00:20 +08:00
|
|
|
function get_msgs(params) {
|
|
|
|
var path = fill_path_template('/queues/:vhost/:name/get', params);
|
|
|
|
with_req('POST', path, JSON.stringify(params), function(resp) {
|
|
|
|
var msgs = jQuery.parseJSON(resp.responseText);
|
|
|
|
if (msgs.length == 0) {
|
|
|
|
show_popup('info', 'Queue is empty');
|
|
|
|
} else {
|
|
|
|
$('#msg-wrapper').slideUp(200);
|
|
|
|
replace_content('msg-wrapper', format('messages', {'msgs': msgs}));
|
|
|
|
$('#msg-wrapper').slideDown(200);
|
|
|
|
}
|
2011-02-22 02:20:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2010-08-07 00:52:26 +08:00
|
|
|
function with_reqs(reqs, acc, fun) {
|
2010-09-02 19:58:34 +08:00
|
|
|
if (keys(reqs).length > 0) {
|
|
|
|
var key = keys(reqs)[0];
|
2011-02-22 22:00:20 +08:00
|
|
|
with_req('GET', reqs[key], null, function(resp) {
|
2010-08-31 23:44:12 +08:00
|
|
|
acc[key] = jQuery.parseJSON(resp.responseText);
|
|
|
|
var remainder = {};
|
|
|
|
for (var k in reqs) {
|
|
|
|
if (k != key) remainder[k] = reqs[k];
|
|
|
|
}
|
|
|
|
with_reqs(remainder, acc, fun);
|
2010-08-07 00:52:26 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fun(acc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-07-13 00:31:16 +08:00
|
|
|
function replace_content(id, html) {
|
2011-01-28 19:12:29 +08:00
|
|
|
$("#" + id).html(html);
|
2010-07-13 00:31:16 +08:00
|
|
|
}
|
|
|
|
|
2013-09-20 21:31:59 +08:00
|
|
|
var ejs_cached = {};
|
|
|
|
|
2010-07-12 22:04:42 +08:00
|
|
|
function format(template, json) {
|
2014-10-06 20:05:52 +08:00
|
|
|
try {
|
2013-09-20 21:31:59 +08:00
|
|
|
var cache = true;
|
|
|
|
if (!(template in ejs_cached)) {
|
|
|
|
ejs_cached[template] = true;
|
|
|
|
cache = false;
|
|
|
|
}
|
|
|
|
var tmpl = new EJS({url: 'js/tmpl/' + template + '.ejs', cache: cache});
|
2010-07-17 00:38:06 +08:00
|
|
|
return tmpl.render(json);
|
2014-10-06 20:05:52 +08:00
|
|
|
} catch (err) {
|
|
|
|
clearInterval(timer);
|
2017-03-28 19:40:08 +08:00
|
|
|
console.log("Uncaught error: " + err);
|
|
|
|
console.log("Stack: " + err['stack']);
|
|
|
|
debug(err['name'] + ": " + err['message'] + "\n" + err['stack'] + "\n");
|
2014-10-06 20:05:52 +08:00
|
|
|
}
|
2010-07-12 22:04:42 +08:00
|
|
|
}
|
|
|
|
|
2010-08-31 23:44:12 +08:00
|
|
|
function update_status(status) {
|
2010-07-13 00:31:16 +08:00
|
|
|
var text;
|
|
|
|
if (status == 'ok')
|
2017-10-27 00:17:52 +08:00
|
|
|
text = "Refreshed " + fmt_date(new Date());
|
2011-01-14 19:33:34 +08:00
|
|
|
else if (status == 'error') {
|
|
|
|
var next_try = new Date(new Date().getTime() + timer_interval);
|
|
|
|
text = "Error: could not connect to server since " +
|
2017-10-27 00:17:52 +08:00
|
|
|
fmt_date(last_successful_connect) + ". Will retry at " +
|
2011-01-14 19:45:45 +08:00
|
|
|
fmt_date(next_try) + ".";
|
2011-01-14 19:33:34 +08:00
|
|
|
}
|
2010-09-29 22:59:39 +08:00
|
|
|
else
|
|
|
|
throw("Unknown status " + status);
|
2010-07-13 00:31:16 +08:00
|
|
|
|
2010-07-17 00:38:06 +08:00
|
|
|
var html = format('status', {status: status, text: text});
|
2010-07-13 00:31:16 +08:00
|
|
|
replace_content('status', html);
|
|
|
|
}
|
|
|
|
|
2017-03-22 20:44:21 +08:00
|
|
|
function has_auth_cookie_value() {
|
|
|
|
return get_cookie_value('auth') != null;
|
|
|
|
}
|
|
|
|
|
2012-10-23 23:35:17 +08:00
|
|
|
function auth_header() {
|
2017-03-22 20:44:21 +08:00
|
|
|
if(has_auth_cookie_value()) {
|
2017-06-26 06:29:47 +08:00
|
|
|
return "Basic " + decodeURIComponent(get_cookie_value('auth'));
|
2017-03-22 20:44:21 +08:00
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
2012-10-23 23:35:17 +08:00
|
|
|
}
|
|
|
|
|
2011-02-22 22:00:20 +08:00
|
|
|
function with_req(method, path, body, fun) {
|
2017-03-22 20:44:21 +08:00
|
|
|
if(!has_auth_cookie_value()) {
|
|
|
|
// navigate to the login form
|
|
|
|
location.reload();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-07-12 22:04:42 +08:00
|
|
|
var json;
|
2010-09-03 20:23:04 +08:00
|
|
|
var req = xmlHttpRequest();
|
2011-06-08 00:25:00 +08:00
|
|
|
req.open(method, 'api' + path, true );
|
2012-10-23 23:35:17 +08:00
|
|
|
req.setRequestHeader('authorization', auth_header());
|
2015-04-14 05:22:19 +08:00
|
|
|
req.setRequestHeader('x-vhost', current_vhost);
|
2010-07-12 22:04:42 +08:00
|
|
|
req.onreadystatechange = function () {
|
|
|
|
if (req.readyState == 4) {
|
2014-11-05 20:03:54 +08:00
|
|
|
var ix = jQuery.inArray(req, outstanding_reqs);
|
|
|
|
if (ix != -1) {
|
|
|
|
outstanding_reqs.splice(ix, 1);
|
|
|
|
}
|
2011-03-16 19:34:55 +08:00
|
|
|
if (check_bad_response(req, true)) {
|
2011-01-14 19:33:34 +08:00
|
|
|
last_successful_connect = new Date();
|
2010-08-31 23:44:12 +08:00
|
|
|
fun(req);
|
2010-07-12 22:04:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2014-11-05 20:03:54 +08:00
|
|
|
outstanding_reqs.push(req);
|
2011-02-22 22:00:20 +08:00
|
|
|
req.send(body);
|
2010-07-12 22:04:42 +08:00
|
|
|
}
|
2010-07-13 20:03:36 +08:00
|
|
|
|
2010-09-08 23:27:34 +08:00
|
|
|
function sync_get(path) {
|
|
|
|
return sync_req('GET', [], path);
|
|
|
|
}
|
|
|
|
|
2010-08-25 01:46:30 +08:00
|
|
|
function sync_put(sammy, path_template) {
|
2010-09-09 01:00:32 +08:00
|
|
|
return sync_req('PUT', sammy.params, path_template);
|
2010-08-25 01:46:30 +08:00
|
|
|
}
|
|
|
|
|
2013-01-11 20:36:15 +08:00
|
|
|
function sync_delete(sammy, path_template, options) {
|
|
|
|
return sync_req('DELETE', sammy.params, path_template, options);
|
2010-08-25 01:46:30 +08:00
|
|
|
}
|
|
|
|
|
2010-09-02 00:26:51 +08:00
|
|
|
function sync_post(sammy, path_template) {
|
2010-09-09 01:00:32 +08:00
|
|
|
return sync_req('POST', sammy.params, path_template);
|
2010-09-02 00:26:51 +08:00
|
|
|
}
|
|
|
|
|
2013-01-11 20:36:15 +08:00
|
|
|
function sync_req(type, params0, path_template, options) {
|
2011-03-09 02:43:14 +08:00
|
|
|
var params;
|
2010-10-15 01:09:36 +08:00
|
|
|
var path;
|
|
|
|
try {
|
2011-03-09 02:43:14 +08:00
|
|
|
params = params_magic(params0);
|
2010-10-15 01:09:36 +08:00
|
|
|
path = fill_path_template(path_template, params);
|
|
|
|
} catch (e) {
|
2017-03-23 20:43:42 +08:00
|
|
|
show_popup('warn', fmt_escape_html(e));
|
2010-10-15 01:09:36 +08:00
|
|
|
return false;
|
|
|
|
}
|
2010-09-03 20:23:04 +08:00
|
|
|
var req = xmlHttpRequest();
|
2011-06-08 00:25:00 +08:00
|
|
|
req.open(type, 'api' + path, false);
|
2010-08-24 01:32:33 +08:00
|
|
|
req.setRequestHeader('content-type', 'application/json');
|
2012-10-23 23:35:17 +08:00
|
|
|
req.setRequestHeader('authorization', auth_header());
|
2013-01-11 20:36:15 +08:00
|
|
|
|
|
|
|
if (options != undefined || options != null) {
|
2017-11-07 07:20:51 +08:00
|
|
|
if (options.headers != undefined || options.headers != null) {
|
|
|
|
jQuery.each(options.headers, function (k, v) {
|
|
|
|
req.setRequestHeader(k, v);
|
|
|
|
});
|
|
|
|
}
|
2013-01-11 20:36:15 +08:00
|
|
|
}
|
|
|
|
|
2010-09-03 20:23:04 +08:00
|
|
|
try {
|
2010-09-29 14:18:23 +08:00
|
|
|
if (type == 'GET')
|
|
|
|
req.send(null);
|
|
|
|
else
|
|
|
|
req.send(JSON.stringify(params));
|
2010-09-03 20:23:04 +08:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
if (e.number == 0x80004004) {
|
|
|
|
// 0x80004004 means "Operation aborted."
|
|
|
|
// http://support.microsoft.com/kb/186063
|
|
|
|
// MSIE6 appears to do this in response to HTTP 204.
|
|
|
|
}
|
|
|
|
}
|
2010-08-24 01:32:33 +08:00
|
|
|
|
2011-03-16 19:34:55 +08:00
|
|
|
if (check_bad_response(req, false)) {
|
2011-03-16 19:11:13 +08:00
|
|
|
if (type == 'GET')
|
|
|
|
return req.responseText;
|
|
|
|
else
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
2010-09-09 01:00:32 +08:00
|
|
|
return false;
|
|
|
|
}
|
2011-03-16 19:11:13 +08:00
|
|
|
}
|
2010-09-09 01:00:32 +08:00
|
|
|
|
2011-03-16 19:34:55 +08:00
|
|
|
function check_bad_response(req, full_page_404) {
|
2010-09-03 20:23:04 +08:00
|
|
|
// 1223 == 204 - see http://www.enhanceie.com/ie/bugs.asp
|
|
|
|
// MSIE7 and 8 appear to do this in response to HTTP 204.
|
2011-03-16 19:11:13 +08:00
|
|
|
if ((req.status >= 200 && req.status < 300) || req.status == 1223) {
|
|
|
|
return true;
|
|
|
|
}
|
2011-03-16 19:34:55 +08:00
|
|
|
else if (req.status == 404 && full_page_404) {
|
|
|
|
var html = format('404', {});
|
|
|
|
replace_content('main', html);
|
|
|
|
}
|
2015-10-22 18:46:52 +08:00
|
|
|
else if (req.status >= 400 && req.status <= 404) {
|
2011-03-16 19:11:13 +08:00
|
|
|
var reason = JSON.parse(req.responseText).reason;
|
|
|
|
if (typeof(reason) != 'string') reason = JSON.stringify(reason);
|
2015-10-22 15:55:36 +08:00
|
|
|
|
|
|
|
var error = JSON.parse(req.responseText).error;
|
|
|
|
if (typeof(error) != 'string') error = JSON.stringify(error);
|
2015-11-03 16:23:05 +08:00
|
|
|
|
2017-01-03 18:38:24 +08:00
|
|
|
if (error == 'bad_request' || error == 'not_found' || error == 'not_authorised') {
|
2017-03-23 20:43:42 +08:00
|
|
|
show_popup('warn', fmt_escape_html(reason));
|
2016-01-20 20:01:09 +08:00
|
|
|
} else if (error == 'page_out_of_range') {
|
2015-11-17 23:59:49 +08:00
|
|
|
var seconds = 60;
|
|
|
|
if (last_page_out_of_range_error > 0)
|
2015-11-03 16:23:05 +08:00
|
|
|
seconds = (new Date().getTime() - last_page_out_of_range_error.getTime())/1000;
|
2015-11-17 23:59:49 +08:00
|
|
|
if (seconds > 3) {
|
|
|
|
Sammy.log('server reports page is out of range, redirecting to page 1');
|
2015-11-19 17:33:20 +08:00
|
|
|
var contexts = ["queues", "exchanges", "connections", "channels"];
|
2015-11-19 19:42:35 +08:00
|
|
|
var matches = /api\/(.*)\?/.exec(req.responseURL);
|
|
|
|
if (matches != null && matches.length > 1) {
|
2015-12-30 09:29:36 +08:00
|
|
|
contexts.forEach(function(item) {
|
2015-11-19 19:42:35 +08:00
|
|
|
if (matches[1].indexOf(item) == 0) {update_pages(item, 1)};
|
2015-12-30 09:29:36 +08:00
|
|
|
});
|
2016-01-25 16:58:09 +08:00
|
|
|
} else update_pages(current_template, 1);
|
2016-01-26 06:51:53 +08:00
|
|
|
|
2015-12-30 09:29:36 +08:00
|
|
|
last_page_out_of_range_error = new Date();
|
2015-11-17 23:59:49 +08:00
|
|
|
}
|
2016-01-20 20:01:09 +08:00
|
|
|
}
|
2015-10-13 21:53:20 +08:00
|
|
|
}
|
2011-03-16 19:11:13 +08:00
|
|
|
else if (req.status == 408) {
|
|
|
|
update_status('timeout');
|
|
|
|
}
|
|
|
|
else if (req.status == 0) { // Non-MSIE: could not connect
|
|
|
|
update_status('error');
|
|
|
|
}
|
|
|
|
else if (req.status > 12000) { // MSIE: could not connect
|
|
|
|
update_status('error');
|
|
|
|
}
|
2011-08-12 01:21:48 +08:00
|
|
|
else if (req.status == 503) { // Proxy: could not connect
|
|
|
|
update_status('error');
|
|
|
|
}
|
2011-03-16 19:11:13 +08:00
|
|
|
else {
|
2017-10-27 18:26:40 +08:00
|
|
|
debug("Management API returned status code " + req.status + " - <strong>" + fmt_escape_html_one_line(req.responseText) + "</strong>");
|
2011-03-16 19:11:13 +08:00
|
|
|
clearInterval(timer);
|
2010-08-24 01:32:33 +08:00
|
|
|
}
|
2010-09-08 23:27:34 +08:00
|
|
|
|
2011-03-16 19:11:13 +08:00
|
|
|
return false;
|
2010-08-24 01:32:33 +08:00
|
|
|
}
|
2010-07-13 20:03:36 +08:00
|
|
|
|
2010-08-25 01:46:30 +08:00
|
|
|
function fill_path_template(template, params) {
|
|
|
|
var re = /:[a-zA-Z_]*/g;
|
|
|
|
return template.replace(re, function(m) {
|
2010-10-15 01:09:36 +08:00
|
|
|
var str = esc(params[m.substring(1)]);
|
|
|
|
if (str == '') {
|
|
|
|
throw(m.substring(1) + " is required");
|
|
|
|
}
|
|
|
|
return str;
|
2010-08-25 01:46:30 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2010-12-09 01:40:10 +08:00
|
|
|
function params_magic(params) {
|
2014-09-11 23:27:39 +08:00
|
|
|
return check_password(maybe_remove_fields(collapse_multifields(params)));
|
2010-12-09 01:40:10 +08:00
|
|
|
}
|
|
|
|
|
2010-10-12 21:08:17 +08:00
|
|
|
function collapse_multifields(params0) {
|
2013-05-15 22:19:11 +08:00
|
|
|
function set(x) { return x != '' && x != undefined }
|
|
|
|
|
2010-10-12 21:08:17 +08:00
|
|
|
var params = {};
|
2013-05-14 20:30:43 +08:00
|
|
|
var ks = keys(params0);
|
|
|
|
var ids = [];
|
|
|
|
for (i in ks) {
|
|
|
|
var key = ks[i];
|
|
|
|
var match = key.match(/([a-z]*)_([0-9_]*)_mftype/);
|
|
|
|
var match2 = key.match(/[a-z]*_[0-9_]*_mfkey/);
|
|
|
|
var match3 = key.match(/[a-z]*_[0-9_]*_mfvalue/);
|
2012-06-07 22:25:44 +08:00
|
|
|
if (match == null && match2 == null && match3 == null) {
|
2010-10-12 21:08:17 +08:00
|
|
|
params[key] = params0[key];
|
|
|
|
}
|
|
|
|
else if (match == null) {
|
|
|
|
// Do nothing, value is handled below
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var name = match[1];
|
|
|
|
var id = match[2];
|
2013-05-14 20:30:43 +08:00
|
|
|
ids.push([name, id]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ids.sort();
|
|
|
|
var id_map = {};
|
|
|
|
for (i in ids) {
|
|
|
|
var name = ids[i][0];
|
|
|
|
var id = ids[i][1];
|
|
|
|
if (params[name] == undefined) {
|
|
|
|
params[name] = {};
|
|
|
|
id_map[name] = {};
|
|
|
|
}
|
|
|
|
var id_parts = id.split('_');
|
|
|
|
var k = params0[name + '_' + id_parts[0] + '_mfkey'];
|
|
|
|
var v = params0[name + '_' + id + '_mfvalue'];
|
|
|
|
var t = params0[name + '_' + id + '_mftype'];
|
2013-05-15 22:04:33 +08:00
|
|
|
var val = null;
|
2014-04-23 21:10:59 +08:00
|
|
|
var top_level = id_parts.length == 1;
|
2013-05-15 22:04:33 +08:00
|
|
|
if (t == 'list') {
|
|
|
|
val = [];
|
|
|
|
id_map[name][id] = val;
|
|
|
|
}
|
2014-04-23 21:10:59 +08:00
|
|
|
else if ((set(k) && top_level) || set(v)) {
|
2013-05-14 20:30:43 +08:00
|
|
|
if (t == 'boolean') {
|
|
|
|
if (v != 'true' && v != 'false')
|
|
|
|
throw(k + ' must be "true" or "false"; got ' + v);
|
|
|
|
val = (v == 'true');
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
2013-05-14 20:30:43 +08:00
|
|
|
else if (t == 'number') {
|
|
|
|
var n = parseFloat(v);
|
|
|
|
if (isNaN(n))
|
|
|
|
throw(k + ' must be a number; got ' + v);
|
|
|
|
val = n;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
val = v;
|
|
|
|
}
|
2013-05-15 22:04:33 +08:00
|
|
|
}
|
|
|
|
if (val != null) {
|
2014-04-23 21:10:59 +08:00
|
|
|
if (top_level) {
|
2013-05-14 20:30:43 +08:00
|
|
|
params[name][k] = val;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var prefix = id_parts.slice(0, id_parts.length - 1).join('_');
|
|
|
|
id_map[name][prefix].push(val);
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-16 21:30:02 +08:00
|
|
|
if (params.hasOwnProperty('queuetype')) {
|
|
|
|
delete params['queuetype'];
|
|
|
|
params['arguments']['x-queue-type'] = queue_type;
|
|
|
|
if (queue_type == 'quorum') {
|
|
|
|
params['durable'] = true;
|
|
|
|
params['auto_delete'] = false;
|
|
|
|
}
|
|
|
|
}
|
2010-10-12 21:08:17 +08:00
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
2011-03-09 02:43:14 +08:00
|
|
|
function check_password(params) {
|
|
|
|
if (params['password'] != undefined) {
|
2012-03-08 21:17:16 +08:00
|
|
|
if (params['password'] == '') {
|
|
|
|
throw("Please specify a password.");
|
|
|
|
}
|
2011-03-09 02:43:14 +08:00
|
|
|
if (params['password'] != params['password_confirm']) {
|
|
|
|
throw("Passwords do not match.");
|
|
|
|
}
|
|
|
|
delete params['password_confirm'];
|
|
|
|
}
|
|
|
|
|
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
2011-05-25 22:50:31 +08:00
|
|
|
function maybe_remove_fields(params) {
|
|
|
|
$('.controls-appearance').each(function(index) {
|
2013-11-22 23:32:44 +08:00
|
|
|
var options = $(this).get(0).options;
|
|
|
|
var selected = $(this).val();
|
|
|
|
|
|
|
|
for (i = 0; i < options.length; i++) {
|
|
|
|
var option = options[i].value;
|
|
|
|
if (option != selected) {
|
|
|
|
delete params[option];
|
|
|
|
}
|
2011-05-25 22:50:31 +08:00
|
|
|
}
|
2013-11-22 23:32:44 +08:00
|
|
|
delete params[$(this).attr('name')];
|
2011-05-25 22:50:31 +08:00
|
|
|
});
|
2010-12-09 01:40:10 +08:00
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
2013-02-02 01:31:16 +08:00
|
|
|
function put_parameter(sammy, mandatory_keys, num_keys, bool_keys,
|
|
|
|
arrayable_keys) {
|
2012-05-18 22:33:13 +08:00
|
|
|
for (var i in sammy.params) {
|
|
|
|
if (i === 'length' || !sammy.params.hasOwnProperty(i)) continue;
|
2012-11-20 23:51:50 +08:00
|
|
|
if (sammy.params[i] == '' && jQuery.inArray(i, mandatory_keys) == -1) {
|
2012-05-18 22:33:13 +08:00
|
|
|
delete sammy.params[i];
|
|
|
|
}
|
2012-11-20 23:51:50 +08:00
|
|
|
else if (jQuery.inArray(i, num_keys) != -1) {
|
2012-05-18 22:33:13 +08:00
|
|
|
sammy.params[i] = parseInt(sammy.params[i]);
|
|
|
|
}
|
2012-11-20 23:51:50 +08:00
|
|
|
else if (jQuery.inArray(i, bool_keys) != -1) {
|
2012-09-07 20:15:56 +08:00
|
|
|
sammy.params[i] = sammy.params[i] == 'true';
|
|
|
|
}
|
2013-02-02 01:31:16 +08:00
|
|
|
else if (jQuery.inArray(i, arrayable_keys) != -1) {
|
|
|
|
sammy.params[i] = sammy.params[i].split(' ');
|
|
|
|
if (sammy.params[i].length == 1) {
|
|
|
|
sammy.params[i] = sammy.params[i][0];
|
|
|
|
}
|
|
|
|
}
|
2012-05-18 22:33:13 +08:00
|
|
|
}
|
|
|
|
var params = {"component": sammy.params.component,
|
2012-08-08 00:39:09 +08:00
|
|
|
"vhost": sammy.params.vhost,
|
2012-10-22 22:07:50 +08:00
|
|
|
"name": sammy.params.name,
|
2012-05-18 22:33:13 +08:00
|
|
|
"value": params_magic(sammy.params)};
|
2012-08-08 00:39:09 +08:00
|
|
|
delete params.value.vhost;
|
2012-05-18 22:33:13 +08:00
|
|
|
delete params.value.component;
|
2012-10-22 22:07:50 +08:00
|
|
|
delete params.value.name;
|
2012-05-18 22:33:13 +08:00
|
|
|
sammy.params = params;
|
2012-10-22 22:07:50 +08:00
|
|
|
if (sync_put(sammy, '/parameters/:component/:vhost/:name')) update();
|
2012-05-18 22:33:13 +08:00
|
|
|
}
|
|
|
|
|
2016-10-03 20:06:16 +08:00
|
|
|
function put_cast_params(sammy, path, mandatory_keys, num_keys, bool_keys) {
|
2012-10-08 22:06:56 +08:00
|
|
|
for (var i in sammy.params) {
|
|
|
|
if (i === 'length' || !sammy.params.hasOwnProperty(i)) continue;
|
2012-11-20 23:51:50 +08:00
|
|
|
if (sammy.params[i] == '' && jQuery.inArray(i, mandatory_keys) == -1) {
|
2012-10-08 22:06:56 +08:00
|
|
|
delete sammy.params[i];
|
|
|
|
}
|
2012-11-20 23:51:50 +08:00
|
|
|
else if (jQuery.inArray(i, num_keys) != -1) {
|
2012-10-08 22:06:56 +08:00
|
|
|
sammy.params[i] = parseInt(sammy.params[i]);
|
|
|
|
}
|
2012-11-20 23:51:50 +08:00
|
|
|
else if (jQuery.inArray(i, bool_keys) != -1) {
|
2012-10-08 22:06:56 +08:00
|
|
|
sammy.params[i] = sammy.params[i] == 'true';
|
|
|
|
}
|
|
|
|
}
|
2016-10-03 20:06:16 +08:00
|
|
|
if (sync_put(sammy, path)) update();
|
2012-10-08 22:06:56 +08:00
|
|
|
}
|
2012-05-18 22:33:13 +08:00
|
|
|
|
2014-09-19 22:19:43 +08:00
|
|
|
function update_column_options(sammy) {
|
|
|
|
var mode = sammy.params['mode'];
|
|
|
|
for (var group in COLUMNS[mode]) {
|
|
|
|
var options = COLUMNS[mode][group];
|
|
|
|
for (var i = 0; i < options.length; i++) {
|
|
|
|
var key = options[i][0];
|
|
|
|
var value = sammy.params[mode + '-' + key] != undefined;
|
|
|
|
store_pref('column-' + mode + '-' + key, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
partial_update();
|
|
|
|
}
|
|
|
|
|
2010-07-13 20:03:36 +08:00
|
|
|
function debug(str) {
|
|
|
|
$('<p>' + str + '</p>').appendTo('#debug');
|
2010-09-02 19:58:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function keys(obj) {
|
|
|
|
var ks = [];
|
|
|
|
for (var k in obj) {
|
|
|
|
ks.push(k);
|
|
|
|
}
|
|
|
|
return ks;
|
2010-09-03 20:23:04 +08:00
|
|
|
}
|
|
|
|
|
2015-04-14 05:22:19 +08:00
|
|
|
// Don't use the jQuery AJAX support, it seems to have trouble reporting
|
2010-09-03 20:23:04 +08:00
|
|
|
// server-down type errors.
|
|
|
|
function xmlHttpRequest() {
|
|
|
|
var res;
|
|
|
|
try {
|
|
|
|
res = new XMLHttpRequest();
|
|
|
|
}
|
|
|
|
catch(e) {
|
|
|
|
res = new ActiveXObject("Microsoft.XMLHttp");
|
|
|
|
}
|
|
|
|
return res;
|
2010-09-09 01:00:32 +08:00
|
|
|
}
|
2010-10-16 01:11:42 +08:00
|
|
|
|
2012-11-07 19:39:57 +08:00
|
|
|
// Our base64 library takes a string that is really a byte sequence,
|
|
|
|
// and will throw if given a string with chars > 255 (and hence not
|
|
|
|
// DTRT for chars > 127). So encode a unicode string as a UTF-8
|
|
|
|
// sequence of "bytes".
|
|
|
|
function b64_encode_utf8(str) {
|
|
|
|
return base64.encode(encode_utf8(str));
|
|
|
|
}
|
|
|
|
|
|
|
|
// encodeURIComponent handles utf-8, unescape does not. Neat!
|
|
|
|
function encode_utf8(str) {
|
|
|
|
return unescape(encodeURIComponent(str));
|
|
|
|
}
|
|
|
|
|
2010-10-16 01:11:42 +08:00
|
|
|
(function($){
|
|
|
|
$.fn.extend({
|
|
|
|
center: function () {
|
|
|
|
return this.each(function() {
|
|
|
|
var top = ($(window).height() - $(this).outerHeight()) / 2;
|
|
|
|
var left = ($(window).width() - $(this).outerWidth()) / 2;
|
|
|
|
$(this).css({margin:0, top: (top > 0 ? top : 0)+'px', left: (left > 0 ? left : 0)+'px'});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
2012-10-08 22:06:56 +08:00
|
|
|
})(jQuery);
|
2013-04-08 21:00:06 +08:00
|
|
|
|
|
|
|
function debounce(f, delay) {
|
|
|
|
var timeout = null;
|
|
|
|
|
|
|
|
return function() {
|
|
|
|
var obj = this;
|
|
|
|
var args = arguments;
|
|
|
|
|
|
|
|
function delayed () {
|
|
|
|
f.apply(obj, args);
|
|
|
|
timeout = null;
|
|
|
|
}
|
|
|
|
if (timeout) clearTimeout(timeout);
|
|
|
|
timeout = setTimeout(delayed, delay);
|
|
|
|
}
|
|
|
|
}
|
2016-10-03 20:06:16 +08:00
|
|
|
|
|
|
|
function rename_multifield(params, from, to) {
|
|
|
|
var new_params = {};
|
|
|
|
for(var key in params){
|
|
|
|
var match = key.match("^" + from + "_[0-9_]*_mftype$");
|
|
|
|
var match2 = key.match("^" + from + "_[0-9_]*_mfkey$");
|
|
|
|
var match3 = key.match("^" + from + "_[0-9_]*_mfvalue$");
|
|
|
|
if (match != null) {
|
|
|
|
new_params[match[0].replace(from, to)] = params[match];
|
|
|
|
}
|
|
|
|
else if (match2 != null) {
|
|
|
|
new_params[match2[0].replace(from, to)] = params[match2];
|
|
|
|
}
|
|
|
|
else if (match3 != null) {
|
|
|
|
new_params[match3[0].replace(from, to)] = params[match3];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
new_params[key] = params[key]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new_params;
|
|
|
|
}
|
2018-07-16 21:30:02 +08:00
|
|
|
|
|
|
|
function select_queue_type(queuetype) {
|
|
|
|
queue_type = queuetype.value;
|
|
|
|
update();
|
|
|
|
}
|
2018-11-09 20:02:48 +08:00
|
|
|
|
|
|
|
function is_quorum(queue) {
|
|
|
|
return queue.hasOwnProperty('members');
|
|
|
|
}
|
|
|
|
|
|
|
|
function is_classic(queue) {
|
|
|
|
return (! queue.hasOwnProperty('members'));
|
|
|
|
}
|