EVOLUTION-MANAGER
Edit File: datatable.js.template
/* * (C) 2021-23 - ntop.org * Base template for the alert tables. */ const FAMILY = "{{ entity }}" $table.on('click', `a[href='#check_info']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); const href = "{* alert_details_url *}?page={* entity *}&status={* alert_status *}&row_id=" + alert.row_id + "&tstamp=" + alert.tstamp.value; window.open(href, "_blank"); }); $table.on('click', `a[href='#check_snmp_info']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); const href = "/lua/pro/enterprise/snmp_device_details.lua?host="+alert.ip; window.open(href, "_blank"); }); $table.on('click', `a[href='#check_settings']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); const check_settings_href = $(alert.msg.configset_ref).attr('href'); window.location.href = check_settings_href; }); $table.on('click', `a[href='#flow_alerts']`, function (e) { /* Create and redirect to the flow alerts filtered by alert timestamps and alert ip */ /* Prepare URL params */ const alert = $table.row($(this).parent().parent().parent().parent()).data(); const alert_tstamp = alert.tstamp.value; const duration = alert.duration; const [epoch_begin, epoch_end] = [alert_tstamp - 300 /* Look a bit before than the timestamp */, alert_tstamp + duration]; const alert_ip = alert.ip.value + "{{ require("tag_utils").SEPARATOR }}eq"; const flow_alerts_url = new URL(location); const flow_search_params = {epoch_begin: epoch_begin, epoch_end: epoch_end, page: "flow"}; /* For server alerts, we redirect to the flow alerts having this IP as server. For client alert, the redirection is done on the client. */ if(alert.is_server) { flow_search_params["srv_ip"] = alert_ip; } else { /* Client alert or unkown cli/srv role */ flow_search_params["cli_ip"] = alert_ip; } if(alert.vlan_id && alert.vlan_id != "") { flow_search_params["vlan_id"] = alert.vlan_id + "{{ require("tag_utils").SEPARATOR }}eq"; } flow_alerts_url.search = new URLSearchParams(flow_search_params); window.location.href = flow_alerts_url.href; }); $table.on('click', `a[href='#past_flows']`, function (e) { /* Create and redirect to the past alerts filtered */ const alert = $table.row($(this).parent().parent().parent().parent()).data(); if(alert.link_to_past_flows) window.location.href = alert.link_to_past_flows; else window.location.href = `${http_prefix}/lua/pro/db_search.lua`; }); $table.on('click', `a[href='#delete_alert_dialog']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); $deleteAlertModal.invokeModalInit(alert); }); const $deleteAlertModal = $('#delete_alert_dialog form').modalHandler({ method: 'post', csrf: pageCsrf, endpoint: `${http_prefix}{* datatable.endpoint_delete *}`, beforeSumbit: function (alert) { return { ifid: "{{ ifid }}", row_id: alert.row_id, status: "{{ alert_status }}"}; }, onModalInit: function (alert) { $(`#delete_alert_dialog button[type='submit']`).removeAttr("disabled"); }, onSubmitSuccess: function (response) { if (response.rc < 0) { $('#delete_alert_dialog .invalid-feedback').html(i18n_ext.rest[response.rc_str]).show(); } else { ntopng_status_manager.update_subscribers(); } return (response.rc == 0); } }); $(`#dt-btn-acknowledge`).on('click', function (e) { $acknowledgeFilteredAlerts.invokeModalInit(); }); const $acknowledgeFilteredAlerts = $('#dt-acknowledge-modal form').modalHandler({ method: 'post', csrf: pageCsrf, endpoint: `${http_prefix}{* datatable.endpoint_acknowledge *}`, beforeSumbit: function (alert) { let post_params = formatFilteredParams() /* Read the label from the corresponding form field */ post_params["label"] = $("#dt-acknowledge-modal #alert-label-modal").val(); return post_params; }, onModalInit: function () { $(`#dt-acknowledge-modal button[type='submit']`).removeAttr("disabled"); $('#dt-acknowledge-modal .filters-list').empty(); let datasourceParams = ntopng_status_manager.get_status(); const tags = datasourceParams.filters const beginEpoch = moment(parseInt(datasourceParams["epoch_begin"]), 'X').format("DD/MM/YYYY HH:mm:ss"); const endEpoch = moment(parseInt(datasourceParams["epoch_end"]), 'X').format("DD/MM/YYYY HH:mm:ss"); const sortedTags = tags.sort((a, b) => { return i18n_ext.tags[a.id].localeCompare(i18n_ext.tags[b.id]) }); $('#dt-acknowledge-modal #end-epoch-acknowledge').val(endEpoch); $('#dt-acknowledge-modal #begin-epoch-acknowledge').val(beginEpoch); for (const tag of sortedTags) { const { id, operator, value } = tag; const label = i18n_ext.tags[key] const child = $('<div class="form-group row"><div class="col-sm-6"><label class="col-form-label"><b>'+label+'</b></label></div><div class="col-sm-6 mt-1"><input class="form-control" type="text" value="'+value+'" disabled/></div></div>'); $('#dt-acknowledge-modal .filters-list').append(child); } }, onSubmitSuccess: function (response) { ntopng_status_manager.update_subscribers(); return (response.rc == 0); } }); const $deleteFilteredAlerts = $('#dt-delete-modal form').modalHandler({ method: 'post', csrf: pageCsrf, endpoint: `${http_prefix}{* datatable.endpoint_delete *}`, beforeSumbit: function (alert) { return formatFilteredParams() }, onModalInit: function () { $('#dt-delete-modal .filters-list').empty(); let datasourceParams = ntopng_status_manager.get_status(); const tags = datasourceParams.filters const beginEpoch = moment(parseInt(datasourceParams["epoch_begin"]), 'X').format("DD/MM/YYYY HH:mm:ss"); const endEpoch = moment(parseInt(datasourceParams["epoch_end"]), 'X').format("DD/MM/YYYY HH:mm:ss"); const sortedTags = tags.sort((a, b) => { return i18n_ext.tags[a.id].localeCompare(i18n_ext.tags[b.id]) }); $('#dt-delete-modal #end-epoch-delete').val(endEpoch); $('#dt-delete-modal #begin-epoch-delete').val(beginEpoch); for (const tag of sortedTags) { const { id, operator, value } = tag; const label = i18n_ext.tags[id] const child = $('<div class="form-group row"><div class="col-sm-6"><label class="col-form-label"><b>'+label+'</b></label></div><div class="col-sm-6 mt-1"><input class="form-control" type="text" value="'+value+'" disabled/></div></div>'); $('#dt-delete-modal .filters-list').append(child); } $('#dt-delete-modal #dt-btn-delete').prop('disabled', false); }, onSubmitSuccess: function (response) { ntopng_status_manager.update_subscribers(); return (response.rc == 0); } }); $(`#dt-btn-delete`).on('click', function (e) { $deleteFilteredAlerts.invokeModalInit(); }); // $table.on('click', `a[href='#alerts_filter_dialog']`, function (e) { // const alert = $table.row($(this).parent().parent().parent().parent()).data(); // $disableAlert.invokeModalInit(alert); // }); // const $disableAlert = $('#alerts_filter_dialog form').modalHandler({ // method: 'post', // csrf: pageCsrf, // endpoint: `${http_prefix}/lua/pro/rest/v2/add/alert/exclusion.lua`, // beforeSumbit: function (alert) { // let data = { // subdir: FAMILY, // script_key: alert.script_key, // delete_alerts: $(`#delete_alerts_switch`).is(":checked"), // alert_addr: $(`[name='alert_addr']:checked`).val(), // }; // if(FAMILY === "flow") // data["flow_alert_key"] = alert.alert_id.value; // else if(FAMILY === "host") // data["host_alert_key"] = alert.alert_id.value; // return data; // }, // onModalInit: function (alert) { // const $type = $(`<span>${alert.alert_id.label}</span>`); // $(`#alerts_filter_dialog .alert_label`).text($type.text().trim()); // if (FAMILY === "host") { // const label = (alert.ip.label) ? `${alert.ip.label} (${alert.ip.value})` : alert.ip.value; // $(`#srv_addr`).text(label); // $(`#srv_radio`).val(alert.ip.value); // $(`#cli_radio`).parent().hide(); // } // else if (FAMILY === "flow") { // let cliValue = alert.flow.cli_ip.value // let srvValue = alert.flow.srv_ip.value // if((alert.flow.vlan != undefined) && (alert.flow.vlan.value != 0)) { // cliValue = cliValue + '@' + alert.flow.vlan.value // srvValue = srvValue + '@' + alert.flow.vlan.value // } // const cliLabel = (alert.flow.cli_ip.label) ? `${alert.flow.cli_ip.label} (${cliValue})` : cliValue; // const srvLabel = (alert.flow.srv_ip.label) ? `${alert.flow.srv_ip.label} (${srvValue})` : srvValue; // $(`#cli_addr`).text(cliLabel); // $(`#cli_radio`).val(cliValue); // $(`#srv_addr`).text(srvLabel); // $(`#srv_radio`).val(srvValue); // } // else { // $(`.alert_entity_val`).text("Unexpected alert family") // } // }, // onSubmitSuccess: function (response, dataSent) { // if (response.rc < 0) { // $('#alerts_filter_dialog .invalid-feedback').html(i18n_ext.rest[response.rc_str] || response.rc_str).show(); // } // else { // if (dataSent.delete_alerts) { // //location.reload(); // } // else { // ntopng_status_manager.update_subscribers(); // } // } // return (response.rc == 0); // } // }); $table.on('click', `a[href='#acknowledge_alert_dialog']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); $acknowledgeAlert.invokeModalInit(alert); }); const $acknowledgeAlert = $('#acknowledge_alert_dialog form').modalHandler({ method: 'post', csrf: pageCsrf, endpoint: `${http_prefix}{* datatable.endpoint_acknowledge *}`, beforeSumbit: function (alert) { return { ifid: "{{ ifid }}", row_id: alert.row_id, label: $(`#acknowledge_alert_dialog #alert-label`).val()}; }, onModalInit: function (alert) { $(`#acknowledge_alert_dialog button[type='submit']`).removeAttr("disabled"); const $type = $(`<span>${alert.alert_id.label}</span>`); $(`#acknowledge_alert_dialog .alert_label`).text($type.text().trim()); $(`#acknowledge_alert_dialog #alert-label`).val(alert.user_label); }, onSubmitSuccess: function (response, dataSent) { if (response.rc < 0) { $('#acknowledge_alert_dialog .invalid-feedback').html(i18n_ext.rest[response.rc_str] || response.rc_str).show(); } else { if (dataSent.delete_alerts) { location.reload(); } else { ntopng_status_manager.update_subscribers(); } } return (response.rc == 0); } }); /** * Release Button Handler $table.on('click', `a[href='#release_single_alert']`, function (e) { const alert = $table.row($(this).parent().parent().parent().parent()).data(); }); const $releaseAlertModal = $('#release_single_alert form').modalHandler({ method: 'post', csrf: pageCsrf, endpoint: `${http_prefix}/lua/rest/v2/release/{{ entity }}/alerts.lua`, beforeSumbit: function (alert) { return { ifid: "{{ ifid }}", row_id: alert.row_id }; }, onModalInit: function (alert) { $(`#release_single_alert button[type='submit']`).removeAttr("disabled"); }, onSubmitSuccess: function (response) { if (response.rc < 0) { $('#release_single_alert .invalid-feedback').html(i18n_ext.rest[response.rc_str]).show(); } else { onRangePickerChange(false); } return (response.rc == 0); } });*/ function formatFilteredParams() { const currentUrl = new URLSearchParams(window.location.search); let datasourceParams = ntopng_status_manager.get_status(); let params = {} /* Cycling the filters */ for (const tag of datasourceParams.filters) { params[tag.id] = tag.value } /* Cycling other params not in filters, e.g. Epoch Begin-End */ for (const item in datasourceParams) { if(typeof datasourceParams[item] !== 'object') params[item] = datasourceParams[item] } params['ifid'] = currentUrl.get('ifid'); return params; }