implemented pending alerts list for event server
This commit is contained in:
parent
2a03a9ae2f
commit
7b9170312c
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
/**
|
||||
* Pending alerts list view.
|
||||
*
|
||||
* @category Pending alerts list
|
||||
* @package Pandora FMS
|
||||
* @subpackage Opensource
|
||||
* @version 1.0.0
|
||||
* @license See below
|
||||
*
|
||||
* ______ ___ _______ _______ ________
|
||||
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
|
||||
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
|
||||
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
|
||||
*
|
||||
* ============================================================================
|
||||
* Copyright (c) 2005-2023 Pandora FMS
|
||||
* Please see https://pandorafms.com/community/ for full contribution list
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation for version 2.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* ============================================================================
|
||||
*/
|
||||
|
||||
// Begin.
|
||||
global $config;
|
||||
|
||||
require_once $config['homedir'].'/include/class/AlertsList.class.php';
|
||||
|
||||
$ajaxPage = 'godmode/servers/pending_alerts_list';
|
||||
|
||||
// Control call flow.
|
||||
try {
|
||||
// User access and validation is being processed on class constructor.
|
||||
$adw = new AlertsList($ajaxPage);
|
||||
} catch (Exception $e) {
|
||||
if (is_ajax()) {
|
||||
echo json_encode(['error' => '[PendingAlertsList]'.$e->getMessage() ]);
|
||||
exit;
|
||||
} else {
|
||||
echo '[PendingAlertsList]'.$e->getMessage();
|
||||
}
|
||||
|
||||
// Stop this execution, but continue 'globally'.
|
||||
return;
|
||||
}
|
||||
|
||||
// AJAX controller.
|
||||
if (is_ajax()) {
|
||||
$method = get_parameter('method');
|
||||
|
||||
if (method_exists($adw, $method) === true) {
|
||||
if ($adw->ajaxMethod($method) === true) {
|
||||
$adw->{$method}();
|
||||
} else {
|
||||
$adw->error('Unavailable method.');
|
||||
}
|
||||
} else {
|
||||
$adw->error('Method not found. ['.$method.']');
|
||||
}
|
||||
|
||||
// Stop any execution.
|
||||
exit;
|
||||
} else {
|
||||
// Run.
|
||||
$adw->run();
|
||||
}
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
// Begin.
|
||||
require_once 'include/functions_clippy.php';
|
||||
require_once 'pending_alerts_list.php';
|
||||
|
||||
global $config;
|
||||
|
||||
|
@ -242,6 +243,19 @@ foreach ($servers as $server) {
|
|||
$data[8] .= '</a>';
|
||||
}
|
||||
|
||||
if ($server['type'] === 'event') {
|
||||
$data[8] .= '<a class="open-alerts-list-modal" href="">';
|
||||
$data[8] .= html_print_image(
|
||||
'images/alert@svg.svg',
|
||||
true,
|
||||
[
|
||||
'title' => __('Pending alerts list'),
|
||||
'class' => 'main_menu_icon invert_filter',
|
||||
]
|
||||
);
|
||||
$data[8] .= '</a>';
|
||||
}
|
||||
|
||||
$data[8] .= '<a href="'.ui_get_full_url('index.php?sec=gservers&sec2=godmode/servers/modificar_server&server='.$server['id_server']).'">';
|
||||
$data[8] .= html_print_image(
|
||||
'images/edit.svg',
|
||||
|
|
|
@ -0,0 +1,482 @@
|
|||
<?php
|
||||
/**
|
||||
* Pending lerts list class
|
||||
*
|
||||
* @category Class
|
||||
* @package Pandora FMS
|
||||
* @subpackage Alerts list
|
||||
* @version 1.0.0
|
||||
* @license See below
|
||||
*
|
||||
* ______ ___ _______ _______ ________
|
||||
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
|
||||
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
|
||||
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
|
||||
*
|
||||
* ============================================================================
|
||||
* Copyright (c) 2005-2023 Pandora FMS
|
||||
* Please see https://pandorafms.com/community/ for full contribution list
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation for version 2.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* ============================================================================
|
||||
*/
|
||||
|
||||
global $config;
|
||||
|
||||
/**
|
||||
* Provides functionality for pending alerts list.
|
||||
*/
|
||||
class AlertsList
|
||||
{
|
||||
|
||||
/**
|
||||
* Url of controller.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $ajaxController;
|
||||
|
||||
/**
|
||||
* References datatables object identifier.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $tableId;
|
||||
|
||||
/**
|
||||
* Allowed methods to be called using AJAX request.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $AJAXMethods = ['loadModal', 'drawTable'];
|
||||
|
||||
|
||||
/**
|
||||
* Checks if target method is available to be called using AJAX.
|
||||
*
|
||||
* @param string $method Target method.
|
||||
*
|
||||
* @return boolean True allowed, false not.
|
||||
*/
|
||||
public function ajaxMethod($method)
|
||||
{
|
||||
return in_array($method, $this->AJAXMethods);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates a JSON error.
|
||||
*
|
||||
* @param string $msg Error message.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function error($msg)
|
||||
{
|
||||
echo json_encode(
|
||||
['error' => $msg]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Minor function to dump json message as ajax response.
|
||||
*
|
||||
* @param string $type Type: result || error.
|
||||
* @param string $msg Message.
|
||||
* @param boolean $delete Deletion messages.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function ajaxMsg($type, $msg, $delete=false)
|
||||
{
|
||||
if ($type === 'error') {
|
||||
$msg_title = ($delete === true) ? 'Failed while removing' : 'Failed while saving';
|
||||
} else {
|
||||
$msg_title = ($delete === true) ? 'Successfully deleted' : 'Successfully saved into keystore';
|
||||
}
|
||||
|
||||
echo json_encode(
|
||||
[ $type => __($msg_title).':<br>'.$msg ]
|
||||
);
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initializes object and validates user access.
|
||||
*
|
||||
* @param string $ajax_controller Path of ajaxController, is the 'page'
|
||||
* variable sent in ajax calls.
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function __construct($ajax_controller)
|
||||
{
|
||||
global $config;
|
||||
|
||||
// Check access.
|
||||
check_login();
|
||||
|
||||
if ((bool) check_acl($config['id_user'], 0, 'AR') === false) {
|
||||
db_pandora_audit(
|
||||
AUDIT_LOG_ACL_VIOLATION,
|
||||
'Trying to access pending alerts list'
|
||||
);
|
||||
|
||||
if (is_ajax()) {
|
||||
echo json_encode(['error' => 'noaccess']);
|
||||
} else {
|
||||
include 'general/noaccess.php';
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
$this->ajaxController = $ajax_controller;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prints inputs for modal "Pending alerts list".
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function loadModal()
|
||||
{
|
||||
ob_start();
|
||||
echo '<div id="pending_alerts_modal">';
|
||||
echo $this->getModalContent();
|
||||
echo '</div>';
|
||||
echo ob_get_clean();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Run.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
global $config;
|
||||
|
||||
ui_require_css_file('tables');
|
||||
|
||||
if (check_acl($config['id_user'], 0, 'AR') === false) {
|
||||
db_pandora_audit(
|
||||
AUDIT_LOG_ACL_VIOLATION,
|
||||
'Trying to access pending alerts list.'
|
||||
);
|
||||
include 'general/noaccess.php';
|
||||
return;
|
||||
}
|
||||
|
||||
// Auxiliar div for modal.
|
||||
echo '<div id="alerts_list_modal" class="invisible"></div>';
|
||||
|
||||
echo $this->loadJS();
|
||||
}
|
||||
|
||||
|
||||
public function drawTable()
|
||||
{
|
||||
global $config;
|
||||
|
||||
$start = get_parameter('start', 0);
|
||||
$length = get_parameter('length', $config['block_size']);
|
||||
$order = get_datatable_order(true);
|
||||
|
||||
try {
|
||||
ob_start();
|
||||
|
||||
$order_by_clause = '';
|
||||
|
||||
if (in_array($order['field'], ['agentAlias', 'moduleName', 'alertType']) === false) {
|
||||
$order_by_clause = 'ORDER BY id '.$order['direction'];
|
||||
}
|
||||
|
||||
if ($length !== '-1') {
|
||||
$sql = sprintf(
|
||||
'SELECT *
|
||||
FROM talert_execution_queue %s
|
||||
LIMIT %d, %d',
|
||||
$order_by_clause,
|
||||
$start,
|
||||
$length
|
||||
);
|
||||
} else {
|
||||
$sql = sprintf(
|
||||
'SELECT * FROM talert_execution_queue %s',
|
||||
$order_by_clause
|
||||
);
|
||||
}
|
||||
|
||||
// Retrieve data and count.
|
||||
$data = db_get_all_rows_sql($sql);
|
||||
$count = (int) db_get_sql('SELECT COUNT(*) FROM talert_execution_queue');
|
||||
|
||||
if ($data) {
|
||||
$data = array_reduce(
|
||||
$data,
|
||||
function ($carry, $item) {
|
||||
// Check if the item is an array before proceeding.
|
||||
if (is_array($item) === true) {
|
||||
// Transforms array of arrays $data into an array
|
||||
// of objects, making a post-process of certain fields.
|
||||
$tmp = (object) $item;
|
||||
$decoded_data = base64_decode($tmp->data);
|
||||
$decoded_data = json_decode($decoded_data, true);
|
||||
|
||||
if (is_array($decoded_data) === true) {
|
||||
hd("&&&&&&&&&&&&&&&&&", true);
|
||||
hd($decoded_data[3]['type'], true);
|
||||
// Access the second element of $decoded_data (index 1) to get 'alias' and 'type'.
|
||||
$tmp->agentAlias = isset($decoded_data[1]['alias']) ? $decoded_data[1]['alias'] : null;
|
||||
$tmp->alertType = isset($decoded_data[3]['type']) ? $decoded_data[3]['type'] : null;
|
||||
// Access the third element of $decoded_data (index 2) to get 'nombre'.
|
||||
$tmp->moduleName = isset($decoded_data[2]['nombre']) ? $decoded_data[2]['nombre'] : null;
|
||||
|
||||
$carry[] = $tmp;
|
||||
}
|
||||
}
|
||||
|
||||
return $carry;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
echo json_encode(
|
||||
[
|
||||
'data' => $data,
|
||||
'recordsTotal' => $count,
|
||||
'recordsFiltered' => $count,
|
||||
]
|
||||
);
|
||||
|
||||
// Capture output.
|
||||
$response = ob_get_clean();
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// If not valid, show error with issue.
|
||||
json_decode($response);
|
||||
if (json_last_error() == JSON_ERROR_NONE) {
|
||||
// If valid dump.
|
||||
echo $response;
|
||||
} else {
|
||||
echo json_encode(
|
||||
['error' => $response]
|
||||
);
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates content of modal.
|
||||
*
|
||||
* @return string Modal content.
|
||||
*/
|
||||
public function getModalContent()
|
||||
{
|
||||
global $config;
|
||||
|
||||
ob_start();
|
||||
|
||||
try {
|
||||
$columns = [
|
||||
'id',
|
||||
'agentAlias',
|
||||
'moduleName',
|
||||
'alertType',
|
||||
];
|
||||
|
||||
$column_names = [
|
||||
__('ID'),
|
||||
__('Agent'),
|
||||
__('Module'),
|
||||
__('Type'),
|
||||
];
|
||||
|
||||
$this->tableId = 'pending_alerts';
|
||||
ui_print_datatable(
|
||||
[
|
||||
'id' => $this->tableId,
|
||||
'class' => 'info_table',
|
||||
'style' => 'width: 99%',
|
||||
'columns' => $columns,
|
||||
'column_names' => $column_names,
|
||||
'ajax_url' => $this->ajaxController,
|
||||
'default_pagination' => 7,
|
||||
'dom_elements' => 'pfti',
|
||||
'ajax_data' => ['method' => 'drawTable'],
|
||||
'no_sortable_columns' => [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
],
|
||||
'order' => [
|
||||
'field' => 'id',
|
||||
'direction' => 'asc',
|
||||
],
|
||||
]
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads JS content.
|
||||
*
|
||||
* @return string JS content.
|
||||
*/
|
||||
public function loadJS()
|
||||
{
|
||||
ob_start();
|
||||
|
||||
ui_require_javascript_file('stepper', 'include/javascript/', true);
|
||||
|
||||
// Javascript content.
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
/**
|
||||
* Cleanup current dom entries.
|
||||
*/
|
||||
function cleanupDOM() {
|
||||
$('#div-identifier').empty();
|
||||
$('#div-product').empty();
|
||||
$('#div-username').empty();
|
||||
$('#div-password').empty();
|
||||
$('#div-extra_1').empty();
|
||||
$('#div-extra_2').empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Process ajax responses and shows a dialog with results.
|
||||
*/
|
||||
function showMsg(data) {
|
||||
var title = "<?php echo __('Success'); ?>";
|
||||
var text = '';
|
||||
var failed = 0;
|
||||
try {
|
||||
data = JSON.parse(data);
|
||||
text = data['result'];
|
||||
} catch (err) {
|
||||
title = "<?php echo __('Failed'); ?>";
|
||||
text = err.message;
|
||||
failed = 1;
|
||||
}
|
||||
if (!failed && data['error'] != undefined) {
|
||||
title = "<?php echo __('Failed'); ?>";
|
||||
text = data['error'];
|
||||
failed = 1;
|
||||
}
|
||||
if (data['report'] != undefined) {
|
||||
data['report'].forEach(function (item){
|
||||
text += '<br>'+item;
|
||||
});
|
||||
}
|
||||
|
||||
$('#msg').empty();
|
||||
$('#msg').html(text);
|
||||
$('#msg').dialog({
|
||||
width: 450,
|
||||
position: {
|
||||
my: 'center',
|
||||
at: 'center',
|
||||
of: window,
|
||||
collision: 'fit'
|
||||
},
|
||||
title: title,
|
||||
buttons: [
|
||||
{
|
||||
class: "ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next",
|
||||
text: 'OK',
|
||||
click: function(e) {
|
||||
if (!failed) {
|
||||
$(".ui-dialog-content").dialog("close");
|
||||
$('.info').hide();
|
||||
cleanupDOM();
|
||||
dt_keystore.draw(false);
|
||||
} else {
|
||||
$(this).dialog('close');
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads modal from AJAX.
|
||||
*/
|
||||
function show_agent_install_modal() {
|
||||
var btn_close_text = '<?php echo __('Close'); ?>';
|
||||
var title = '<?php echo __('Alerts pending to be executed'); ?>';
|
||||
|
||||
load_modal({
|
||||
target: $('#alerts_list_modal'),
|
||||
form: 'modal_form',
|
||||
url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>',
|
||||
ajax_callback: showMsg,
|
||||
cleanup: cleanupDOM,
|
||||
modal: {
|
||||
title: title,
|
||||
cancel: btn_close_text,
|
||||
},
|
||||
extradata: [
|
||||
{
|
||||
name: 'identifier'
|
||||
}
|
||||
],
|
||||
onshow: {
|
||||
page: '<?php echo $this->ajaxController; ?>',
|
||||
method: 'loadModal'
|
||||
},
|
||||
onload: function() {
|
||||
$('#pending_alerts_paginate').css('margin-bottom','15px');
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
var page = 0;
|
||||
|
||||
$("#button-modal_pending_alerts").on('click', function() {
|
||||
show_agent_install_modal();
|
||||
});
|
||||
|
||||
const alertsListBtn = document.querySelectorAll('.open-alerts-list-modal');
|
||||
|
||||
alertsListBtn.forEach(link => {
|
||||
link.addEventListener('click', function (event) {
|
||||
event.preventDefault();
|
||||
show_agent_install_modal();
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
// EOF Javascript content.
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -866,3 +866,8 @@ td.w75p#rightcolumn {
|
|||
margin-right: 0%;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/* Workaround specifically for alert server pending alerts list */
|
||||
#pending_alerts_paginate {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue