343 lines
11 KiB
JavaScript
343 lines
11 KiB
JavaScript
/* global logConfigFileLocation, SockJS, Stomp */
|
|
var stompClient = null;
|
|
|
|
function setConnected(connected) {
|
|
|
|
var el = document.getElementById('websocketStatus');
|
|
el.style.visibility = connected ? 'visible' : 'hidden';
|
|
el.class = connected ? 'alert alert-info' : 'alert alert-danger';
|
|
|
|
if (!connected) {
|
|
el.innerHTML = 'Disconnected!';
|
|
} else {
|
|
el.innerHTML = 'Connected to CAS. Streaming and tailing logs based on <kbd>[' + logConfigFileLocation + ']</kbd>...';
|
|
}
|
|
}
|
|
|
|
function connect() {
|
|
$('#logoutputarea').empty();
|
|
var socket = new SockJS(urls.reportsWebsocket);
|
|
stompClient = Stomp.over(socket);
|
|
stompClient.connect({}, function () {
|
|
setConnected(true);
|
|
stompClient.subscribe('/topic/logs', function (msg) {
|
|
if (msg != null && msg.body != '') {
|
|
showLogs(msg.body);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function disconnect() {
|
|
$('#logoutputarea').empty();
|
|
$('#logoutputarea').attr('readonly', 'readonly');
|
|
|
|
if (stompClient != null) {
|
|
stompClient.disconnect();
|
|
}
|
|
setConnected(false);
|
|
}
|
|
|
|
function showLogs(message) {
|
|
if (message != '') {
|
|
$('#logoutputarea').val($('#logoutputarea').val() + '\n' + message);
|
|
$('#logoutputarea').scrollTop(document.getElementById('logoutputarea').scrollHeight);
|
|
}
|
|
}
|
|
|
|
disconnect();
|
|
connect();
|
|
setInterval(function () {
|
|
}, 100);
|
|
|
|
/*************
|
|
*
|
|
***************/
|
|
$('#myTabs a').click(function (e) {
|
|
e.preventDefault();
|
|
$(this).tab('show');
|
|
});
|
|
|
|
var alertHandler = (function () {
|
|
var alertContainer = $('#alert-container');
|
|
var create = function (message, state) {
|
|
//console.log('create the alert');
|
|
alertContainer.html('<div class="alert alert-' + state + ' alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><span>' + message + '</span></div>');
|
|
|
|
alertContainer.delay(2000).fadeOut('slow');
|
|
};
|
|
|
|
var destroy = function () {
|
|
alertContainer.empty();
|
|
};
|
|
|
|
return {
|
|
dismiss: function () {
|
|
destroy();
|
|
},
|
|
show: function (msg, state) {
|
|
create(msg, state);
|
|
}
|
|
};
|
|
})();
|
|
|
|
var loggingDashboard = (function () {
|
|
var json = null;
|
|
|
|
var logLevels = ['trace', 'debug', 'info', 'warn', 'error'];
|
|
|
|
var getData = function () {
|
|
$.getJSON(urls.getConfiguration, function (data) {
|
|
json = data;
|
|
loggerTable();
|
|
});
|
|
};
|
|
|
|
var getAuditData = function () {
|
|
$.getJSON(urls.getAuditLog, function (data) {
|
|
if ($(data).length > 0) {
|
|
loggerTableAudit(data);
|
|
} else {
|
|
$('#auditLogTable').DataTable();
|
|
}
|
|
});
|
|
};
|
|
|
|
var loggerTableAudit = function (jsonData) {
|
|
var t = $('#auditLogTable').DataTable({
|
|
'autoWidth': false,
|
|
'order': [[3, 'desc']],
|
|
retrieve: true,
|
|
columnDefs: [
|
|
|
|
{'width': '5%', 'targets': 0},
|
|
{'width': '100%', 'targets': 1},
|
|
{
|
|
'targets': 2,
|
|
render: function (data) {
|
|
var dd = data.toLowerCase();
|
|
if (dd.indexOf('created') != -1) {
|
|
return '<span class="glyphicon glyphicon-plus" aria-hidden="true"> </span>' + data;
|
|
}
|
|
if (dd.indexOf('validated') != -1) {
|
|
return '<span class="glyphicon glyphicon-ok" aria-hidden="true"> </span>' + data;
|
|
}
|
|
if (dd.indexOf('destroyed') != -1 || dd.indexOf('deleted') != -1) {
|
|
return '<span class="glyphicon glyphicon-minus" aria-hidden="true"> </span>' + data;
|
|
}
|
|
|
|
if (dd.indexOf('success') != -1) {
|
|
return '<span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"> </span>' + data;
|
|
}
|
|
if (dd.indexOf('failed') != -1) {
|
|
return '<span class="glyphicon glyphicon-thumbs-down" aria-hidden="true"> </span>' + data;
|
|
}
|
|
|
|
return data;
|
|
}
|
|
}
|
|
]
|
|
});
|
|
for (var i = 0; i < jsonData.length; i++) {
|
|
var rec = jsonData[i];
|
|
t.row.add([
|
|
rec.principal,
|
|
rec.resourceOperatedUpon,
|
|
rec.actionPerformed,
|
|
new Date(rec.whenActionWasPerformed),
|
|
rec.clientIpAddress,
|
|
rec.serverIpAddress
|
|
]).draw(false);
|
|
}
|
|
};
|
|
|
|
var loggerTable = function () {
|
|
$('#loggersTable').DataTable({
|
|
'autoWidth': false,
|
|
'order': [[1, 'desc']],
|
|
data: json.loggers,
|
|
'drawCallback': function () {
|
|
var api = this.api();
|
|
|
|
if (api.page.info().pages > 1) {
|
|
$('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = 'block';
|
|
} else {
|
|
$('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = 'none';
|
|
}
|
|
},
|
|
'initComplete': function (settings) {
|
|
if (!settings.aoData || settings.aoData.length == 0) {
|
|
$('#loadingMessage').addClass('d-none');
|
|
$('#errorLoadingData').removeClass('d-none');
|
|
} else {
|
|
$('#loadingMessage').addClass('d-none');
|
|
$('#errorLoadingData').addClass('d-none');
|
|
$('#loggingDashboard .tabsContainer').removeClass('d-none');
|
|
}
|
|
},
|
|
'processing': true,
|
|
columnDefs: [
|
|
{
|
|
'targets': 0,
|
|
'className': 'details-control',
|
|
'orderable': false,
|
|
'data': 'appenders',
|
|
'defaultContent': '',
|
|
render: function (data) {
|
|
if (data.length > 0) {
|
|
return '<span></span>';
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
},
|
|
{
|
|
targets: 1,
|
|
data: 'name',
|
|
className: 'col-xs-5'
|
|
},
|
|
{
|
|
targets: 2,
|
|
data: 'additive',
|
|
className: 'additive col-xs-2',
|
|
render: function (data) {
|
|
if (data) {
|
|
return '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>';
|
|
} else {
|
|
return '<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>';
|
|
|
|
}
|
|
}
|
|
},
|
|
{
|
|
targets: 3,
|
|
data: 'state',
|
|
className: 'col-xs-2'
|
|
},
|
|
{
|
|
targets: 4,
|
|
data: 'level',
|
|
className: 'col-xs-3',
|
|
render: function (data, type, full, meta) {
|
|
return toggleSwitch(data, type, full, meta);
|
|
}
|
|
}
|
|
]
|
|
});
|
|
};
|
|
|
|
var toggleSwitch = function (data, type, full) {
|
|
// Todo: Add additional colors for the other options
|
|
//console.log('toggleSwitch data',data);
|
|
//console.log('type',type);
|
|
//console.log('full',full);
|
|
//console.log('meta',meta);
|
|
//console.log(logLevels);
|
|
var btnColor;
|
|
|
|
switch (data.toLowerCase()) {
|
|
case 'error':
|
|
btnColor = 'danger';
|
|
break;
|
|
case 'info':
|
|
btnColor = 'info';
|
|
break;
|
|
case 'warn':
|
|
btnColor = 'warning';
|
|
break;
|
|
default:
|
|
btnColor = 'default';
|
|
}
|
|
var btnGroup = '<div class="dropdown" data-logger="' + full + '"><button class="btn btn-sm btn-block bg-' + btnColor + ' dropdown-toggle" name="recordinput" data-toggle="dropdown">' + data + ' <span class="caret"></span></button>' +
|
|
'<div class="dropdown-menu">';
|
|
for (var i = 0; i < logLevels.length; i++) {
|
|
btnGroup += '<a class="dropdown-item" href="#">' + logLevels[i].toUpperCase() + '</a>';
|
|
}
|
|
btnGroup += '</div>';
|
|
|
|
return btnGroup;
|
|
};
|
|
|
|
/* Formatting function for row details - modify as you need */
|
|
var viewAppenders = function (data) {
|
|
return '<table class="table table-bordered row-detail"><tbody><tr class="">' +
|
|
'<td class="field-label active">Appenders:</td>' +
|
|
'<td><kbd>' + JSON.stringify(data.appenders, null, 2) + '</kbd></td>' +
|
|
'</tr>' +
|
|
'</tbody></table>';
|
|
};
|
|
|
|
var addEventHandlers = function () {
|
|
//console.log('addEventHAndlers()');
|
|
|
|
$(document).on('click', '#loggersTable .dropdown-menu a', function (e) {
|
|
//console.log('status change', this);
|
|
e.preventDefault();
|
|
var selText = $(this).text();
|
|
|
|
changeLogLevel(selText, this);
|
|
});
|
|
|
|
$(document).on('click', '#loggersTable tbody td.details-control span', function () {
|
|
var table = $('#loggersTable').DataTable();
|
|
var tr = $(this).closest('tr');
|
|
var row = table.row(tr);
|
|
|
|
if (row.child.isShown()) {
|
|
// This row is already open - close it
|
|
row.child.hide();
|
|
tr.removeClass('shown');
|
|
} else {
|
|
// Open this row
|
|
row.child(viewAppenders(row.data()), 'info').show();
|
|
tr.addClass('shown');
|
|
}
|
|
});
|
|
};
|
|
|
|
var changeLogLevel = function (newLevel, el) {
|
|
/**
|
|
* POST - /cas/status/logging/updateLoggerLevel
|
|
* Allows you to change the log level for given LOGGER. Parameters are:
|
|
* loggerName, loggerLevel, additive (true/false)
|
|
*/
|
|
var table = $('#loggersTable').DataTable();
|
|
var data = table.row($(el).closest('tr')[0]).data();
|
|
|
|
if (newLevel != data.level) {
|
|
var cell = table.cell($(el).closest('td')[0]);
|
|
|
|
$.post(urls.updateLevel, {
|
|
loggerName: data.name,
|
|
loggerLevel: newLevel,
|
|
additive: data.additive
|
|
}, function () {
|
|
cell.data(newLevel).draw();
|
|
alertHandler.show('Successfully changed.', 'success');
|
|
}).fail(function () {
|
|
alertHandler.show('Error saving change. Please try again', 'danger');
|
|
});
|
|
}
|
|
};
|
|
|
|
// initialization *******
|
|
(function init() {
|
|
})();
|
|
|
|
return {
|
|
init: function () {
|
|
getData();
|
|
addEventHandlers();
|
|
getAuditData();
|
|
},
|
|
getJson: function () {
|
|
return json;
|
|
},
|
|
showLoggersTable: function () {
|
|
loggerTable();
|
|
}
|
|
};
|
|
})();
|
|
|
|
loggingDashboard.init();
|