__('Delete'), 5 => __('Convert to Normal Graph'), 4 => __('Place Graphs on Report'), 2 => __('Migrate Aggregate to use a Template'), 3 => __('Create New Aggregate from Aggregates') ); $agg_item_actions = array( 10 => __('Associate with Aggregate'), 11 => __('Disassociate with Aggregate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'edit': top_header(); graph_edit(); bottom_footer(); break; default: top_header(); aggregate_graph(); bottom_footer(); break; } 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']] = __('Place on a Tree (%s)', $tree['name']); } } } function form_save() { if (!isset_request_var('save_component_graph')) { header('Location: aggregate_graphs.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } /* remember some often used values */ $local_graph_id = get_nfilter_request_var('local_graph_id', 0); $graph_template_id = get_nfilter_request_var('graph_template_id', 0); $aggregate_template_id = get_nfilter_request_var('aggregate_template_id', 0); $graph_title = form_input_validate(get_nfilter_request_var('title_format'), 'title_format', '', false, 3); if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* get the aggregate graph id */ $aggregate_graph_id = db_fetch_cell_prepared('SELECT id FROM aggregate_graphs WHERE local_graph_id = ?', array($local_graph_id)); /* if user disabled template propagation we need to get graph data from form */ if (!isset_request_var('template_propogation')) { $aggregate_template_id = 0; $new_data = aggregate_validate_graph_params($_POST, false); } else { $new_data = array(); } if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* save graph data to cacti tables */ $graph_templates_graph_id = aggregate_graph_templates_graph_save( $local_graph_id, $graph_template_id, $graph_title, $aggregate_template_id, $new_data ); /* update title in aggregate graphs table */ db_execute_prepared('UPDATE aggregate_graphs SET title_format = ? WHERE id = ?', array($graph_title, $aggregate_graph_id)); /* next lets see if any of the aggregate has changed and save as applicable * if the graph is templates, we can simply ignore. A simple check will * determine if aggregation propagation is enabled */ if (!isset_request_var('template_propogation')) { /* template propagation is disabled */ $save = array(); $save['id'] = $aggregate_graph_id; $save['aggregate_template_id'] = $aggregate_template_id; $save['template_propogation'] = ''; $save['gprint_prefix'] = get_nfilter_request_var('gprint_prefix'); $save['gprint_format'] = isset_request_var('gprint_format') ? 'on':''; $save['total_prefix'] = get_nfilter_request_var('total_prefix'); $save['total'] = get_filter_request_var('total'); $save['graph_type'] = get_filter_request_var('graph_type'); $save['total_type'] = get_filter_request_var('total_type'); $save['order_type'] = get_filter_request_var('order_type'); /* see if anything changed, if so, we will have to push out the aggregate */ if (!empty($aggregate_graph_id)) { $old = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE id = ?', array($aggregate_graph_id)); $save_me = 0; $save_me += ($old['aggregate_template_id'] != $save['aggregate_template_id']); $save_me += ($old['template_propogation'] != $save['template_propogation']); $save_me += ($old['gprint_prefix'] != $save['gprint_prefix']); $save_me += ($old['gprint_format'] != $save['gprint_format']); $save_me += ($old['graph_type'] != $save['graph_type']); $save_me += ($old['total'] != $save['total']); $save_me += ($old['total_type'] != $save['total_type']); $save_me += ($old['total_prefix'] != $save['total_prefix']); $save_me += ($old['order_type'] != $save['order_type']); if ($save_me) { $aggregate_graph_id = sql_save($save, 'aggregate_graphs'); } /* save the template items now */ /* 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 = ? ORDER BY sequence', array($graph_template_id)), 'id', array('sequence') ); /* get existing aggregate template items */ $aggregate_graph_items_old = array_rekey( db_fetch_assoc_prepared('SELECT * FROM aggregate_graphs_graph_item WHERE aggregate_graph_id = ? ORDER BY sequence', array($aggregate_graph_id)), 'graph_templates_item_id', array('aggregate_graph_id', 'graph_templates_item_id', 'sequence', 'color_template', 't_graph_type_id', 'graph_type_id', 't_cdef_id', 'cdef_id', 'item_skip', 'item_total') ); /* update graph template item values with posted values */ aggregate_validate_graph_items($_POST, $graph_templates_items); $items_changed = false; $items_to_save = array(); $sequence = 1; 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'] = $sequence; /* compare with old item to see if we need to push out. */ if (!isset($aggregate_graph_items_old[$item_id])) { /* this item does not yet exist */ $items_changed = true; } else { /* compare data from user to data from DB */ foreach ($item_new as $field => $new_value) { if ($aggregate_graph_items_old[$item_id][$field] != $new_value) { $items_changed = true; } } /* fill in missing fields with db values */ $item_new = array_merge($aggregate_graph_items_old[$item_id], $item_new); } $items_to_save[] = $item_new; $sequence++; } if ($items_changed) { aggregate_graph_items_save($items_to_save, 'aggregate_graphs_graph_item'); } if ($save_me || $items_changed) { push_out_aggregates(0, $local_graph_id); } } } raise_message(1); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $graph_actions, $agg_item_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* we are performing two set's of actions here */ $graph_actions += $agg_item_actions; /* 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 api_aggregate_remove_multi($selected_items); } elseif (get_request_var('drp_action') == '2') { // migrate to template api_aggregate_convert_template($selected_items); } elseif (get_request_var('drp_action') == '3') { // create aggregate from aggregate $aggregate_name = get_request_var('aggregate_name'); api_aggregate_create($aggregate_name, $selected_items); } elseif (get_request_var('drp_action') == '4') { // add graphs to report $good = true; for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $graph_list .= '
  • ' . html_escape(get_graph_title($matches[1])) . '
  • '; $graph_array[$i] = $matches[1]; $i++; } } top_header(); /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); form_start('aggregate_graphs.php'); html_start_box($graph_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); $save_html = ''; if (isset($graph_array) && cacti_sizeof($graph_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __('Click \'Continue\' to delete the following Aggregate Graph(s).') . "

    "; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // migrate to aggregate /* determine the common graph template if any */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { $local_graph_ids[] = $matches[1]; } } $lgid = implode(',',$local_graph_ids); /* for whatever reason, subquery performance in mysql is sub-optimal. Therefore, let's do this * as a few queries instead. */ $task_items = array_rekey(db_fetch_assoc("SELECT DISTINCT task_item_id FROM graph_templates_item WHERE local_graph_id IN($lgid)"), 'task_item_id', 'task_item_id'); if (cacti_sizeof($task_items)) { $task_items = implode(',', $task_items); $graph_templates = db_fetch_assoc("SELECT DISTINCT graph_template_id FROM graph_templates_item WHERE task_item_id IN ($task_items) AND graph_template_id>0"); } else { $graph_templates = array(); } if (cacti_sizeof($graph_templates) > 1) { print "

    " . __('The selected Aggregate Graphs represent elements from more than one Graph Template.') . "

    " . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, they must only be using one Graph Template. Please press \'Return\' and then select only Aggregate Graph that utilize the same Graph Template.') . "

    "; $save_html = ""; } elseif (cacti_sizeof($graph_templates) == 0) { print "

    " . __('The selected Aggregate Graphs does not appear to have any matching Aggregate Templates.') . "

    " . __('In order to migrate the Aggregate Graphs below use an Aggregate Template, one must already exist. Please press \'Return\' and then first create your Aggregate Template before retrying.') . "

    "; } else { $graph_template = $graph_templates[0]['graph_template_id']; $aggregate_templates = db_fetch_assoc_prepared('SELECT id, name FROM aggregate_graph_templates WHERE graph_template_id = ? ORDER BY name', array($graph_template)); if (cacti_sizeof($aggregate_templates)) { print "

    " . __('Click \'Continue\' and the following Aggregate Graph(s) will be migrated to use the Aggregate Template that you choose below.') . "

    "; print " " . __('Aggregate Template:') . " "; $save_html = " "; } else { print "

    " . __('There are currently no Aggregate Templates defined for the selected Legacy Aggregates.') . "

    " . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, first create an Aggregate Template for the Graph Template \'%s\'.', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array($graph_template))) . "

    " . __('Please press \'Return\' to continue.') . "

    "; $save_html = ""; } } } elseif (get_request_var('drp_action') == '3') { // create aggregate from aggregates print "

    " . __('Click \'Continue\' to combine the following Aggregate Graph(s) into a single Aggregate Graph.') . "

    "; print " " . __('Aggregate Name:') . ""; print " "; $save_html = " "; } elseif (get_request_var('drp_action') == '4') { global $alignment, $graph_timespans; $reports = db_fetch_assoc_prepared('SELECT id, name FROM reports WHERE user_id = ? ORDER BY name', array($_SESSION['sess_user_id'])); if (cacti_sizeof($reports)) { print "

    " . __('Click \'Continue\' to add the selected Graphs to the Report below.') . "

    " . __('Report Name') . '
    '; form_dropdown('report_id', $reports, 'name', 'id', '', '', '0'); print ''; print '' . __('Timespan') . '
    '; form_dropdown('timespan',$graph_timespans, '', '', '', '', read_user_setting('default_timespan')); print ''; print '' . __('Align') . '
    '; form_dropdown('align',$alignment, '', '', '', '', REPORTS_ALIGN_CENTER); print ""; $save_html = " "; } else { print "" . __('You currently have no reports defined.') . ""; $save_html = ""; } } elseif (get_request_var('drp_action') == '5') { // convert to a normal graph print "

    " . __('Click \'Continue\' to convert the following Aggregate Graph(s) into a normal Graph.') . "

    "; $save_html = " "; } elseif (get_request_var('drp_action') == '10') { // associate with aggregate print "

    " . __('Click \'Continue\' to associate the following Graph(s) with the Aggregate Graph.') . "

    "; $save_html = " "; } elseif (get_request_var('drp_action') == '11') { // dis-associate with aggregate print "

    " . __('Click \'Continue\' to disassociate the following Graph(s) from the Aggregate.') . "

    "; $save_html = " "; } elseif (preg_match("/^tr_([0-9]+)$/", get_request_var('drp_action'), $matches)) { // place on tree print "

    " . __('Click \'Continue\' to place the following Aggregate Graph(s) under the Tree Branch.') . "

    " . __('Destination Branch:') . "
    "; grow_dropdown_tree($matches[1], '0', 'tree_item_id', '0'); print "

    "; $save_html = " "; } } else { raise_message(40); header('Location: aggregate_graphs.php?header=false'); exit; } print " $save_html "; html_end_box(false); form_end(); bottom_footer(); } /* ----------------------- item - Graph Items ----------------------- */ function item() { global $consolidation_functions, $graph_item_types, $struct_graph_item; // Remove filter item unset($struct_graph_item['data_template_id']); /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (isempty_request_var('id')) { $template_item_list = array(); $header_label = __('Graph Items [new]'); } else { $template_item_list = db_fetch_assoc_prepared('SELECT gti.id, gti.text_format, gti.value, gti.hard_return, gti.graph_type_id, gti.consolidation_function_id, dtr.data_source_name, gti.alpha, cdef.name AS cdef_name, vdef.name AS vdef_name, colors.hex, gtgp.name AS gprint_name FROM graph_templates_item AS gti LEFT JOIN data_template_rrd AS dtr ON gti.task_item_id=dtr.id LEFT JOIN data_local AS dl ON dtr.local_data_id=dl.id LEFT JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id LEFT JOIN cdef ON gti.cdef_id=cdef.id LEFT JOIN vdef ON gti.vdef_id=vdef.id LEFT JOIN graph_templates_gprint gtgp ON gti.gprint_id=gtgp.id LEFT JOIN colors ON gti.color_id=colors.id WHERE gti.local_graph_id = ? ORDER BY gti.sequence', array(get_request_var('id'))); $header_label = __esc('Graph Items [edit: %s]', get_graph_title(get_request_var('id'))); } $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); if (empty($graph_template_id)) { $add_text = 'aggregate_items.php?action=item_edit&local_graph_id=' . get_request_var('id'); } else { $add_text = ''; } html_start_box($header_label, '100%', '', '3', 'center', $add_text); draw_graph_items_list($template_item_list, 'aggregate_items.php', 'local_graph_id=' . get_request_var('id') , (empty($graph_template_id) ? false : true)); html_end_box(false); } /* ------------------------------------ graph - Graphs ------------------------------------ */ function graph_edit() { global $config, $struct_graph, $struct_aggregate_graph, $image_types, $consolidation_functions, $graph_item_types, $struct_graph_item; // Remove filter item unset($struct_graph_item['data_template_id']); /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ /* purge any old graphs */ aggregate_prune_graphs(get_request_var('id')); if (isset_request_var('reset')) { $_SESSION['aggregate_referer'] = 'aggregate_graphs.php'; } elseif (isset($_SERVER['HTTP_REFERER']) && !substr_count($_SERVER['HTTP_REFERER'], 'aggregate_graphs.php')) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; } elseif (isset($_SERVER['HTTP_REFERER']) && !isset($_SESSION['aggregate_referer'])) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; } $referer = isset($_SESSION['aggregate_referer']) ? $_SESSION['aggregate_referer'] : 'aggregate_graphs.php'; $use_graph_template = false; $aginfo = array(); $graphs = array(); if (!isempty_request_var('id')) { $graphs = db_fetch_row_prepared('SELECT * FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('id'))); if (cacti_sizeof($graphs)) { $aginfo = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE local_graph_id = ?', array($graphs['local_graph_id'])); if ($aginfo['title_format'] == '') { $aginfo['title_format'] = get_graph_title($graphs['local_graph_id']); } $header_label = __esc('[edit: %s]', get_graph_title(get_request_var('id'))); } else { $header_label = __('Aggregate Graph does not Exist'); } } if (cacti_sizeof($aginfo)) { if ($aginfo['aggregate_template_id'] > 0) { $template = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array($aginfo['aggregate_template_id'])); } else { $template = $aginfo; } $aggregate_tabs = array( 'details' => __('Details'), 'items' => __('Items'), 'preview' => __('Preview') ); } elseif (cacti_sizeof($graphs)) { $template = array(); $aggregate_tabs = array( 'details' => __('Details'), 'preview' => __('Preview') ); } else { raise_message('missing_aggregate', __('Aggregate Graphs Accessed does not Exist'), MESSAGE_LEVEL_ERROR); if (isset($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; header('Location: ' . $referer); } else { header('Location: aggregate_graphs.php'); } exit; } /* ================= input validation and session storage ================= */ if (isset_request_var('tab')) { switch(get_nfilter_request_var('tab')) { case 'details': case 'items': case 'preview': $_SESSION['agg_tab'] = get_nfilter_request_var('tab'); set_request_var('tab', get_nfilter_request_var('tab')); break; default: if (isset($_SESSION['agg_tab'])) { set_request_var('tab', $_SESSION['agg_tab']); }else{ $_SESSION['agg_tab'] = 'details'; set_request_var('tab', 'details'); } } } elseif (isset($_SESSION['agg_tab'])) { set_request_var('tab', $_SESSION['agg_tab']); } else { set_request_var('tab', 'details'); } /* ================= input validation ================= */ $current_tab = get_nfilter_request_var('tab'); /* draw the categories tabs on the top of the page */ print "
    "; print "
    "; } elseif (!isempty_request_var('id') && $current_tab == 'details' && (!cacti_sizeof($template))) { print ""; } else { print ""; } if (!isempty_request_var('id') && $current_tab == 'preview') { $graph = db_fetch_row_prepared('SELECT * FROM graph_local WHERE id = ?', array(get_request_var('id'))); if (!cacti_sizeof($graph)) { html_start_box(__('Aggregate Preview Does Not Exist'), '100%', '', '3', 'center', ''); print "" . __('Aggregate Graph does not Exist') . ''; html_end_box(false); raise_message('noaggregate', __('Aggregate Graph does not Exist'), MESSAGE_LEVEL_ERROR); return false; } html_start_box(__('Aggregate Preview %s', $header_label), '100%', '', '3', 'center', ''); ?>


    "; html_start_box(__('Aggregate Graph %s', $header_label), '100%', true, '3', 'center', ''); $helper_string = '|host_description|'; if (isset($template)) { $data_query = db_fetch_cell_prepared('SELECT snmp_query_id FROM snmp_query_graph WHERE graph_template_id = ?', array($template['graph_template_id'])); if ($data_query > 0) { $data_query_info = get_data_query_array($data_query); foreach($data_query_info['fields'] as $field_name => $field_array) { if ($field_array['direction'] == 'input' || $field_array['direction'] == 'input-output') { $helper_string .= ($helper_string != '' ? ', ':'') . '|query_' . $field_name . '|'; } } } } // Append the helper string $struct_aggregate_graph['suggestions'] = array( 'method' => 'other', 'friendly_name' => __('Prefix Replacement Values'), 'description' => __('You may use these replacement values for the Prefix in the Aggregate Graph'), 'value' => $helper_string ); /* add template propagation to the structure */ draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_aggregate_graph, (isset($aginfo) ? $aginfo : array())) ) ); html_end_box(true, true); if (isset($template)) { draw_aggregate_graph_items_list(0, $template['graph_template_id'], $aginfo); } form_hidden_box('save_component_template', '1', ''); ?> '; } /* we will show the classic representation only when we are not templating */ print "
    "; ?> '> '> $field_array) { if ($field_array['method'] != 'spacer') { if ($field_name != 'title') { $form_array += array($field_name => $struct_graph[$field_name]); $form_array[$field_name]['value'] = (isset($graphs) ? $graphs[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($graphs) ? $graphs['id'] : '0'); if (!(($use_graph_template == false) || ($graphs['t_' . $field_name] == 'on'))) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; $form_array[$field_name]['description'] = ''; } } } else { $form_array += array($field_name => $struct_graph[$field_name]); } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); } form_hidden_box('save_component_graph','1',''); form_hidden_box('save_component_input','1',''); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); form_save_button($referer, 'return', 'id'); echo '
    '; ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'matching' => array( 'filter' => FILTER_CALLBACK, 'default' => 'on', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'custom' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => '' ), 'local_graph_ids' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_agraph_item'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } /* form the 'where' clause for our main sql query */ if (get_request_var('rfilter') == '') { $sql_where = ''; } elseif (validate_is_regex(get_request_var('rfilter'))) { $sql_where = "WHERE gtg.title_cache RLIKE '" . get_request_var('rfilter') . "'"; } else { $filters = explode(' ', get_request_var('rfilter')); $sql_where = ''; $sql_where = aggregate_make_sql_where($sql_where, $filters, 'gtg.title_cache'); } if (get_request_var('matching') != 'false') { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . ' (agi.local_graph_id IS NOT NULL)'; } $graph_template = db_fetch_cell_prepared('SELECT graph_template_id FROM aggregate_graphs AS ag WHERE ag.local_graph_id = ?', array(get_request_var('id'))); $aggregate_id = db_fetch_cell_prepared('SELECT id FROM aggregate_graphs WHERE local_graph_id = ?', array(get_request_var('id'))); $total_items = db_fetch_cell_prepared('SELECT COUNT(*) FROM aggregate_graphs_items WHERE aggregate_graph_id = ?', array($aggregate_id)); if (!empty($graph_template)) { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . " (gtg.graph_template_id=$graph_template)"; } if (get_request_var('local_graph_ids') != '') { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' agi.local_graph_id IN(' . get_request_var('local_graph_ids') . ')'; } $sql = "SELECT COUNT(DISTINCT gl.id) AS total FROM graph_templates_graph AS gtg INNER JOIN graph_local AS gl ON gtg.local_graph_id=gl.id LEFT JOIN ( SELECT DISTINCT local_graph_id FROM aggregate_graphs_items WHERE aggregate_graph_id=$aggregate_id) AS agi ON gtg.local_graph_id=agi.local_graph_id $sql_where"; $total_rows = get_total_row_data($_SESSION['sess_user_id'], $sql, array(), 'aggregate_graph'); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $graph_list = db_fetch_assoc("SELECT gtg.id, gtg.local_graph_id, gtg.height, gtg.width, gtg.title_cache, agi.local_graph_id AS agg_graph_id FROM graph_templates_graph AS gtg INNER JOIN graph_local AS gl ON gtg.local_graph_id=gl.id LEFT JOIN ( SELECT DISTINCT local_graph_id FROM aggregate_graphs_items WHERE aggregate_graph_id=$aggregate_id) AS agi ON gtg.local_graph_id=agi.local_graph_id $sql_where $sql_order $sql_limit"); ?>
    '> > ' title=''> ' title=''>
    '>
    array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC'), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC'), 'agg_graph_id' => array('display' => __('Included in Aggregate'), 'align' => 'left', 'sort' => 'ASC'), 'height' => array('display' => __('Size'), 'align' => 'right', 'sort' => 'ASC')); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false, 'aggregate_graphs.php?action=edit&id=' . get_request_var('id')); if (cacti_sizeof($graph_list) > 0) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ form_alternate_row('line' . $graph['local_graph_id'], true); if (validate_is_regex(get_request_var('rfilter'))) { form_selectable_cell(filter_value($graph['title_cache'], get_request_var('rfilter')), $graph['local_graph_id']); } else { form_selectable_ecell(get_request_var('rfilter') != '' ? aggregate_format_text($graph['title_cache'], get_request_var('rfilter')) : $graph['title_cache'], $graph['local_graph_id']); } form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'right'); form_selectable_cell(($graph['agg_graph_id'] != '' ? "" . __('Yes') . '':"" . __('No') . ""), $graph['local_graph_id']); form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id'], '', 'right'); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } else { print '' . __('No Graphs Found') . ''; } html_end_box(false); /* put the nav bar on the bottom as well */ print $nav; /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ form_hidden_box('local_graph_id', get_request_var('id'), ''); draw_actions_dropdown($agg_item_actions); form_end(); } function aggregate_make_sql_where($sql_where, $items, $field) { if ($sql_where != '') { $sql_where .= ' AND ('; } else { $sql_where = 'WHERE ('; } $indentation = 0; $termcount = 0; if (cacti_sizeof($items)) { foreach($items as $i) { $i = trim($i); while (substr($i,0,1) == '(') { $indentation++; $termcount = 0; $sql_where .= '('; $i = substr($i, 1); } $split = strpos($i, ')'); if ($split !== false) { $end = trim(substr($i, $split)); $i = substr($i, 0, $split); } else { $end = ''; } if ($i != '') { if (strtolower($i) == 'and') { $sql_where .= ' AND '; } elseif (strtolower($i) == 'or') { $sql_where .= ' OR '; } else { $sql_where .= ($termcount > 0 ? ' OR ':'') . $field . " LIKE '%" . trim($i) . "%'"; $termcount++; } } if ($end != '') { while (substr($end, 0, 1) == ')') { $indentation--; $termcount = 0; $sql_where .= ')'; $end = trim(substr($end, 1)); } } } } $sql_where .= ')'; return trim($sql_where); } function aggregate_format_text($text, $filter) { $items = explode(' ', $filter); $tags = array(); foreach($items as $i) { $i = trim($i); $i = str_replace('(','',$i); $i = str_replace(')','',$i); if (strtolower($i) == 'and' || strtolower($i) == 'or') { continue; } if (substr_count($text, $i) !== false) { $tagno = rand(); $tags[$tagno] = $i; $text = str_replace($i, "<<$tagno>>", $text); } } if (cacti_sizeof($tags)) { foreach($tags as $k => $t) { $text = str_replace("<<$k>>", "" . html_escape($t) . "", $text); } } return $text; } function aggregate_graph() { global $graph_actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '', ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'local_graph_ids' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_agraph'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } ?>
    '> ' title=''> ' title=''>
    array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The title for the Aggregate Graphs')), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database identifier for this object')), 'name' => array('display' => __('Aggregate Template'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Aggregate Template that this Aggregate Graphs is based upon')), 'height' => array('display' => __('Size'), 'align' => 'right', 'sort' => 'ASC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false, 'aggregate_graphs.php?filter=' . get_request_var('filter')); if (cacti_sizeof($graph_list)) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ $template_name = html_escape($graph['name']); form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(filter_value(title_trim($graph['title_cache'], read_config_option('max_title_length')), get_request_var('filter'), 'aggregate_graphs.php?action=edit&id=' . $graph['local_graph_id']), $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'right'); form_selectable_cell((empty($graph['name']) ? '' . __('None') . '' : filter_value($template_name, get_request_var('filter'))), $graph['local_graph_id']); form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id'], '', 'right'); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } else { print '' . __('No Aggregate Graphs Found') .''; } html_end_box(false); if (cacti_sizeof($graph_list)) { print $nav; } /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($graph_actions); /* remove old graphs */ purge_old_graphs(); form_end(); } function purge_old_graphs() { /* workaround to handle purged graphs */ $old_graphs = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs_items AS pagi LEFT JOIN graph_local AS gl ON pagi.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); if (cacti_sizeof($old_graphs)) { db_execute('DELETE FROM aggregate_graphs_items WHERE local_graph_id IN (' . implode(',', $old_graphs) . ')'); } $old_aggregates = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); $old_agg_ids = array_rekey(db_fetch_assoc('SELECT DISTINCT pag.id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL'), 'id', 'id'); if (cacti_sizeof($old_aggregates)) { db_execute('DELETE FROM graph_templates_item WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM graph_templates_graph WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM aggregate_graphs WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); } if (cacti_sizeof($old_agg_ids)) { db_execute('DELETE FROM aggregate_graphs_items WHERE aggregate_graph_id IN (' . implode(',', $old_agg_ids) . ')'); } }