pandorafms/pandora_console/godmode/reporting/graph_builder.php

488 lines
14 KiB
PHP

<?php
/**
* Combined graph
*
* @category Combined graph
* @package Pandora FMS
* @subpackage Community
* @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;
if (is_ajax()) {
$search_agents = (bool) get_parameter('search_agents');
if ($search_agents) {
include_once 'include/functions_agents.php';
$id_agent = (int) get_parameter('id_agent');
$string = (string) get_parameter('q');
// Q is what autocomplete plugin gives.
$id_group = (int) get_parameter('id_group');
$filter = [];
$filter[] = '(nombre LIKE "%'.$string.'%" OR direccion LIKE "%'.$string.'%" OR comentarios LIKE "%'.$string.'%")';
$filter['id_grupo'] = $id_group;
$agents = agents_get_agents($filter, ['nombre', 'direccion']);
if ($agents === false) {
return;
}
foreach ($agents as $agent) {
echo $agent['nombre'].'|'.$agent['direccion']."\n";
}
return;
}
return;
}
check_login();
if (! check_acl($config['id_user'], 0, 'RW')
&& ! check_acl($config['id_user'], 0, 'RM')
) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access graph builder'
);
include 'general/noaccess.php';
exit;
}
unset($name);
$add_module = (bool) get_parameter('add_module', false);
$delete_module = (bool) get_parameter('delete_module', false);
$edit_graph = (bool) get_parameter('edit_graph', false);
$active_tab = get_parameter('tab', 'main');
$add_graph = (bool) get_parameter('add_graph', false);
$update_graph = (bool) get_parameter('update_graph', false);
$change_weight = (bool) get_parameter('change_weight', false);
$change_label = (bool) get_parameter('change_label', false);
$id_graph = (int) get_parameter('id', 0);
if ($id_graph > 0) {
$graph_group = db_get_value('id_group', 'tgraph', 'id_graph', $id_graph);
if (!check_acl_restricted_all($config['id_user'], $graph_group, 'RW')
&& !check_acl_restricted_all($config['id_user'], $graph_group, 'RM')
) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access graph builder'
);
include 'general/noaccess.php';
exit;
}
}
if ($id_graph !== 0) {
$sql = "SELECT * FROM tgraph
WHERE (private = 0 OR (private = 1 AND id_user = '".$config['id_user']."'))
AND id_graph = ".$id_graph;
$control = db_process_sql($sql);
if (!$control) {
header('Location: index.php?sec=reporting&sec2=godmode/reporting/graphs');
}
}
if ($add_graph === true) {
$name = get_parameter_post('name');
$description = get_parameter_post('description');
$module_number = get_parameter_post('module_number');
$idGroup = get_parameter_post('graph_id_group');
$stacked = get_parameter('stacked', 0);
$period = get_parameter_post('period');
$threshold = get_parameter('threshold');
$percentil = get_parameter('percentil', 0);
$summatory_series = get_parameter('summatory_series', 0);
$average_series = get_parameter('average_series', 0);
$modules_series = get_parameter('modules_series', 0);
$fullscale = get_parameter('fullscale', 0);
if ($threshold == CUSTOM_GRAPH_BULLET_CHART_THRESHOLD) {
$stacked = $threshold;
}
// Create graph.
$values = [
'id_user' => $config['id_user'],
'name' => $name,
'description' => $description,
'period' => $period,
'private' => 0,
'id_group' => $idGroup,
'stacked' => $stacked,
'percentil' => $percentil,
'summatory_series' => $summatory_series,
'average_series' => $average_series,
'modules_series' => $modules_series,
'fullscale' => $fullscale,
];
if (trim($name) != '') {
$id_graph = db_process_sql_insert('tgraph', $values);
$auditMessage = ($id_graph !== false) ? sprintf('Create graph #%s', $id_graph) : 'Fail try to create graph';
db_pandora_audit(
AUDIT_LOG_REPORT_MANAGEMENT,
$auditMessage
);
} else {
$id_graph = false;
}
if (!$id_graph) {
$edit_graph = false;
}
}
if ($update_graph) {
$id_graph = get_parameter('id');
$name = get_parameter('name');
$id_group = get_parameter('graph_id_group');
$description = get_parameter('description');
$period = get_parameter('period');
$stacked = get_parameter('stacked');
$percentil = get_parameter('percentil');
$summatory_series = get_parameter('summatory_series');
$average_series = get_parameter('average_series');
$modules_series = get_parameter('modules_series');
$alerts = get_parameter('alerts');
$threshold = get_parameter('threshold');
$fullscale = get_parameter('fullscale');
if ($threshold == CUSTOM_GRAPH_BULLET_CHART_THRESHOLD) {
$stacked = $threshold;
}
if (empty(trim($name)) === false) {
$success = db_process_sql_update(
'tgraph',
[
'name' => $name,
'id_group' => $id_group,
'description' => $description,
'width' => $width,
'height' => $height,
'period' => $period,
'stacked' => $stacked,
'percentil' => $percentil,
'summatory_series' => $summatory_series,
'average_series' => $average_series,
'modules_series' => $modules_series,
'fullscale' => $fullscale,
],
['id_graph' => $id_graph]
);
$auditMessage = ($success !== false) ? 'Update graph' : 'Fail try to update graph';
db_pandora_audit(
AUDIT_LOG_REPORT_MANAGEMENT,
sprintf(
'%s #%s',
$auditMessage,
$id_graph
)
);
} else {
$success = false;
}
}
function add_quotes($item)
{
return "'$item'";
}
if ($add_module === true) {
$id_graph = get_parameter('id');
$id_modules = explode(',', get_parameter('id_modules'));
$id_agents = explode(',', get_parameter('id_agents'));
$weight = get_parameter('weight');
// Id modules has double entities conversion.
// Safe output remove all entities.
io_safe_output_array($id_modules, '');
$id_modules = array_map(
function ($mod) {
return io_safe_input($mod);
},
$id_modules
);
$sql = sprintf(
'SELECT id_agente_modulo
FROM tagente_modulo
WHERE id_agente IN (%s)
AND nombre IN ("%s")',
implode(',', $id_agents),
implode('","', $id_modules)
);
$id_agent_modules = db_get_all_rows_sql($sql);
if (is_array($id_agent_modules) === true && count($id_agent_modules) > 0 && $id_agent_modules != '') {
$sql_order = sprintf(
'SELECT `field_order`
FROM tgraph_source
WHERE id_graph=%d
ORDER BY `field_order` DESC',
$id_graph
);
$order = db_get_row_sql($sql_order);
$order = $order['field_order'];
foreach ($id_agent_modules as $id_agent_module) {
$order++;
$result = db_process_sql_insert(
'tgraph_source',
[
'id_graph' => $id_graph,
'id_agent_module' => $id_agent_module['id_agente_modulo'],
'weight' => $weight,
'field_order' => $order,
]
);
}
} else {
$result = false;
}
}
if ($delete_module === true) {
$id_graph = get_parameter('id');
$deleteGraph = get_parameter('delete');
$order_val = db_get_value('field_order', 'tgraph_source', 'id_gs', $deleteGraph);
$result = db_process_sql_delete('tgraph_source', ['id_gs' => $deleteGraph]);
db_process_sql('UPDATE tgraph_source SET field_order=field_order-1 WHERE id_graph='.$id_graph.' AND field_order>'.$order_val);
}
if ($change_weight === true) {
$weight = get_parameter('weight');
$id_gs = get_parameter('graph');
db_process_sql_update(
'tgraph_source',
['weight' => $weight],
['id_gs' => $id_gs]
);
}
if ($change_label) {
$label = get_parameter('label');
$id_gs = get_parameter('graph');
db_process_sql_update(
'tgraph_source',
['label' => $label],
['id_gs' => $id_gs]
);
}
if ($edit_graph === true) {
$buttons = [
'graph_list' => [
'active' => false,
'text' => '<a href="index.php?sec=reporting&sec2=godmode/reporting/graphs">'.html_print_image(
'images/logs@svg.svg',
true,
[
'title' => __('Graph list'),
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
'main' => [
'active' => false,
'text' => '<a href="index.php?sec=reporting&sec2=godmode/reporting/graph_builder&tab=main&edit_graph=1&id='.$id_graph.'">'.html_print_image(
'images/graph@svg.svg',
true,
[
'title' => __('Main data'),
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
'graph_editor' => [
'active' => false,
'text' => '<a href="index.php?sec=reporting&sec2=godmode/reporting/graph_builder&tab=graph_editor&edit_graph=1&id='.$id_graph.'">'.html_print_image(
'images/builder@svg.svg',
true,
[
'title' => __('Graph editor'),
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
'view' => [
'active' => false,
'text' => '<a href="index.php?sec=reporting&sec2=operation/reporting/graph_viewer&view_graph=1&id='.$id_graph.'">'.html_print_image(
'images/enable.svg',
true,
[
'title' => __('View graph'),
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
];
$buttons[$active_tab]['active'] = true;
$graphInTgraph = db_get_row_sql('SELECT name FROM tgraph WHERE id_graph = '.$id_graph);
$name = $graphInTgraph['name'];
} else {
$buttons = [];
}
$head = __('Graph builder');
if (isset($name) === true) {
$head .= ' &raquo; '.$name;
}
// Header.
$tab = get_parameter('tab');
switch ($tab) {
case 'graph_editor':
$headerHelp = '';
break;
case 'main':
default:
$headerHelp = 'graph_builder';
break;
}
// Header.
ui_print_standard_header(
$head,
'images/chart.png',
false,
$headerHelp,
false,
$buttons,
[
[
'link' => '',
'label' => __('Reporting'),
],
[
'link' => '',
'label' => __('Custom graphs'),
],
]
);
if ($add_graph) {
ui_print_result_message(
$id_graph,
__('Graph stored successfully'),
__('There was a problem storing Graph')
);
}
if ($add_module) {
ui_print_result_message(
$result,
__('Module added successfully'),
__('There was a problem adding Module')
);
}
if ($update_graph) {
ui_print_result_message(
$success,
__('Update the graph'),
__('Bad update the graph')
);
}
if ($delete_module) {
ui_print_result_message(
$result,
__('Graph deleted successfully'),
__('There was a problem deleting Graph')
);
}
// Parse CHUNK information into showable information.
// Split id to get all parameters.
if ($delete_module === false) {
if (isset($_POST['period']) === true) {
$period = $_POST['period'];
}
if ((isset($chunkdata) === true) && (empty($chunkdata) === false)) {
$module_array = [];
$weight_array = [];
$agent_array = [];
$chunk1 = [];
$chunk1 = explode('|', $chunkdata);
$modules = '';
$weights = '';
$chunkCount = count($chunk1);
for ($a = 0; $a < $chunkCount; $a++) {
$chunk2[$a] = [];
$chunk2[$a] = explode(',', $chunk1[$a]);
if (strpos($modules, $chunk2[$a][1]) == 0) {
// Skip dupes
$module_array[] = $chunk2[$a][1];
$agent_array[] = $chunk2[$a][0];
$weight_array[] = $chunk2[$a][2];
if ($modules != '') {
$modules = $modules.','.$chunk2[$a][1];
} else {
$modules = $chunk2[$a][1];
}
if ($weights != '') {
$weights = $weights.','.$chunk2[$a][2];
} else {
$weights = $chunk2[$a][2];
}
}
}
}
}
switch ($active_tab) {
case 'main':
include_once 'godmode/reporting/graph_builder.main.php';
break;
case 'graph_editor':
include_once 'godmode/reporting/graph_builder.graph_editor.php';
break;
default:
// Nothing to do.
break;
}