Newer
Older
cas-server / cas / WEB-INF / classes / static / js / loggingDashboard.js
zhout on 17 Jun 2021 11 KB first commit
/* 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">&times;</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">&nbsp;</span>' + data;
                        }
                        if (dd.indexOf('validated') != -1) {
                            return '<span class="glyphicon glyphicon-ok" aria-hidden="true">&nbsp;</span>' + data;
                        }
                        if (dd.indexOf('destroyed') != -1 || dd.indexOf('deleted') != -1) {
                            return '<span class="glyphicon glyphicon-minus" aria-hidden="true">&nbsp;</span>' + data;
                        }

                        if (dd.indexOf('success') != -1) {
                            return '<span class="glyphicon glyphicon-thumbs-up" aria-hidden="true">&nbsp;</span>' + data;
                        }
                        if (dd.indexOf('failed') != -1) {
                            return '<span class="glyphicon glyphicon-thumbs-down" aria-hidden="true">&nbsp;</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();