__('Delete'), ); if ((get_nfilter_request_var('template_id') != '' && get_nfilter_request_var('template_id') != '-1' && get_nfilter_request_var('template_id') != '0') || get_nfilter_request_var('drp_action') == 2) { $graph_actions += array( 2 => __('Change Graph Template'), ); } $graph_actions += array( 5 => __('Change Device'), 6 => __('Reapply Suggested Names'), 11 => __('Place Graphs on Report'), 9 => __('Create Aggregate Graph'), 10 => __('Create Aggregate from Template'), 8 => __('Apply Automation Rules') ); if (read_config_option('grds_creation_method') == 1) { $graph_actions += array( 3 => __('Duplicate'), 4 => __('Convert to Graph Template') ); } $graph_actions = api_plugin_hook_function('graphs_action_array', $graph_actions); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item': top_header(); item(); bottom_footer(); break; case 'ajax_graph_items': get_ajax_graph_items(); break; case 'ajax_hosts': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(true, 'applyFilter', $sql_where); break; case 'ajax_hosts_noany': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(false, 'applyFilter', $sql_where); break; case 'ajax_graph_items': $sql_where = ''; if (!isempty_request_var('host_id')) { $sql_where .= ($sql_where != '' ? ' AND ' : '') . 'dl.host_id=' . get_filter_request_var('host_id'); } if (!isempty_request_var('data_template_id')) { $sql_where .= ($sql_where != '' ? ' AND ' : '') . 'dtd.data_template_id=' . get_filter_request_var('data_template_id'); } get_allowed_ajax_graph_items(true, $sql_where); break; case 'item_remove': get_filter_request_var('local_graph_id'); item_remove(); header('Location: graphs.php?action=graph_edit&id=' . get_request_var('local_graph_id')); break; case 'item_edit': top_header(); item_edit(); bottom_footer(); break; case 'item_movedown': get_filter_request_var('local_graph_id'); item_movedown(); header('Location: graphs.php?action=graph_edit&id=' . get_request_var('local_graph_id')); break; case 'item_moveup': get_filter_request_var('local_graph_id'); item_moveup(); header('Location: graphs.php?action=graph_edit&id=' . get_request_var('local_graph_id')); break; case 'lock': case 'unlock': $_SESSION['sess_graph_lock_id'] = get_filter_request_var('id'); $_SESSION['sess_graph_locked'] = (get_request_var('action') == 'lock' ? true:false); case 'graph_edit': top_header(); graph_edit(); bottom_footer(); break; default: top_header(); validate_graph_request_vars(); graphs(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ function get_ajax_graph_items() { $rrd_id = get_filter_request_var('rrd_id'); $host_id = get_filter_request_var('host_id'); if ($host_id > 0) { $sql_where = ' AND data_local.host_id=' . $host_id; } else { $sql_where = ''; } if (get_request_var('term') != '') { $sql_where .= ' HAVING name LIKE "%' . trim(db_qstr(get_request_var('term')),"'") . '%"'; } $items = db_fetch_assoc_prepared("SELECT * FROM (SELECT data_template_rrd.id AS id, CONCAT_WS('', CASE WHEN host.description IS NULL THEN '" . __esc('No Device - ') . "' WHEN host.description IS NOT NULL THEN '' END, data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') AS name FROM (data_template_data,data_template_rrd,data_local) LEFT JOIN host ON (data_local.host_id=host.id) WHERE data_template_rrd.local_data_id=data_local.id AND data_template_data.local_data_id=data_local.id AND data_template_rrd.id = ? ) AS a UNION SELECT * FROM (SELECT data_template_rrd.id AS id, CONCAT_WS('', CASE WHEN host.description IS NULL THEN '" . __esc('No Device - ') . "' WHEN host.description IS NOT NULL THEN '' END, data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') AS name FROM (data_template_data,data_template_rrd,data_local) LEFT JOIN host ON (data_local.host_id=host.id) WHERE data_template_rrd.local_data_id=data_local.id AND data_template_data.local_data_id=data_local.id $sql_where ORDER BY name ) AS b LIMIT " . read_config_option('autocomplete_rows'), array($rrd_id)); foreach ($items as $key => $item) { $items[$key]['label'] = $item['name']; } print json_encode($items); } function add_tree_names_to_actions_array() { global $graph_actions; /* add a list of tree names to the actions dropdown */ $trees = db_fetch_assoc('SELECT id, name FROM graph_tree ORDER BY name'); if (cacti_sizeof($trees)) { foreach ($trees as $tree) { $graph_actions['tr_' . $tree['id']] = __esc('Place on a Tree (%s)', $tree['name']); } } } /* -------------------------- The Save Function -------------------------- */ function parse_validate_graph_template_id($variable) { $output_type_id = 0; if (strpos(get_nfilter_request_var($variable), '_') !== false) { $template_parts = explode('_', get_nfilter_request_var($variable)); if (is_numeric($template_parts[0]) && is_numeric($template_parts[1])) { set_request_var('graph_template_id', $template_parts[0]); $output_type_id = $template_parts[1]; } else { cacti_log('ERROR: Unable to parse graph_template_id with value ' . get_nfilter_request_var($variable), false, 'WEBUI'); exit; } } else { get_filter_request_var($variable); } return $output_type_id; } function form_save() { if (isset_request_var('save_component_graph_new') || isset_request_var('save_component_graph') || isset_request_var('save_component_input')) { /* ================= input validation ================= */ get_filter_request_var('local_graph_id'); get_filter_request_var('host_id_prev'); get_filter_request_var('graph_template_graph_id'); get_filter_request_var('local_graph_template_graph_id'); /* ==================================================== */ /* handle special case of callback on host_id */ if (!is_numeric(get_nfilter_request_var('host_id'))) { set_request_var('host_id', get_request_var('host_id_prev')); } else { get_filter_request_var('host_id'); } $gt_id_unparsed = get_nfilter_request_var('graph_template_id'); $gt_id_prev_unparsed = get_nfilter_request_var('graph_template_id_prev'); parse_validate_graph_template_id('graph_template_id'); if (isset_request_var('save_component_graph_new') && !isempty_request_var('graph_template_id')) { $snmp_query_array = array(); $suggested_values = array(); $graph_template_id = get_request_var('graph_template_id'); $host_id = get_request_var('host_id'); $return_array = create_complete_graph_from_template($graph_template_id, $host_id, $snmp_query_array, $suggested_values); if ($return_array !== false) { debug_log_insert('new_graphs', __esc('Created graph: %s', get_graph_title($return_array['local_graph_id']))); /* lastly push host-specific information to our data sources */ if (cacti_sizeof($return_array['local_data_id'])) { # we expect at least one data source associated foreach ($return_array['local_data_id'] as $item) { push_out_host($host_id, $item); } } else { debug_log_insert('new_graphs', __esc('ERROR: No Data Source associated. Check Template')); } } if (isset($return_array['local_graph_id'])) { $local_graph_id = $return_array['local_graph_id']; header('Location: graphs.php?action=graph_edit&id=' . $local_graph_id); } else { header('Location: graphs.php'); } exit; } if (isset_request_var('save_component_graph')) { if (get_filter_request_var('host_id') == '-1') { set_request_var('host_id', '0'); } $save1['id'] = get_nfilter_request_var('local_graph_id'); $save1['host_id'] = get_request_var('host_id'); $save1['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save2['id'] = get_nfilter_request_var('graph_template_graph_id'); $save2['local_graph_template_graph_id'] = get_nfilter_request_var('local_graph_template_graph_id'); $save2['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save2['image_format_id'] = form_input_validate(get_nfilter_request_var('image_format_id'), 'image_format_id', '^[0-9]+$', true, 3); $save2['title'] = form_input_validate(get_nfilter_request_var('title'), 'title', '', false, 3); $save2['height'] = form_input_validate(get_nfilter_request_var('height'), 'height', '^[0-9]+$', false, 3); $save2['width'] = form_input_validate(get_nfilter_request_var('width'), 'width', '^[0-9]+$', false, 3); $save2['upper_limit'] = form_input_validate(get_nfilter_request_var('upper_limit'), 'upper_limit', "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$", ((strlen(get_nfilter_request_var('upper_limit')) === 0) ? true : false), 3); $save2['lower_limit'] = form_input_validate(get_nfilter_request_var('lower_limit'), 'lower_limit', "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$", ((strlen(get_nfilter_request_var('lower_limit')) === 0) ? true : false), 3); $save2['vertical_label'] = form_input_validate(get_nfilter_request_var('vertical_label'), 'vertical_label', '', true, 3); $save2['slope_mode'] = form_input_validate((isset_request_var('slope_mode') ? get_nfilter_request_var('slope_mode') : ''), 'slope_mode', '', true, 3); $save2['auto_scale'] = form_input_validate((isset_request_var('auto_scale') ? get_nfilter_request_var('auto_scale') : ''), 'auto_scale', '', true, 3); $save2['auto_scale_opts'] = form_input_validate(get_nfilter_request_var('auto_scale_opts'), 'auto_scale_opts', '', true, 3); $save2['auto_scale_log'] = form_input_validate((isset_request_var('auto_scale_log') ? get_nfilter_request_var('auto_scale_log') : ''), 'auto_scale_log', '', true, 3); $save2['scale_log_units'] = form_input_validate((isset_request_var('scale_log_units') ? get_nfilter_request_var('scale_log_units') : ''), 'scale_log_units', '', true, 3); $save2['auto_scale_rigid'] = form_input_validate((isset_request_var('auto_scale_rigid') ? get_nfilter_request_var('auto_scale_rigid') : ''), 'auto_scale_rigid', '', true, 3); $save2['auto_padding'] = form_input_validate((isset_request_var('auto_padding') ? get_nfilter_request_var('auto_padding') : ''), 'auto_padding', '', true, 3); $save2['base_value'] = form_input_validate(get_nfilter_request_var('base_value'), 'base_value', '^[0-9]+$', false, 3); $save2['unit_value'] = form_input_validate(get_nfilter_request_var('unit_value'), 'unit_value', '', true, 3); $save2['unit_exponent_value'] = form_input_validate(get_nfilter_request_var('unit_exponent_value'), 'unit_exponent_value', '^-?[0-9]+$', true, 3); $save2['alt_y_grid'] = form_input_validate((isset_request_var('alt_y_grid') ? get_nfilter_request_var('alt_y_grid') : ''), 'alt_y_grid', '', true, 3); $save2['right_axis'] = form_input_validate((isset_request_var('right_axis') ? get_nfilter_request_var('right_axis') : ''), 'right_axis', '^-?([0-9]+(\.[0-9]*)?|\.[0-9]+):-?([0-9]+(\.[0-9]*)?|\.[0-9]+)$', true, 3); $save2['right_axis_label'] = form_input_validate((isset_request_var('right_axis_label') ? get_nfilter_request_var('right_axis_label') : ''), 'right_axis_label', '', true, 3); $save2['right_axis_format'] = form_input_validate((isset_request_var('right_axis_format') ? get_nfilter_request_var('right_axis_format') : ''), 'right_axis_format', '^[0-9]+$', true, 3); $save2['no_gridfit'] = form_input_validate((isset_request_var('no_gridfit') ? get_nfilter_request_var('no_gridfit') : ''), 'no_gridfit', '', true, 3); $save2['unit_length'] = form_input_validate((isset_request_var('unit_length') ? get_nfilter_request_var('unit_length') : ''), 'unit_length', '^[0-9]+$', true, 3); $save2['tab_width'] = form_input_validate((isset_request_var('tab_width') ? get_nfilter_request_var('tab_width') : ''), 'tab_width', '^[0-9]*$', true, 3); $save2['dynamic_labels'] = form_input_validate((isset_request_var('dynamic_labels') ? get_nfilter_request_var('dynamic_labels') : ''), 'dynamic_labels', '', true, 3); $save2['force_rules_legend'] = form_input_validate((isset_request_var('force_rules_legend') ? get_nfilter_request_var('force_rules_legend') : ''), 'force_rules_legend', '', true, 3); $save2['legend_position'] = form_input_validate((isset_request_var('legend_position') ? get_nfilter_request_var('legend_position') : ''), 'legend_position', '', true, 3); $save2['legend_direction'] = form_input_validate((isset_request_var('legend_direction') ? get_nfilter_request_var('legend_direction') : ''), 'legend_direction', '', true, 3); $save2['right_axis_formatter'] = form_input_validate((isset_request_var('right_axis_formatter') ? get_nfilter_request_var('right_axis_formatter') : ''), 'right_axis_formatter', '', true, 3); $save2['left_axis_format'] = form_input_validate((isset_request_var('left_axis_format') ? get_nfilter_request_var('left_axis_format') : ''), 'left_axis_format', '^[0-9]+$', true, 3); $save2['left_axis_formatter'] = form_input_validate((isset_request_var('left_axis_formatter') ? get_nfilter_request_var('left_axis_formatter') : ''), 'left_axis_formatter', '', true, 3); if (!is_error_message()) { $local_graph_id = sql_save($save1, 'graph_local'); /** * Save the last time a graph was created/updated * for Caching. */ set_config_option('time_last_change_graph', time()); } if (!is_error_message()) { $save2['local_graph_id'] = $local_graph_id; $graph_templates_graph_id = sql_save($save2, 'graph_templates_graph'); if ($graph_templates_graph_id) { raise_message(1); } else { raise_message(2); } /* update the title cache */ update_graph_title_cache($local_graph_id); /* if the host id changes, then update the graph items association too */ if (get_request_var('host_id') != get_request_var('host_id_prev')) { if (!api_graph_change_device($local_graph_id, get_request_var('host_id'))) { raise_message(34); } } } if (!is_error_message()) { $lg_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array($local_graph_id) ); if ($lg_template_id > 0) { change_graph_template($local_graph_id, $gt_id_unparsed, true); $lg_dq_id = db_fetch_cell_prepared('SELECT snmp_query_id FROM graph_local WHERE id = ?', array($local_graph_id) ); if ($lg_dq_id > 0) { update_graph_data_query_cache($local_graph_id); } } } } if (isset_request_var('save_component_input')) { /* ================= input validation ================= */ get_filter_request_var('local_graph_id'); /* ==================================================== */ /* first; get the current graph template id */ $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_nfilter_request_var('local_graph_id'))); /* get all inputs that go along with this graph template, if templated */ if ($graph_template_id > 0) { $input_list = db_fetch_assoc_prepared('SELECT id, column_name FROM graph_template_input WHERE graph_template_id = ?', array($graph_template_id)); if (cacti_sizeof($input_list)) { foreach ($input_list as $input) { /* we need to find out which graph items will be affected by saving this particular item */ $item_list = db_fetch_assoc_prepared('SELECT gti.id FROM graph_template_input_defs AS gtid INNER JOIN graph_templates_item AS gti ON gtid.graph_template_item_id=gti.local_graph_template_item_id WHERE gti.local_graph_id = ? AND gtid.graph_template_input_id = ?', array(get_nfilter_request_var('local_graph_id'), $input['id'])); /* loop through each item affected and update column data */ if (cacti_sizeof($item_list)) { foreach ($item_list as $item) { /* if we are changing templates, the POST vars we are searching for here will not exist. this is because the db and form are out of sync here, but it is ok to just skip over saving the inputs in this case. */ if (isset_request_var($input['column_name'] . '_' . $input['id'])) { db_execute_prepared('UPDATE graph_templates_item SET ' . $input['column_name'] . ' = ? WHERE id = ?', array(get_nfilter_request_var($input['column_name'] . '_' . $input['id']), $item['id'])); } } } } } } } } elseif (isset_request_var('save_component_item')) { global $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('sequence'); get_filter_request_var('graph_type_id'); get_filter_request_var('local_graph_id'); get_filter_request_var('graph_template_item_id'); get_filter_request_var('graph_template_id'); get_filter_request_var('local_graph_template_item_id'); /* ==================================================== */ $items[0] = array(); if ($graph_item_types[get_nfilter_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' => 'Cur:', 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => 'Avg:', 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => 'Max:', 'hard_return' => 'on' ) ); } elseif ($graph_item_types[get_nfilter_request_var('graph_type_id')] == 'LEGEND_CAMM') { /* 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' => __('Cur:'), 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => __('Avg:'), 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '2', 'text_format' => __('Min:'), 'hard_return' => '' ), 3 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => __('Max:'), 'hard_return' => 'on' ) ); } $sequence = get_nfilter_request_var('sequence'); foreach ($items as $item) { /* generate a new sequence if needed */ if (empty($sequence)) { $sequence = get_sequence($sequence, 'sequence', 'graph_templates_item', 'local_graph_id=' . get_nfilter_request_var('local_graph_id')); } $save['id'] = get_nfilter_request_var('graph_template_item_id'); $save['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save['local_graph_template_item_id'] = get_nfilter_request_var('local_graph_template_item_id'); $save['local_graph_id'] = get_nfilter_request_var('local_graph_id'); $save['task_item_id'] = form_input_validate(get_nfilter_request_var('task_item_id'), 'task_item_id', '^[0-9]+$', true, 3); $save['color_id'] = form_input_validate((isset($item['color_id']) ? $item['color_id'] : get_nfilter_request_var('color_id')), 'color_id', '^[0-9]+$', 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_nfilter_request_var('graph_type_id')), 'graph_type_id', '^[0-9]+$', true, 3); if (isset_request_var('line_width') || isset($item['line_width'])) { $save['line_width'] = form_input_validate((isset($item['line_width']) ? $item['line_width'] : get_nfilter_request_var('line_width')), 'line_width', '(^[0-9]+[\.,0-9]+$|^[0-9]+$)', true, 3); } else { # make sure to transfer old LINEx style into line_width on save switch ($save['graph_type_id']) { case GRAPH_ITEM_TYPE_LINE1: $save['line_width'] = 1; break; case GRAPH_ITEM_TYPE_LINE2: $save['line_width'] = 2; break; case GRAPH_ITEM_TYPE_LINE3: $save['line_width'] = 3; break; default: $save['line_width'] = 0; } } $save['dashes'] = form_input_validate((isset_request_var('dashes') ? get_nfilter_request_var('dashes') : ''), 'dashes', '', true, 3); $save['dash_offset'] = form_input_validate((isset_request_var('dash_offset') ? get_nfilter_request_var('dash_offset') : ''), 'dash_offset', '^[0-9]+$', true, 3); $save['cdef_id'] = form_input_validate(get_nfilter_request_var('cdef_id'), 'cdef_id', '^[0-9]+$', true, 3); $save['vdef_id'] = form_input_validate(get_nfilter_request_var('vdef_id'), 'vdef_id', '^[0-9]+$', true, 3); $save['shift'] = form_input_validate((isset_request_var('shift') ? get_nfilter_request_var('shift') : ''), 'shift', '^((on)|)$', true, 3); $save['consolidation_function_id'] = form_input_validate((isset($item['consolidation_function_id']) ? $item['consolidation_function_id'] : get_nfilter_request_var('consolidation_function_id')), 'consolidation_function_id', '^[0-9]+$', true, 3); $save['textalign'] = form_input_validate((isset_request_var('textalign') ? get_nfilter_request_var('textalign') : ''), 'textalign', '^[a-z]+$', 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_nfilter_request_var('gprint_id'), 'gprint_id', '^[0-9]+$', true, 3); $save['sequence'] = $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); } } $sequence = 0; } if (is_error_message()) { header('Location: graphs.php?action=item_edit&graph_template_item_id=' . (empty($graph_template_item_id) ? get_nfilter_request_var('graph_template_item_id') : $graph_template_item_id) . '&id=' . get_nfilter_request_var('local_graph_id')); exit; } else { header('Location: graphs.php?action=graph_edit&id=' . get_nfilter_request_var('local_graph_id')); exit; } } if ((isset_request_var('save_component_graph_new')) && (isempty_request_var('graph_template_id'))) { header('Location: graphs.php?action=graph_edit&host_id=' . get_nfilter_request_var('host_id') . '&new=1'); } elseif ((is_error_message()) || (isempty_request_var('local_graph_id')) || (get_nfilter_request_var('graph_template_id') != get_nfilter_request_var('graph_template_id_prev')) || (get_nfilter_request_var('host_id') != get_nfilter_request_var('host_id_prev'))) { header('Location: graphs.php?action=graph_edit&id=' . (empty($local_graph_id) ? get_nfilter_request_var('local_graph_id') : $local_graph_id) . (isset_request_var('host_id') ? '&host_id=' . get_nfilter_request_var('host_id') : '')); } elseif (!empty($local_graph_id)) { header('Location: graphs.php?action=graph_edit&id=' . $local_graph_id); } else { header('Location: graphs.php'); } exit; } 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 validate_item_vars() { /* ================= input validation and session storage ================= */ $filters = array( 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ), 'local_graph_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ), 'data_template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ) ); validate_store_request_vars($filters, 'sess_gitems'); /* ================= input validation ================= */ } function item_edit() { global $struct_graph_item, $graph_item_types, $consolidation_functions; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); get_filter_request_var('local_graph_id'); get_filter_request_var('data_template_id'); /* ==================================================== */ // This column is for Graph Templates unset($struct_graph_item['data_template_id']); validate_item_vars(); $id = (!isempty_request_var('id') ? '&id=' . get_request_var('id') : ''); $host = db_fetch_row_prepared( 'SELECT hostname FROM host WHERE id = ?', array(get_request_var('host_id')) ); if (empty($host['hostname'])) { $header = __('Data Sources [No Device]'); } else { $header = __esc('Data Sources [%s]', $host['hostname']); } html_start_box($header, '100%', '', '3', 'center', ''); ?>
0) { $sql_where = 'h.id=' . get_request_var('host_id'); } elseif (get_request_var('host_id') == 0) { $sql_where = 'h.id IS NULL'; } else { $sql_where = ''; } if (get_request_var('data_template_id') == '-1') { $sql_where .= ''; } elseif (get_request_var('data_template_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND ' : '') . 'dl.data_template_id=0'; } elseif (!isempty_request_var('data_template_id')) { $sql_where .= ($sql_where != '' ? ' AND ' : '') . 'dl.data_template_id=' . get_request_var('data_template_id'); } if (!isempty_request_var('id')) { $template_item = db_fetch_row_prepared( 'SELECT * FROM graph_templates_item WHERE id = ?', array(get_request_var('id')) ); } else { $template_item = array(); kill_session_var('sess_graph_items_dti'); } $title = db_fetch_cell_prepared( 'SELECT title_cache FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id')) ); $header_label = __esc('Graph Items [graph: %s]', $title); form_start('graphs.php', 'graph_edit'); html_start_box($header_label, '100%', true, '3', 'center', ''); /* by default, select the LAST DS chosen to make everyone's lives easier */ if (!isempty_request_var('local_graph_id')) { $struct_graph_item['task_item_id']['default'] = 0; if (isset($template_item['task_item_id'])) { $task_item_id = $template_item['task_item_id']; $value = db_fetch_cell_prepared( "SELECT CONCAT_WS('', dtd.name_cache,' (', dtr.data_source_name, ')') as name FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dtd.local_data_id=dl.id INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dl.id LEFT JOIN host AS h ON dl.host_id=h.id WHERE dtr.id = ?", array($task_item_id) ); } else { $task_item_id = 0; $value = ''; } if (get_selected_theme() != 'classic' && read_config_option('autocomplete_enabled') > 0) { $action = 'ajax_graph_items'; if (get_request_var('host_id') > 0) { $action .= '&host_id=' . get_filter_request_var('host_id'); } if (get_request_var('data_template_id') > 0) { $action .= '&data_template_id=' . get_filter_request_var('data_template_id'); } $struct_graph_item['task_item_id'] = array( 'method' => 'drop_callback', 'friendly_name' => __('Data Source'), 'description' => __('Choose the Data Source to associate with this Graph Item.'), 'sql' => '', 'action' => $action, 'none_value' => __('None'), 'id' => $task_item_id, 'value' => $value ); } /* modifications to the default graph items array */ $struct_graph_item['task_item_id']['sql'] = "SELECT CONCAT_WS('', dtd.name_cache,' (', dtr.data_source_name, ')') as name, dtr.id FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dtd.local_data_id=dl.id INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dl.id LEFT JOIN host AS h ON dl.host_id=h.id"; /* Make sure we don't limit the list so that the selected DS isn't in the list in edit mode */ if ($sql_where != '') { if (!isempty_request_var('id')) { $struct_graph_item['task_item_id']['sql'] .= " WHERE ($sql_where) OR (dtr.id=" . $template_item['task_item_id'] . ')'; } else { $struct_graph_item['task_item_id']['sql'] .= " WHERE $sql_where"; } } $struct_graph_item['task_item_id']['sql'] .= ' ORDER BY name'; } $form_array = array(); foreach ($struct_graph_item as $field_name => $field_array) { $form_array += array($field_name => $struct_graph_item[$field_name]); if (get_selected_theme() != 'classic' && read_config_option('autocomplete_enabled')) { if ($field_name != 'task_item_id') { $form_array[$field_name]['value'] = (isset($template_item[$field_name]) ? $template_item[$field_name] : ''); } } else { $form_array[$field_name]['value'] = (isset($template_item[$field_name]) ? $template_item[$field_name] : ''); } $form_array[$field_name]['form_id'] = (isset($template_item['id']) ? $template_item['id'] : '0'); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); form_hidden_box('local_graph_id', get_request_var('local_graph_id'), '0'); form_hidden_box('graph_template_item_id', (!empty($template_item) ? $template_item['id'] : '0'), ''); form_hidden_box('local_graph_template_item_id', (!empty($template_item) ? $template_item['local_graph_template_item_id'] : '0'), ''); form_hidden_box('graph_template_id', (!empty($template_item) ? $template_item['graph_template_id'] : '0'), ''); form_hidden_box('_graph_type_id', (!empty($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(), ''); html_end_box(true, true); form_save_button('graphs.php?action=graph_edit&id=' . get_request_var('local_graph_id')); ?> 0) { $data = db_fetch_row_prepared('SELECT id, data_input_id, data_template_id, name, local_data_id FROM data_template_data WHERE local_data_id = ?', array($local_data_id)); /* get each INPUT field for this data input source */ $output_type_field_id = db_fetch_cell_prepared('SELECT id FROM data_input_fields WHERE data_input_id = ? AND input_output="in" AND type_code="output_type" ORDER BY sequence', array($data['data_input_id'])); $snmp_query_graph_id = db_fetch_cell_prepared('SELECT value FROM data_input_data WHERE data_template_data_id = ? AND data_input_field_id = ?', array($data['id'], $output_type_field_id)); if (!empty($snmp_query_graph_id)) { return $graph_local['graph_template_id'] . '_' . $snmp_query_graph_id; } else { return $graph_local['graph_template_id']; } } else { return $graph_local['graph_template_id']; } } function get_common_graph_templates(&$graph) { $dqid = 0; if (cacti_sizeof($graph)) { $dqid = db_fetch_cell_prepared('SELECT snmp_query_id FROM graph_local WHERE id = ?', array($graph['local_graph_id'])); } // Default in worst case $gtsql = 'SELECT gt.id, gt.name FROM graph_templates AS gt ORDER BY name'; if ($dqid > 0) { $sqgi = db_fetch_cell_prepared('SELECT GROUP_CONCAT(id) AS id FROM snmp_query_graph WHERE snmp_query_id = ? AND graph_template_id = ?', array($dqid, $graph['graph_template_id'])); if ($sqgi != '') { $query_fields = array_rekey(db_fetch_assoc_prepared('SELECT snmp_query_graph_id, GROUP_CONCAT(snmp_field_name ORDER BY snmp_field_name) AS columns FROM snmp_query_graph_rrd WHERE snmp_query_graph_id IN (' . $sqgi . ') GROUP BY snmp_query_graph_id'), 'snmp_query_graph_id', 'columns'); if (cacti_sizeof($query_fields)) { $ids = array_to_sql_or(array_values($query_fields), 'columns'); $common_graph_ids = array_rekey(db_fetch_assoc_prepared('SELECT snmp_query_graph_id, GROUP_CONCAT(snmp_field_name ORDER BY snmp_field_name) AS columns FROM snmp_query_graph_rrd GROUP BY snmp_query_graph_id HAVING ' . $ids), 'snmp_query_graph_id', 'columns'); if (cacti_sizeof($common_graph_ids)) { $ids = implode(',', array_keys($common_graph_ids)); $gtids = db_fetch_cell_prepared('SELECT GROUP_CONCAT(DISTINCT graph_template_id) AS gtids FROM snmp_query_graph WHERE snmp_query_id = ? AND id IN (' . $ids . ')', array($dqid)); if ($gtids != '') { $gtsql = "SELECT CONCAT_WS('', graph_template_id, '_', id, '') AS id, name FROM snmp_query_graph WHERE (snmp_query_id = $dqid AND id IN ($ids)) OR graph_template_id IN ($gtids) ORDER BY name"; } else { $gtsql = "SELECT CONCAT_WS('', graph_template_id, '_', id, '') AS id, name FROM snmp_query_graph WHERE (snmp_query_id = $dqid AND id IN ($ids)) ORDER BY name"; } } } } } return $gtsql; } function form_actions() { global $graph_actions, $struct_aggregate; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete if (!isset_request_var('delete_type')) { set_request_var('delete_type', 1); } api_delete_graphs($selected_items, get_filter_request_var('delete_type')); } elseif (get_request_var('drp_action') == '2') { // change graph template $gt_id_unparsed = get_nfilter_request_var('graph_template_id'); $gt_id_prev_unparsed = get_nfilter_request_var('graph_template_id_prev'); parse_validate_graph_template_id('graph_template_id'); for ($i=0;($i < cacti_count($selected_items));$i++) { change_graph_template($selected_items[$i], $gt_id_unparsed, true); } } elseif (get_request_var('drp_action') == '3') { // duplicate for ($i=0;($i < cacti_count($selected_items));$i++) { api_duplicate_graph($selected_items[$i], 0, get_nfilter_request_var('title_format')); } } elseif (get_request_var('drp_action') == '4') { // graph -> graph template for ($i=0;($i < cacti_count($selected_items));$i++) { graph_to_graph_template($selected_items[$i], get_nfilter_request_var('title_format')); } } elseif (preg_match('/^tr_([0-9]+)$/', get_request_var('drp_action'), $matches)) { // place on tree get_filter_request_var('tree_id'); get_filter_request_var('tree_item_id'); for ($i=0;($i < cacti_count($selected_items));$i++) { api_tree_item_save(0, get_nfilter_request_var('tree_id'), TREE_ITEM_TYPE_GRAPH, get_nfilter_request_var('tree_item_id'), '', $selected_items[$i], 0, 0, 0, 0, false); } } elseif (get_request_var('drp_action') == '5') { // change host get_filter_request_var('host_id'); $failures = false; for ($i=0;($i < cacti_count($selected_items));$i++) { if (!api_graph_change_device($selected_items[$i], get_request_var('host_id'))) { $failures = true; } if ($failures) { raise_message(33); } } } elseif (get_request_var('drp_action') == '6') { // reapply suggested naming for ($i=0;($i < cacti_count($selected_items));$i++) { api_reapply_suggested_graph_title($selected_items[$i]); update_graph_title_cache($selected_items[$i]); } } elseif (get_request_var('drp_action') == '9' || get_request_var('drp_action') == '10') { /* get common info - not dependant on template/no template*/ $local_graph_id = 0; // this will be a new graph $member_graphs = $selected_items; $graph_title = form_input_validate(get_nfilter_request_var('title_format'), 'title_format', '', true, 3); /* future aggregate_graphs entry */ $ag_data = array(); $ag_data['id'] = 0; $ag_data['title_format'] = $graph_title; $ag_data['user_id'] = $_SESSION[SESS_USER_ID]; if (get_request_var('drp_action') == '9') { if (!isset_request_var('aggregate_total_type')) { set_request_var('aggregate_total_type', 0); } if (!isset_request_var('aggregate_total')) { set_request_var('aggregate_total', 0); } if (!isset_request_var('aggregate_total_prefix')) { set_request_var('aggregate_total_prefix', ''); } if (!isset_request_var('aggregate_order_type')) { set_request_var('aggregate_order_type', 0); } $item_no = form_input_validate(get_nfilter_request_var('item_no'), 'item_no', '^[0-9]+$', true, 3); $ag_data['aggregate_template_id'] = 0; $ag_data['template_propogation'] = ''; $ag_data['graph_template_id'] = form_input_validate(get_nfilter_request_var('graph_template_id'), 'graph_template_id', '^[0-9]+$', true, 3); $ag_data['gprint_prefix'] = form_input_validate(get_nfilter_request_var('gprint_prefix'), 'gprint_prefix', '', true, 3); $ag_data['graph_type'] = form_input_validate(get_nfilter_request_var('aggregate_graph_type'), 'aggregate_graph_type', '^[0-9]+$', true, 3); $ag_data['total'] = form_input_validate(get_nfilter_request_var('aggregate_total'), 'aggregate_total', '^[0-9]+$', true, 3); $ag_data['total_type'] = form_input_validate(get_nfilter_request_var('aggregate_total_type'), 'aggregate_total_type', '^[0-9]+$', true, 3); $ag_data['total_prefix'] = form_input_validate(get_nfilter_request_var('aggregate_total_prefix'), 'aggregate_total_prefix', '', true, 3); $ag_data['order_type'] = form_input_validate(get_nfilter_request_var('aggregate_order_type'), 'aggregate_order_type', '^[0-9]+$', true, 3); } else { $template_data = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array(get_nfilter_request_var('aggregate_template_id'))); $item_no = db_fetch_cell_prepared('SELECT COUNT(*) FROM aggregate_graph_templates_item WHERE aggregate_template_id = ?', array(get_nfilter_request_var('aggregate_template_id'))); $ag_data['aggregate_template_id'] = get_nfilter_request_var('aggregate_template_id'); $ag_data['template_propogation'] = 'on'; $ag_data['graph_template_id'] = $template_data['graph_template_id']; $ag_data['gprint_prefix'] = $template_data['gprint_prefix']; $ag_data['graph_type'] = $template_data['graph_type']; $ag_data['total'] = $template_data['total']; $ag_data['total_type'] = $template_data['total_type']; $ag_data['total_prefix'] = $template_data['total_prefix']; $ag_data['order_type'] = $template_data['order_type']; } /* create graph in cacti tables */ $local_graph_id = aggregate_graph_save( $local_graph_id, $ag_data['graph_template_id'], $graph_title, $ag_data['aggregate_template_id'] ); $ag_data['local_graph_id'] = $local_graph_id; $aggregate_graph_id = sql_save($ag_data, 'aggregate_graphs'); $ag_data['aggregate_graph_id'] = $aggregate_graph_id; // /* save member graph info */ // $i = 1; // foreach($member_graphs as $graph_id) { // db_execute("INSERT INTO aggregate_graphs_items // (aggregate_graph_id, local_graph_id, sequence) // VALUES // ($aggregate_graph_id, $graph_id, $i)" // ); // $i++; // } /* save aggregate graph - graph items */ if (get_request_var('drp_action') == '9') { /* get existing item ids and sequences from graph template */ $graph_templates_items = array_rekey( db_fetch_assoc_prepared('SELECT id, sequence FROM graph_templates_item WHERE local_graph_id=0 AND graph_template_id = ?', array($ag_data['graph_template_id'])), 'id', array('sequence') ); /* update graph template item values with posted values */ aggregate_validate_graph_items($_POST, $graph_templates_items); $aggregate_graph_items = array(); foreach ($graph_templates_items as $item_id => $data) { $item_new = array(); $item_new['aggregate_graph_id'] = $aggregate_graph_id; $item_new['graph_templates_item_id'] = $item_id; $item_new['color_template'] = isset($data['color_template']) ? $data['color_template'] : 0; $item_new['item_skip'] = isset($data['item_skip']) ? 'on' : ''; $item_new['item_total'] = isset($data['item_total']) ? 'on' : ''; $item_new['sequence'] = isset($data['sequence']) ? $data['sequence'] : 0; $aggregate_graph_items[] = $item_new; } aggregate_graph_items_save($aggregate_graph_items, 'aggregate_graphs_graph_item'); } else { $aggregate_graph_items = db_fetch_assoc_prepared('SELECT * FROM aggregate_graph_templates_item WHERE aggregate_template_id = ?', array($ag_data['aggregate_template_id'])); } $attribs = $ag_data; $attribs['graph_title'] = $ag_data['title_format']; $attribs['reorder'] = $ag_data['order_type']; $attribs['item_no'] = $item_no; $attribs['color_templates'] = array(); $attribs['skipped_items'] = array(); $attribs['total_items'] = array(); $attribs['graph_item_types']= array(); $attribs['cdefs'] = array(); foreach ($aggregate_graph_items as $item) { if (isset($item['color_template']) && $item['color_template'] > 0) { $attribs['color_templates'][$item['sequence']] = $item['color_template']; } if (isset($item['item_skip']) && $item['item_skip'] == 'on') { $attribs['skipped_items'][$item['sequence']] = $item['sequence']; } if (isset($item['item_total']) && $item['item_total'] == 'on') { $attribs['total_items'][$item['sequence']] = $item['sequence']; } if (isset($item['cdef_id']) && isset($item['t_cdef_id']) && $item['t_cdef_id'] == 'on') { $attribs['cdefs'][$item['sequence']] = $item['cdef_id']; } if (isset($item['graph_type_id']) && isset($item['t_graph_type_id']) && $item['t_graph_type_id'] == 'on') { $attribs['graph_item_types'][$item['sequence']] = $item['graph_type_id']; } } /* create actual graph items */ aggregate_create_update($local_graph_id, $member_graphs, $attribs); header("Location: aggregate_graphs.php?action=edit&tab=details&id=$local_graph_id"); exit; } elseif (get_request_var('drp_action') == '8') { // automation cacti_log('automation_graph_action_execute called: ' . get_request_var('drp_action'), true, 'AUTM8 TRACE', POLLER_VERBOSITY_MEDIUM); /* work on all selected graphs */ for ($i=0;($i < cacti_count($selected_items));$i++) { automation_execute_graph_create_tree($selected_items[$i]); } } elseif (get_request_var('drp_action') == '11') { // Add to a report $good = true; for ($i=0;($i < cacti_count($selected_items));$i++) { if (!reports_add_graphs(get_filter_request_var('report_id'), $selected_items[$i], get_request_var('timespan'), get_request_var('align'))) { raise_message('reports_add_error'); $good = false; break; } } if ($good) { raise_message('reports_graphs_added'); } } else { api_plugin_hook_function('graphs_action_execute', get_request_var('drp_action')); } /* update snmpcache */ snmpagent_graphs_action_bottom(array(get_request_var('drp_action'), $selected_items)); api_plugin_hook_function('graphs_action_bottom', array(get_request_var('drp_action'), $selected_items)); } if (get_request_var('drp_action') == '2') { // change graph template header('Location: graphs.php?template_id=-1'); } else { header('Location: graphs.php'); } exit; } /* setup some variables */ $i = 0; $graph_list = ''; $graph = array(); /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1], 'chk[1]'); /* ==================================================== */ $graph_list .= '" . __('Click \'Continue\' to delete the following Graph(s). Note that if you choose to Delete Data Sources, only those Data Sources not in use elsewhere will also be Deleted.') . "
" . __('The following Data Source(s) are in use by these Graph(s).') . "
\n"; print '" . __('Choose a Graph Template and click \'Continue\' to change the Graph Template for the following Graph(s). Please note, that only compatible Graph Templates will be displayed. Compatible is identified by those having identical Data Sources.') . "
" . __('New Graph Template') . '
';
$gtsql = get_common_graph_templates($graph);
form_dropdown('graph_template_id', db_fetch_assoc($gtsql), 'name', 'id', '', '', '0');
print "
" . __('Click \'Continue\' to duplicate the following Graph(s). You can optionally change the title format for the new Graph(s).') . "
" . __('Title Format') . '
';
form_text_box('title_format', __('
" . __('Click \'Continue\' to convert the following Graph(s) into Graph Template(s). You can optionally change the title format for the new Graph Template(s).') . "
" . __('Title Format') . '
';
form_text_box('title_format', __('
" . __('Click \'Continue\' to place the following Graph(s) under the Tree Branch selected below.') . "
" . __('Destination Branch') . '
';
grow_dropdown_tree($matches[1], '0', 'tree_item_id', '0');
print "
" . __('Choose a new Device for these Graph(s) and click \'Continue\'.') . "
" . __('New Device'). '
';
form_dropdown('host_id',db_fetch_assoc("SELECT id,CONCAT_WS('',description,' (',hostname,')') as name FROM host ORDER BY description,hostname"),'name','id','','','0');
print "
" . __('Click \'Continue\' to re-apply suggested naming to the following Graph(s).') . "
" . __('Click \'Continue\' to create an Aggregate Graph from the selected Graph(s).'). "
' . __('The following Data Sources are in use by these Graphs:') . '
" . __('Select the Aggregate Template to use and press \'Continue\' to create your Aggregate Graph. Otherwise press \'Cancel\' to return.') . "
| ' . __('Graph Title') . " | |
| " . __('Aggregate Template') . " |
" . __('There are presently no Aggregate Templates defined for this Graph Template. Please either first create an Aggregate Template for the selected Graphs Graph Template and try again, or simply crease an un-templated Aggregate Graph.') . '
' . __('Press \'Return\' to return and select different Graphs.') . "
" . __('Click \'Continue\' to apply Automation Rules to the following Graphs.') . "
" . __('Click \'Continue\' to add the selected Graphs to the Report below.') . "
|
*'> *'> *'> * 0 ? $host_id : get_request_var('host_id')));?>'> * * *'> |