__x('dropdown action', 'Delete'), 2 => __x('dropdown action', 'Publish'), 3 => __x('dropdown action', 'Un-Publish'), 4 => __x('dropdown action', 'Un-Lock') ); /* set default action */ set_default_action(); if (get_request_var('action') != '') { /* ================= input validation and session storage ================= */ $filters = array( 'tree_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '' ), 'leaf_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '' ), 'graph_tree_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '' ), 'parent_item_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '' ), 'parent' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '/([_\-a-z:0-9#]+)/')), 'pageset' => true, 'default' => '' ), 'position' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '' ), 'nodeid' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '/([_\-a-z:0-9#]+)/')), 'pageset' => true, 'default' => '' ), 'id' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '/([_\-a-z:0-9#]+)/')), 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters); /* ================= input validation ================= */ } switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'sortasc': tree_sort_name_asc(); header('Location: tree.php?header=false'); break; case 'sortdesc': tree_sort_name_desc(); header('Location: tree.php?header=false'); break; case 'edit': top_header(); tree_edit(); bottom_footer(); break; case 'sites': display_sites(); break; case 'hosts': display_hosts(); break; case 'graphs': display_graphs(); break; case 'tree_up': tree_up(); break; case 'tree_down': tree_down(); break; case 'ajax_dnd': tree_dnd(); break; case 'lock': api_tree_lock(get_request_var('id'), $_SESSION['sess_user_id']); tree_edit(true); break; case 'unlock': api_tree_unlock(get_request_var('id'), $_SESSION['sess_user_id']); tree_edit(true); break; case 'copy_node': api_tree_copy_node(get_request_var('tree_id'), get_request_var('id'), get_request_var('parent'), get_request_var('position')); break; case 'create_node': api_tree_create_node(get_request_var('tree_id'), get_request_var('id'), get_request_var('position'), get_nfilter_request_var('text')); break; case 'delete_node': api_tree_delete_node(get_request_var('tree_id'), get_request_var('id')); break; case 'move_node': api_tree_move_node(get_request_var('tree_id'), get_request_var('id'), get_request_var('parent'), get_request_var('position')); break; case 'rename_node': api_tree_rename_node(get_request_var('tree_id'), get_request_var('id'), get_nfilter_request_var('text')); break; case 'get_node': api_tree_get_node(get_request_var('tree_id'), get_request_var('id')); break; case 'get_host_sort': get_host_sort_type(); break; case 'set_host_sort': set_host_sort_type(); break; case 'get_branch_sort': get_branch_sort_type(); break; case 'set_branch_sort': set_branch_sort_type(); break; default: top_header(); tree(); bottom_footer(); break; } function tree_get_max_sequence() { $max_seq = db_fetch_cell('SELECT MAX(sequence) FROM graph_tree'); if ($max_seq == NULL) { return 0; } return $max_seq; } function tree_check_sequences() { $bad_seq = db_fetch_cell('SELECT COUNT(sequence) FROM graph_tree WHERE sequence <= 0'); $dup_seq = db_fetch_cell('SELECT SUM(count) FROM ( SELECT sequence, COUNT(sequence) AS count FROM graph_tree GROUP BY sequence ) AS t WHERE t.count > 1'); // report any bad or duplicate sequences to the log for reporting purposes if ($bad_seq > 0) { cacti_log('WARN: Found ' . $bad_seq . ' Sequences in graph_tree Table', false, 'TREE', POLLER_VERBOSITY_HIGH); } if ($dup_seq > 0) { cacti_log('WARN: Found ' . $dup_seq . ' Sequences in graph_tree Table', false, 'TREE', POLLER_VERBOSITY_HIGH); } if ($bad_seq > 0 || $dup_seq > 0) { // resequence the list so it has no gaps, and 0 values will appear at the top // since thats where they would have been displayed db_execute('SET @seq = 0; UPDATE graph_tree SET sequence = (@seq:=@seq+1) ORDER BY sequence, id;'); } } function tree_sort_name_asc() { // resequence the list so it has no gaps, alphabetically ascending db_execute('SET @seq = 0; UPDATE graph_tree SET sequence = (@seq:=@seq+1) ORDER BY name;'); } function tree_sort_name_desc() { // resequence the list so it has no gaps, alphabetically ascending db_execute('SET @seq = 0; UPDATE graph_tree SET sequence = (@seq:=@seq+1) ORDER BY name DESC;'); } function tree_down() { tree_check_sequences(); $tree_id = get_filter_request_var('id'); $seq = db_fetch_cell_prepared('SELECT sequence FROM graph_tree WHERE id = ?', array($tree_id)); $new_seq = $seq + 1; /* update the old tree first */ db_execute_prepared('UPDATE graph_tree SET sequence = ? WHERE sequence = ?', array($seq, $new_seq)); /* update the tree in question */ db_execute_prepared('UPDATE graph_tree SET sequence = ? WHERE id = ?', array($new_seq, $tree_id)); header('Location: tree.php?header=false'); exit; } function tree_up() { tree_check_sequences(); $tree_id = get_filter_request_var('id'); $seq = db_fetch_cell_prepared('SELECT sequence FROM graph_tree WHERE id = ?', array($tree_id)); $new_seq = $seq - 1; /* update the old tree first */ db_execute_prepared('UPDATE graph_tree SET sequence = ? WHERE sequence = ?', array($seq, $new_seq)); /* update the tree in question */ db_execute_prepared('UPDATE graph_tree SET sequence = ? WHERE id = ?', array($new_seq, $tree_id)); header('Location: tree.php?header=false'); exit; } function tree_dnd() { if (isset_request_var('tree_ids') && is_array(get_nfilter_request_var('tree_ids'))) { $tids = get_nfilter_request_var('tree_ids'); $sequence = 1; foreach($tids as $id) { $id = str_replace('line', '', $id); input_validate_input_number($id); db_execute_prepared('UPDATE graph_tree SET sequence = ? WHERE id = ?', array($sequence, $id)); $sequence++; } /** * Save the last time a tree branch was created/updated * for Caching. */ set_config_option('time_last_change_branch', time()); } header('Location: tree.php?header=false'); exit; } function get_host_sort_type() { if (isset_request_var('nodeid')) { $ndata = explode('_', get_request_var('nodeid')); if (cacti_sizeof($ndata)) { foreach($ndata as $n) { $parts = explode(':', $n); if (isset($parts[0]) && $parts[0] == 'tbranch') { $branch = $parts[1]; input_validate_input_number($branch); $sort_type = db_fetch_cell_prepared('SELECT host_grouping_type FROM graph_tree_items WHERE id = ?', array($branch)); if ($sort_type == HOST_GROUPING_GRAPH_TEMPLATE) { print 'hsgt'; } else { print 'hsdq'; } } } } } else { return ''; } } function set_host_sort_type() { $type = ''; $branch = ''; /* clean up type string */ if (isset_request_var('type')) { set_request_var('type', sanitize_search_string(get_request_var('type'))); } if (isset_request_var('nodeid')) { $ndata = explode('_', get_request_var('nodeid')); if (cacti_sizeof($ndata)) { foreach($ndata as $n) { $parts = explode(':', $n); if (isset($parts[0]) && $parts[0] == 'tbranch') { $branch = $parts[1]; input_validate_input_number($branch); if (get_request_var('type') == 'hsgt') { $type = HOST_GROUPING_GRAPH_TEMPLATE; } else { $type = HOST_GROUPING_DATA_QUERY_INDEX; } db_execute_prepared('UPDATE graph_tree_items SET host_grouping_type = ? WHERE id = ?', array($type, $branch)); break; } } } } return; } function get_branch_sort_type() { if (isset_request_var('nodeid')) { $ndata = explode('_', get_request_var('nodeid')); if (cacti_sizeof($ndata)) { foreach($ndata as $n) { $parts = explode(':', $n); if (isset($parts[0]) && $parts[0] == 'tbranch') { $branch = $parts[1]; input_validate_input_number($branch); $sort_type = db_fetch_cell_prepared('SELECT sort_children_type FROM graph_tree_items WHERE id = ?', array($branch)); switch($sort_type) { case TREE_ORDERING_INHERIT: print __x('ordering of tree items', 'inherit'); break; case TREE_ORDERING_NONE: print __x('ordering of tree items', 'manual'); break; case TREE_ORDERING_ALPHABETIC: print __x('ordering of tree items', 'alpha'); break; case TREE_ORDERING_NATURAL: print __x('ordering of tree items', 'natural'); break; case TREE_ORDERING_NUMERIC: print __x('ordering of tree items', 'numeric'); break; default: print ''; break; } break; } } } } else { print ''; } } function set_branch_sort_type() { $type = ''; $branch = ''; /* clean up type string */ if (isset_request_var('type')) { set_request_var('type', sanitize_search_string(get_request_var('type'))); } if (isset_request_var('nodeid')) { $ndata = explode('_', get_request_var('nodeid')); if (cacti_sizeof($ndata)) { foreach($ndata as $n) { $parts = explode(':', $n); if (isset($parts[0]) && $parts[0] == 'tbranch') { $branch = $parts[1]; input_validate_input_number($branch); switch(get_request_var('type')) { case 'inherit': $type = TREE_ORDERING_INHERIT; break; case 'manual': $type = TREE_ORDERING_NONE; break; case 'alpha': $type = TREE_ORDERING_ALPHABETIC; break; case 'natural': $type = TREE_ORDERING_NATURAL; break; case 'numeric': $type = TREE_ORDERING_NUMERIC; break; default: break; } if (is_numeric($type) && is_numeric($branch)) { db_execute_prepared('UPDATE graph_tree_items SET sort_children_type = ? WHERE id = ?', array($type, $branch)); } $first_child = db_fetch_row_prepared('SELECT id, graph_tree_id FROM graph_tree_items WHERE parent = ? ORDER BY position LIMIT 1', array($branch)); if (!empty($first_child)) { api_tree_sort_branch($first_child['id'], $first_child['graph_tree_id']); } break; } } } } } /* -------------------------- The Save Function -------------------------- */ function form_save() { /* clear graph tree cache on save - affects current user only, other users should see changes in <5 minutes */ if (isset($_SESSION['dhtml_tree'])) { unset($_SESSION['dhtml_tree']); } if (isset_request_var('save_component_tree')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('sequence'); /* ==================================================== */ if (get_filter_request_var('id') > 0) { $prev_order = db_fetch_cell_prepared('SELECT sort_type FROM graph_tree WHERE id = ?', array(get_request_var('id'))); } else { $prev_order = 1; } $save['id'] = get_request_var('id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['sort_type'] = form_input_validate(get_nfilter_request_var('sort_type'), 'sort_type', '', true, 3); $save['last_modified'] = date('Y-m-d H:i:s', time()); $save['enabled'] = get_nfilter_request_var('enabled') == 'true' ? 'on':'-'; $save['modified_by'] = $_SESSION['sess_user_id']; if (isempty_request_var('sequence')) { $save['sequence'] = tree_get_max_sequence() + 1; } else { $save['sequence'] = get_request_var('sequence'); } if (empty($save['id'])) { $save['user_id'] = $_SESSION['sess_user_id']; } if (!is_error_message()) { $tree_id = sql_save($save, 'graph_tree'); if ($tree_id) { raise_message(1); /* sort the tree using the algorithm chosen by the user */ if ($save['sort_type'] != $prev_order) { if ($save['sort_type'] != TREE_ORDERING_NONE) { sort_recursive(0, $tree_id); } } if (empty($save['id'])) { /** * Save the last time a tree was created/updated * for Caching. */ set_config_option('time_last_change_tree', time()); } } else { raise_message(2); } } header("Location: tree.php?header=false&action=edit&id=$tree_id"); exit; } } function sort_recursive($branch, $tree_id) { $leaves = db_fetch_assoc_prepared('SELECT * FROM graph_tree_items WHERE graph_tree_id = ? AND parent = ? AND local_graph_id = 0 AND host_id = 0', array($tree_id, $branch)); if (cacti_sizeof($leaves)) { foreach($leaves as $leaf) { if ($leaf['sort_children_type'] == TREE_ORDERING_INHERIT) { $first_child = db_fetch_cell_prepared('SELECT id FROM graph_tree_items WHERE parent = ?', array($leaf['id'])); if (!empty($first_child)) { api_tree_sort_branch($first_child, $tree_id); if (leaves_exist($leaf['id'], $tree_id)) { sort_recursive($first_child, $tree_id); } } } } } } function leaves_exist($parent, $tree_id) { return db_fetch_assoc_prepared('SELECT COUNT(*) FROM graph_tree_items WHERE graph_tree_id = ? AND parent = ? AND local_graph_id = 0 AND host_id = 0', array($tree_id, $parent)); } /* ----------------------- Tree Item Functions ----------------------- */ function form_actions() { global $tree_actions; /* ================= 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_nfilter_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM graph_tree WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM graph_tree_items WHERE ' . array_to_sql_or($selected_items, 'graph_tree_id')); /** * Save the last time a tree or branch was created/updated * for Caching. */ set_config_option('time_last_change_tree', time()); set_config_option('time_last_change_branch', time()); } elseif (get_nfilter_request_var('drp_action') == '2') { // publish db_execute("UPDATE graph_tree SET enabled='on', last_modified=NOW(), modified_by=" . $_SESSION['sess_user_id'] . ' WHERE ' . array_to_sql_or($selected_items, 'id')); /** * Save the last time a tree or branch was created/updated * for Caching. */ set_config_option('time_last_change_tree', time()); set_config_option('time_last_change_branch', time()); } elseif (get_nfilter_request_var('drp_action') == '3') { // un-publish db_execute("UPDATE graph_tree SET enabled='', last_modified=NOW(), modified_by=" . $_SESSION['sess_user_id'] . ' WHERE ' . array_to_sql_or($selected_items, 'id')); /** * Save the last time a tree or branch was created/updated * for Caching. */ set_config_option('time_last_change_tree', time()); set_config_option('time_last_change_branch', time()); } elseif (get_nfilter_request_var('drp_action') == '4') { // un-lock db_execute("UPDATE graph_tree SET locked=0, last_modified=NOW(), modified_by=" . $_SESSION['sess_user_id'] . ' WHERE ' . array_to_sql_or($selected_items, 'id')); } } header('Location: tree.php?header=false'); exit; } /* setup some variables */ $tree_list = ''; $i = 0; /* loop through each of the selected items */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $tree_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM graph_tree WHERE id = ?', array($matches[1]))) . '
  • '; $tree_array[$i] = $matches[1]; $i++; } } top_header(); form_start('tree.php'); html_start_box($tree_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($tree_array) && cacti_sizeof($tree_array)) { if (get_nfilter_request_var('drp_action') == '1') { // delete print "

    " . __n('Click \'Continue\' to delete the following Tree.', 'Click \'Continue\' to delete following Trees.', cacti_sizeof($tree_array)) . "

    \n"; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '2') { // publish print "

    " . __n('Click \'Continue\' to publish the following Tree.', 'Click \'Continue\' to publish following Trees.', cacti_sizeof($tree_array)) . "

    \n"; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '3') { // un-publish print "

    " . __n('Click \'Continue\' to un-publish the following Tree.', 'Click \'Continue\' to un-publish following Trees.', cacti_sizeof($tree_array)) . "

    \n"; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '4') { // un-lock print "

    " . __n('Click \'Continue\' to un-lock the following Tree.', 'Click \'Continue\' to un-lock following Trees.', cacti_sizeof($tree_array)) . "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: tree.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* --------------------- Tree Functions --------------------- */ function tree_edit($partial = false) { global $fields_tree_edit; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('type'); /* ==================================================== */ load_current_session_value('type', 'sess_tree_edit_type', '0'); if (!isempty_request_var('id')) { $tree = db_fetch_row_prepared('SELECT * FROM graph_tree WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('Trees [edit: %s]', $tree['name']); // Reset the cookie state if tree id has changed if (isset($_SESSION['sess_tree_id']) && $_SESSION['sess_tree_id'] != get_request_var('id')) { $select_first = true; } else { $select_first = false; } $_SESSION['sess_tree_id'] = get_request_var('id'); } else { $tree = array(); $header_label = __('Trees [new]'); } print '
    '; form_start('tree.php', 'tree_edit'); // Remove inherit from the main tree option unset($fields_tree_edit['sort_type']['array'][0]); html_start_box($header_label, '100%', true, '3', 'center', ''); if (!cacti_sizeof($tree)) { unset($fields_tree_edit['enabled']); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_tree_edit, (isset($tree) ? $tree : array())) ) ); html_end_box(true, true); $lockdiv = ''; $editable = true; if (isset($tree['locked']) && $tree['locked'] == 0) { $lockdiv = "
    " . __('To Edit this tree, you must first lock it by pressing the Edit Tree button.') . "
    \n"; $editable = false; } elseif (isset($tree['locked']) && $tree['locked'] == 1) { $lockdiv = "
    " . __('This tree has been locked for Editing on %s by %s.', $tree['locked_date'], get_username($tree['modified_by'])); if ($tree['modified_by'] == $_SESSION['sess_user_id']) { $lockdiv .= '
    '; } else { $editable = false; $lockdiv .= __('To edit the tree, you must first unlock it and then lock it as yourself') . '
    '; } } else { $tree['id'] = 0; } if ($editable) { form_save_button('tree.php', 'return'); } if (!isempty_request_var('id')) { print $lockdiv; } print ''; if ($partial) { return; } if (!isempty_request_var('id')) { print "\n"; print "\n"; print ""; print "\n"; html_end_box(); print "\n"; html_end_box(); print "\n"; html_end_box(); print "\n"; html_end_box(); print "
    "; print ""; print "
    " . __('Display') . "\n"; print "
    \n"; html_start_box(__('Tree Items'), '100%', '', '3', 'center', ''); print "
    \n"; html_start_box(__('Available Sites'), '100%', '', '3', 'center', ''); ?>
    '>
    \n"; html_start_box(__('Available Devices'), '100%', '', '3', 'center', ''); ?>
    '>
    \n"; html_start_box(__('Available Graphs'), '100%', '', '3', 'center', ''); ?>
    '>
    \n"; ?>
  • " . html_escape($s['name']) . "
  • \n"; } } } function display_hosts() { $sql_where = ''; $site_ids = get_filter_request_var('site_id', FILTER_VALIDATE_IS_NUMERIC_LIST); if (get_nfilter_request_var('filter') != '') { $sql_where .= 'h.hostname LIKE ' . db_qstr('%' . get_nfilter_request_var('filter') . '%') . ' OR h.description LIKE ' . db_qstr('%' . get_nfilter_request_var('filter') . '%'); } if ($site_ids != '') { $sql_where .= ($sql_where != '' ? ' AND ':'') . 'h.site_id IN( ' . $site_ids . ')'; } $hosts = get_allowed_devices($sql_where, 'description', read_config_option('autocomplete_rows')); if (cacti_sizeof($hosts)) { foreach($hosts as $h) { print "\n"; } } } function display_graphs() { $sql_where = ''; $site_ids = get_filter_request_var('site_id', FILTER_VALIDATE_IS_NUMERIC_LIST); $host_ids = get_filter_request_var('host_id', FILTER_VALIDATE_IS_NUMERIC_LIST); if (get_nfilter_request_var('filter') != '') { $sql_where .= 'WHERE ( title_cache LIKE ' . db_qstr('%' . get_nfilter_request_var('filter') . '%') . ' OR gt.name LIKE ' . db_qstr('%' . get_nfilter_request_var('filter') . '%') . ') AND local_graph_id > 0'; } else { $sql_where .= 'WHERE local_graph_id > 0'; } if ($site_ids != '') { $sql_where .= ($sql_where != '' ? ' AND ': 'WHERE ') . 'h.site_id IN( ' . $site_ids . ')'; } if ($host_ids != '') { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'gl.host_id IN( ' . $host_ids . ')'; } $graphs = db_fetch_assoc("SELECT gtg.local_graph_id AS id, gtg.title_cache AS title, gt.name AS template_name FROM graph_templates_graph AS gtg LEFT JOIN graph_templates AS gt ON gt.id=gtg.graph_template_id LEFT JOIN graph_local AS gl ON gtg.local_graph_id = gl.id LEFT JOIN host as h ON gl.host_id = h.id $sql_where ORDER BY title_cache LIMIT " . read_config_option('autocomplete_rows')); if (cacti_sizeof($graphs)) { foreach($graphs as $g) { if (is_graph_allowed($g['id'])) { print "'; } } } } function tree() { global $tree_actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_CALLBACK, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'sequence', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_tree'); /* ================= input validation ================= */ /* if the number of rows is -1, set it to the default */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } ?> 'tree.php?action=edit', 'callback' => true, 'title' => __esc('Add Tree'), 'class' => 'fa fa-plus' ), array( 'href' => 'tree.php?action=sortasc', 'callback' => true, 'title' => __esc('Sort Trees Ascending'), 'class' => 'fa fa-sort-alpha-down' ), array( 'href' => 'tree.php?action=sortdesc', 'callback' => true, 'title' => __esc('Sort Trees Descending'), 'class' => 'fa fa-sort-alpha-up' ) ); html_start_box(__('Trees'), '100%', '', '3', 'center', $buttons); ?>
    '> ' title=''> ' title=''>
    0 THEN 1 ELSE 0 END) AS hosts, SUM(CASE WHEN ti.local_graph_id > 0 THEN 1 ELSE 0 END) AS graphs, SUM(CASE WHEN ti.local_graph_id = 0 AND host_id = 0 AND site_id = 0 THEN 1 ELSE 0 END) AS branches, SUM(CASE WHEN ti.site_id > 0 THEN 1 ELSE 0 END) AS sites FROM graph_tree AS t LEFT JOIN graph_tree_items AS ti ON t.id=ti.graph_tree_id $sql_where GROUP BY t.id $sql_order $sql_limit"); $sql = "SELECT COUNT(DISTINCT(t.id)) FROM graph_tree AS t LEFT JOIN graph_tree_items AS ti ON t.id=ti.graph_tree_id $sql_where"; $total_rows = get_total_row_data($_SESSION['sess_user_id'], $sql, array(), 'tree'); $nav = html_nav_bar('tree.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 11, __('Trees'), 'page', 'main'); form_start('tree.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'name' => array( 'display' => __('Tree Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name by which this Tree will be referred to as.') ), 'id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Tree. Useful when performing automation or debugging.') ), 'enabled' => array( 'display' => __('Published'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('Unpublished Trees cannot be viewed from the Graph tab') ), 'locked' => array( 'display' => __('Locked'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('A Tree must be locked in order to be edited.') ), 'user_id' => array( 'display' => __('Owner'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The original author of this Tree.') ), 'sequence' => array( 'display' => __('Order'), 'align' => 'center', 'sort' => 'ASC', 'tip' => __('To change the order of the trees, first sort by this column, press the up or down arrows once they appear.') ), 'last_modified' => array( 'display' => __('Last Edited'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The date that this Tree was last edited.') ), 'modified_by' => array( 'display' => __('Edited By'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The last user to have modified this Tree.') ), 'sites' => array( 'display' => __('Sites'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of Site Branches in this Tree.') ), 'branches' => array( 'display' => __('Branches'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of Branches in this Tree.') ), 'hosts' => array( 'display' => __('Devices'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of individual Devices in this Tree.') ), 'graphs' => array( 'display' => __('Graphs'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of individual Graphs in this Tree.') ) ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 1; if (cacti_sizeof($trees)) { foreach ($trees as $tree) { $sequence = ''; if (get_request_var('sort_column') == 'sequence' && get_request_var('sort_direction') == 'ASC') { if ($i == 1 && cacti_sizeof($trees) == 1) { $sequence .= ''; $sequence .= ''; } elseif ($i == 1) { $sequence .= ''; $sequence .= ''; } elseif ($i == cacti_sizeof($trees)) { $sequence .= ''; $sequence .= ''; } else { $sequence .= ''; $sequence .= ''; } } form_alternate_row('line' . $tree['id'], true); form_selectable_cell(filter_value($tree['name'], get_request_var('filter'), 'tree.php?action=edit&id=' . $tree['id']), $tree['id']); form_selectable_cell($tree['id'], $tree['id'], '', 'right'); form_selectable_cell($tree['enabled'] == 'on' ? __('Yes'):__('No'), $tree['id']); form_selectable_cell($tree['locked'] == '1' ? __('Yes'):__('No'), $tree['id']); form_selectable_cell(get_username($tree['user_id']), $tree['id']); form_selectable_cell($sequence, $tree['id'], '', 'nowrap center'); form_selectable_cell(substr($tree['last_modified'],0,16), $tree['id'], '', 'right'); form_selectable_cell(get_username($tree['modified_by']), $tree['id'], '', 'right'); form_selectable_cell($tree['sites'] > 0 ? number_format_i18n($tree['sites'], '-1'):'-', $tree['id'], '', 'right'); form_selectable_cell($tree['branches'] > 0 ? number_format_i18n($tree['branches'], '-1'):'-', $tree['id'], '', 'right'); form_selectable_cell($tree['hosts'] > 0 ? number_format_i18n($tree['hosts'], '-1'):'-', $tree['id'], '', 'right'); form_selectable_cell($tree['graphs'] > 0 ? number_format_i18n($tree['graphs'], '-1'):'-', $tree['id'], '', 'right'); form_checkbox_cell($tree['name'], $tree['id']); form_end_row(); $i++; } } else { print "" . __('No Trees Found') . ""; } html_end_box(false); if (cacti_sizeof($trees)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($tree_actions); form_end(); if (get_request_var('sort_column') == 'sequence' && get_request_var('sort_direction') == 'ASC') { ?>