Files
cacti/aggregate_items.php
T
Mark Brugnoli-Vinten 51ee26ce1a Resolving issue #1689 (#1779)
* Resolving issue #1689

As noted in issue #1689 (Technical Support's RRDTool version should show
detected RRD version) the version of the RRDTool is never actually displayed.
The code has now been updated to properly handle versioning and displays both
the configured and installed versions.

The setting for rrdtool_version has been updated to a proper minimum version
number so that the cacti_version_compare() function may be effectively used.
This means that the constant values of RRDTOOL_VERSION_1_3 through
RRDTOOL_VERSION_7 have now been removed from the system.

* Some QA updates

* Further QA fixes
2018-08-02 18:01:25 -05:00

440 lines
18 KiB
PHP

<?php
/*
+-------------------------------------------------------------------------+
| Copyright (C) 2004-2018 The Cacti Group |
| |
| 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; either version 2 |
| of the License, or (at your option) any later version. |
| |
| 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. |
+-------------------------------------------------------------------------+
| Cacti: The Complete RRDtool-based Graphing Solution |
+-------------------------------------------------------------------------+
| This code is designed, written, and maintained by the Cacti Group. See |
| about.php and/or the AUTHORS file for specific developer information. |
+-------------------------------------------------------------------------+
| http://www.cacti.net/ |
+-------------------------------------------------------------------------+
*/
include('./include/auth.php');
include_once('./lib/utility.php');
include_once('./lib/api_aggregate.php');
/* set default action */
set_default_action();
switch (get_request_var('action')) {
case 'save':
form_save();
break;
case 'item_remove':
item_remove();
header('Location: aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id'));
break;
case 'item_edit':
top_header();
item_edit();
bottom_footer();
break;
case 'item_movedown':
item_movedown();
header('Location: aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id'));
break;
case 'item_moveup':
item_moveup();
header('Location: aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id'));
break;
}
/* --------------------------
The Save Function
-------------------------- */
function form_save() {
global $config;
if (isset_request_var('save_component_item')) {
global $graph_item_types;
$items[0] = array();
// handle saving aggregate graph items in separate function
if (get_request_var('aggregate_template_id') > 0 || get_request_var('aggregate_graph_id') > 0) {
form_save_aggregate();
}
if ($graph_item_types{get_request_var('graph_type_id')} == 'LEGEND') {
/* this can be a major time saver when creating lots of graphs with the typical
GPRINT LAST/AVERAGE/MAX legends */
$items = array(
0 => array(
'color_id' => '0',
'graph_type_id' => '9',
'consolidation_function_id' => '4',
'text_format' => 'Current:',
'hard_return' => ''
),
1 => array(
'color_id' => '0',
'graph_type_id' => '9',
'consolidation_function_id' => '1',
'text_format' => 'Average:',
'hard_return' => ''
),
2 => array(
'color_id' => '0',
'graph_type_id' => '9',
'consolidation_function_id' => '3',
'text_format' => 'Maximum:',
'hard_return' => 'on'
));
}
foreach ($items as $item) {
/* generate a new sequence if needed */
if (isempty_request_var('sequence')) {
set_request_var('sequence', get_sequence(get_request_var('sequence'), 'sequence', 'graph_templates_item', 'local_graph_id=' . get_request_var('local_graph_id')));
}
$save['id'] = get_filter_request_var('graph_template_item_id');
$save['graph_template_id'] = get_filter_request_var('graph_template_id');
$save['local_graph_template_item_id'] = get_filter_request_var('local_graph_template_item_id');
$save['local_graph_id'] = get_filter_request_var('local_graph_id');
$save['task_item_id'] = form_input_validate(get_filter_request_var('task_item_id'), 'task_item_id', '', true, 3);
$save['color_id'] = form_input_validate((isset($item['color_id']) ? $item['color_id'] : get_filter_request_var('color_id')), 'color_id', '', true, 3);
/* if alpha is disabled, use invisible_alpha instead */
if (!isset_request_var('alpha')) {
set_request_var('alpha', get_nfilter_request_var('invisible_alpha'));
}
$save['alpha'] = form_input_validate((isset($item['alpha']) ? $item['alpha'] : get_nfilter_request_var('alpha')), 'alpha', '', true, 3);
$save['graph_type_id'] = form_input_validate((isset($item['graph_type_id']) ? $item['graph_type_id'] : get_filter_request_var('graph_type_id')), 'graph_type_id', '', true, 3);
$save['cdef_id'] = form_input_validate(get_filter_request_var('cdef_id'), 'cdef_id', '', true, 3);
$save['consolidation_function_id'] = form_input_validate((isset($item['consolidation_function_id']) ? $item['consolidation_function_id'] : get_filter_request_var('consolidation_function_id')), 'consolidation_function_id', '', true, 3);
$save['text_format'] = form_input_validate((isset($item['text_format']) ? $item['text_format'] : get_nfilter_request_var('text_format')), 'text_format', '', true, 3);
$save['value'] = form_input_validate(get_nfilter_request_var('value'), 'value', '', true, 3);
$save['hard_return'] = form_input_validate(((isset($item['hard_return']) ? $item['hard_return'] : (isset_request_var('hard_return') ? get_nfilter_request_var('hard_return') : ''))), 'hard_return', '', true, 3);
$save['gprint_id'] = form_input_validate(get_filter_request_var('gprint_id'), 'gprint_id', '', true, 3);
$save['sequence'] = get_filter_request_var('sequence');
if (!is_error_message()) {
$graph_template_item_id = sql_save($save, 'graph_templates_item');
if ($graph_template_item_id) {
raise_message(1);
} else {
raise_message(2);
}
}
set_request_var('sequence', 0);
}
if (is_error_message()) {
header('Location: ' . $config['url_path'] . 'aggregate_items.php?action=item_edit&graph_template_item_id=' . (empty($graph_template_item_id) ? get_filter_request_var('graph_template_item_id') : $graph_template_item_id) . '&id=' . get_filter_request_var('local_graph_id'));
exit;
} else {
header('Location: ' . $config['url_path'] . 'aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id'));
exit;
}
}
}
/* -----------------------
save aggregate graph item
This saves any overrides to item properties from graph template item.
Inserting new items here is not possible. Just editing existing ones.
----------------------- */
function form_save_aggregate() {
global $config;
if (!isset_request_var('save_component_item')) {
return;
}
// two possible tables to save to - aggregate template or aggregate graph
// with different key column combination
$save_to = 'aggregate_graph_templates_item';
$key_cols = array('aggregate_template_id', 'graph_templates_item_id');
$location_success = 'aggregate_templates.php?action=edit&id=' . get_filter_request_var('aggregate_template_id');
$location_failure = 'aggregate_items.php?action=item_edit&aggregate_template_id=' . get_filter_request_var('aggregate_template_id') . '&id=' . get_filter_request_var('graph_template_item_id');
if (get_filter_request_var('aggregate_graph_id') > 0) {
$save_to = 'aggregate_graphs_graph_item';
$key_cols = array('aggregate_graph_id', 'graph_templates_item_id');
$location_success = 'aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id');
$location_failure = 'aggregate_items.php?action=item_edit&aggregate_graph_id=' . get_filter_request_var('aggregate_graph_id') . '&id=' . get_filter_request_var('graph_template_item_id');
}
// only some properties can be saved here
$save = array();
$save['t_graph_type_id'] = form_input_validate((isset_request_var('t_graph_type_id') ? get_nfilter_request_var('t_graph_type_id') : ''), 't_graph_type_id', '', true, 3);
$save['graph_type_id'] = form_input_validate((($save['t_graph_type_id']) ? get_filter_request_var('graph_type_id') : 0), 'graph_type_id', '', true, 3);
$save['t_cdef_id'] = form_input_validate((isset_request_var('t_cdef_id') ? get_nfilter_request_var('t_cdef_id') : ''), 't_cdef_id', '', true, 3);
$save['cdef_id'] = form_input_validate((($save['t_cdef_id']) ? get_filter_request_var('cdef_id') : 0), 'cdef_id', '', true, 3);
if (!is_error_message()) {
// sql_save will not give usefull return values when row key is
// composed from multiple columns. need to manualy build query
$sql_set = 'SET ';
foreach ($save as $key => $value) {
$sql_set .= $key . "=" . db_qstr($value) . ", ";
}
$sql_set = substr($sql_set, 0, -2);
$sql_where = 'graph_templates_item_id = ' . get_filter_request_var('graph_template_item_id') . ' AND ';
if ($save_to == 'aggregate_graph_templates_item') {
$sql_where .= 'aggregate_template_id=' . get_filter_request_var('aggregate_template_id');
} else {
$sql_where .= 'aggregate_graph_id=' . get_filter_request_var('aggregate_graph_id');
}
$sql = "UPDATE $save_to $sql_set WHERE $sql_where LIMIT 1";
$success = db_execute($sql);
if ($success) {
raise_message(1);
} else {
raise_message(2);
}
// update existing graphs with the changest to this item
if ($save_to == 'aggregate_graphs_graph_item')
push_out_aggregates(0, get_filter_request_var('local_graph_id'));
elseif ($save_to == 'aggregate_graph_templates_item')
push_out_aggregates(get_filter_request_var('aggregate_template_id'));
}
if (is_error_message()) {
header('Location: ' . $config['url_path'] . $location_failure);
exit;
} else {
header('Location: ' . $config['url_path'] . $location_success);
exit;
}
}
/* -----------------------
item - Graph Items
----------------------- */
function item_movedown() {
global $graph_item_types;
/* ================= input validation ================= */
get_filter_request_var('id');
get_filter_request_var('local_graph_id');
/* ==================================================== */
$arr = get_graph_group(get_request_var('id'));
$next_id = get_graph_parent(get_request_var('id'), 'next');
if ((!empty($next_id)) && (isset($arr{get_request_var('id')}))) {
move_graph_group(get_request_var('id'), $arr, $next_id, 'next');
} elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types{db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))})) {
move_item_down('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id'));
}
}
function item_moveup() {
global $graph_item_types;
/* ================= input validation ================= */
get_filter_request_var('id');
get_filter_request_var('local_graph_id');
/* ==================================================== */
$arr = get_graph_group(get_request_var('id'));
$previous_id = get_graph_parent(get_request_var('id'), 'previous');
if ((!empty($previous_id)) && (isset($arr{get_request_var('id')}))) {
move_graph_group(get_request_var('id'), $arr, $previous_id, 'previous');
} elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types{db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))})) {
move_item_up('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id'));
}
}
function item_remove() {
/* ================= input validation ================= */
get_filter_request_var('id');
/* ==================================================== */
db_execute_prepared('DELETE FROM graph_templates_item WHERE id = ?', array(get_request_var('id')));
}
function item_edit() {
global $config, $struct_graph_item, $graph_item_types, $consolidation_functions;
/* ================= input validation ================= */
get_filter_request_var('id');
get_filter_request_var('local_graph_id');
get_filter_request_var('aggregate_graph_id');
get_filter_request_var('aggregate_template_id');
/* ==================================================== */
/* remember these search fields in session vars so we don't have to keep passing them around */
load_current_session_value('local_graph_id', 'sess_local_graph_id', '');
$id = (!isempty_request_var('id') ? '&id=' . get_request_var('id') : '');
/* this editor can work on aggregate template graph item or aggregate item */
if (!isempty_request_var('aggregate_graph_id')) {
$id_field = 'aggregate_graph_id';
$table_name = 'aggregate_graphs_graph_item';
$page_name = 'aggregate_graphs.php';
} elseif (!isempty_request_var('aggregate_template_id')) {
$id_field = 'aggregate_template_id';
$table_name = 'aggregate_graph_templates_item';
$page_name = 'aggregate_templates.php';
}else {
/* TODO redirect somewhere and show an error message, rather than die */
die("We should have redirected somewhere but we ended up here instead" . PHP_EOL);
}
if (!isempty_request_var('id')) {
$template_item = db_fetch_row_prepared('SELECT *
FROM graph_templates_item
WHERE id = ?',
array(get_request_var('id')));
}
/* override some template_item values from aggregate tables */
$item_overrides = db_fetch_row_prepared("SELECT *
FROM $table_name
WHERE $id_field = ?
AND graph_templates_item_id = ?",
array(get_request_var($id_field), get_request_var("id")));
if (sizeof($item_overrides) == 0) {
/* this item is not currently in aggregate tables
* item editor will not work in this case, so let's
* save it now
*/
$item_new = array(
$id_field => get_request_var($id_field),
'graph_templates_item_id' => get_request_var("id"),
'sequence' => $template_item['sequence']
);
aggregate_graph_items_save(array($item_new), $table_name);
$item_overrides = db_fetch_row_prepared("SELECT *
FROM $table_name
WHERE $id_field = ?
AND graph_templates_item_id = ?",
array(get_request_var($id_field), get_request_var("id")));
}
foreach (array_keys($template_item) as $field_name) {
if (!array_key_exists($field_name, $item_overrides))
continue;
# t_<field_name> coulmn in aggregate table must be "on" to override
if (array_key_exists("t_".$field_name, $item_overrides) && $item_overrides["t_".$field_name] == "on")
$template_item[$field_name] = $item_overrides[$field_name];
}
html_start_box(__('Override Values for Graph Item'), '100%', true, '3', 'center', '');
$form_array = array();
foreach ($struct_graph_item as $field_name => $field_array) {
$form_array += array($field_name => $struct_graph_item[$field_name]);
/* should we draw an override checkbox */
if (array_key_exists('t_' . $field_name, $item_overrides)) {
$form_array[$field_name]['sub_checkbox'] = array(
'name' => 't_' . $field_name,
'friendly_name' => __esc('Override this Value') . '<br>',
'value' => ($item_overrides['t_'.$field_name] == 'on' ? 'on' : ''),
'on_change' => 'toggleFieldEnabled(this);'
);
}
$form_array[$field_name]['value'] = (isset($template_item) ? $template_item[$field_name] : '');
$form_array[$field_name]['form_id'] = (isset($template_item) ? $template_item['id'] : '0');
}
draw_edit_form(
array(
'config' => array(
'post_to' => $config['url_path'] . 'aggregate_items.php'
),
'fields' => $form_array
)
);
form_hidden_box('local_graph_id', get_request_var('local_graph_id'), '0');
form_hidden_box('graph_template_item_id', (isset($template_item) ? $template_item['id'] : '0'), '');
form_hidden_box('local_graph_template_item_id', (isset($template_item) ? $template_item['local_graph_template_item_id'] : '0'), '');
form_hidden_box('graph_template_id', (isset($template_item) ? $template_item['graph_template_id'] : '0'), '');
form_hidden_box('sequence', (isset($template_item) ? $template_item['sequence'] : '0'), '');
form_hidden_box('_graph_type_id', (isset($template_item) ? $template_item['graph_type_id'] : '0'), '');
form_hidden_box('save_component_item', '1', '');
form_hidden_box('invisible_alpha', $form_array['alpha']['value'], 'FF');
form_hidden_box('rrdtool_version', get_rrdtool_version(), '');
form_hidden_box('aggregate_graph_id', get_request_var('aggregate_graph_id'), '0');
form_hidden_box('aggregate_template_id', get_request_var('aggregate_template_id'), '0');
html_end_box(true, true);
form_save_button($config['url_path'] . "$page_name?action=edit&id=" . get_request_var('local_graph_id'));
//Now we need some javascript to make it dynamic
?>
<script type='text/javascript'>
$(function() {
dynamic();
setFieldsDisabled();
});
function dynamic() {
$('#alpha').prop('disabled', true);
if ($('#color_id').val() != 0) {
$('#alpha').prop('disabled', true);
}
}
function changeColorId() {
if ($('#color_id').attr('selectedIndex') != 0) {
$('#alpha').prop('disabled', true);
}
}
// disable all items except those explicitly overriden
function setFieldsDisabled() {
$('tr[id*="row_"]').each(function() {
fieldName = this.id.substr(4);
cbName = 't_'+fieldName;
if ($('#'+cbName).size() > 0) {
$('#'+fieldName).prop('disabled', !$('#'+cbName).is(':checked'));
} else {
$('#'+fieldName).prop('disabled', true);
}
});
}
// enable or disable form field based on state of corresponding checkbox
function toggleFieldEnabled(cb) {
prefix = 't_';
if (cb.name.substr(0,prefix.length) == prefix) {
fieldName = cb.name.substr(prefix.length);
$('#'+fieldName).prop('disabled', !cb.checked);
}
}
</script>
<?php
}