/* 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();