mirror of
https://github.com/Cacti/cacti.git
synced 2026-10-29 08:06:58 +09:00
* spelling: about Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: accommodates Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: account Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: acquire Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: across Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: actual Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: addition Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: administrative Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: agent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: algorithms Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: amongst Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: anchor Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: appropriate Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: archive Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: arguments Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: assuming Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: asynchronously Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: attachments Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: attribute Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: availability Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: behaves Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: being Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: branch Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: calculate Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: callback Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: case of Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: certainly Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: changes Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: characters Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: coalition Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: column Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: configuration Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: confirm Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: connect to Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: consistently Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: containing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: convert Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: corrected Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: current Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: data Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: datasource Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: default Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: delimited Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: delimiter Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: deprecated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: description Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: destination Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: determines Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: device Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: devices Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnosing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dimensional Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: directory Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: disabling Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: distribution Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: documentation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dynamically Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: embedded Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: enough Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: especially Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: everything is Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: everything Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: example Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exceeds Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exclude Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicitly Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exported Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: extract Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: extraneous Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: failed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: fails Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: fallback Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: fashioned Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: field values Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: foreground Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: format Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: function Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: functions Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: gauge Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: get Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: github Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: global Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: graph Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: gzipped Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: hierarchy Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: identify Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: immediately Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: increase Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: increment Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: indexes Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: inefficient Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: inherited Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: initialize Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: installation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: insufficient Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: irrelevant Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: label Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: latest Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: leaves Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: local Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: location Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: lockout Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: logging Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: manually Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: menus Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: minimum Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: modifiable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: multi Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: multiple Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: mutually Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: naturally Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: navigation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: necessary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: network Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: number Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: occurrences Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: only Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: output Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: override Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: package Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameters Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: perform Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: performing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: permanently Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: permission Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: piece Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: plugin Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: prevent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: programmatically Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: propagated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: purpose Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: purposes Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: push Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: queries Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: refresh Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: relevant Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: remainder Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: repetitions Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: representing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: reserved Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: resetting Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: response Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: responsible Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: results Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: routines Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: running Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: section Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: separate Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: sequences Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: session Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: settings Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: setup Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: snmp Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: some Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specific Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specification Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: stacked Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: statistics Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: string Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structured Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: successful Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: successfully Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: suggested Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: suppress Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: suppresses Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: switches Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: synchronization Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: synchronize Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: table Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: temperature Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: template Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: temporary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: textarea Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: themselves Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: therefore Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: thoroughly Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: through Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: time Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: timed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: timespan Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: tries Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: true Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: uninstall Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unless Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unlocks Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: up to Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: update Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: updating Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: useful Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: utility Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: variable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: version Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: visibility Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: what is Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: when Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: whether Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: written Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
1567 lines
52 KiB
PHP
1567 lines
52 KiB
PHP
<?php
|
|
/*
|
|
+-------------------------------------------------------------------------+
|
|
| Copyright (C) 2004-2022 The Cacti Group |
|
|
| |
|
|
| This program is free software; you can redistribute it and/or |
|
|
| modify it under the terms of the GNU General Public License |
|
|
| as published by the Free Software Foundation; either version 2 |
|
|
| of the License, or (at your option) any later version. |
|
|
| |
|
|
| This program is distributed in the hope that it will be useful, |
|
|
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
| GNU General Public License for more details. |
|
|
+-------------------------------------------------------------------------+
|
|
| Cacti: The Complete RRDtool-based Graphing Solution |
|
|
+-------------------------------------------------------------------------+
|
|
| This code is designed, written, and maintained by the Cacti Group. See |
|
|
| about.php and/or the AUTHORS file for specific developer information. |
|
|
+-------------------------------------------------------------------------+
|
|
| http://www.cacti.net/ |
|
|
+-------------------------------------------------------------------------+
|
|
*/
|
|
|
|
function process_tree_settings() {
|
|
global $current_user;
|
|
|
|
if (isset_request_var('hide')) {
|
|
if ((get_request_var('hide') == '0') || (get_request_var('hide') == '1')) {
|
|
/* only update expand/contract info is this user has rights to keep their own settings */
|
|
if ((isset($current_user)) && ($current_user['graph_settings'] == 'on')) {
|
|
db_execute_prepared('DELETE FROM settings_tree
|
|
WHERE graph_tree_item_id = ?
|
|
AND user_id = ?',
|
|
array(get_request_var('branch_id'), $_SESSION['sess_user_id']));
|
|
|
|
db_execute_prepared('INSERT INTO settings_tree
|
|
(graph_tree_item_id, user_id,status)
|
|
VALUES (?, ?, ?)',
|
|
array(get_request_var('branch_id'), $_SESSION['sess_user_id'], get_request_var('hide')));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function grow_dropdown_tree($tree_id, $parent = 0, $form_name = '', $selected_tree_item_id = '', $tier = 0) {
|
|
global $config;
|
|
|
|
$tier++;
|
|
|
|
$branches = db_fetch_assoc_prepared('SELECT gti.id, gti.title, parent
|
|
FROM graph_tree_items AS gti
|
|
WHERE gti.graph_tree_id = ?
|
|
AND gti.host_id = 0
|
|
AND gti.local_graph_id = 0
|
|
AND parent = ?
|
|
ORDER BY parent, position',
|
|
array($tree_id, $parent));
|
|
|
|
if ($parent == 0) {
|
|
print "<select name='$form_name' id='$form_name'>\n";
|
|
print "<option value='0'>[root]</option>\n";
|
|
}
|
|
|
|
if (cacti_sizeof($branches)) {
|
|
foreach ($branches as $leaf) {
|
|
if ($leaf['parent'] == 0) {
|
|
$tier = 1;
|
|
}
|
|
|
|
$indent = str_repeat('-', $tier);
|
|
|
|
if ($selected_tree_item_id == $leaf['id']) {
|
|
$html_selected = ' selected';
|
|
} else {
|
|
$html_selected = '';
|
|
}
|
|
|
|
print "<option value='" . $leaf['id'] . "'$html_selected>$indent " . html_escape($leaf['title']) . '</option>';
|
|
|
|
grow_dropdown_tree($tree_id, $leaf['id'], $form_name, $selected_tree_item_id, $tier);
|
|
}
|
|
}
|
|
|
|
if ($parent == 0) {
|
|
print "</select>\n";
|
|
}
|
|
}
|
|
|
|
function grow_dhtml_trees() {
|
|
global $config;
|
|
|
|
include_once($config['library_path'] . '/data_query.php');
|
|
|
|
html_validate_tree_vars();
|
|
|
|
$default_tree_id = read_user_setting('default_tree_id');
|
|
|
|
if (empty($default_tree_id)) {
|
|
$user = db_fetch_row_prepared('SELECT policy_trees
|
|
FROM user_auth
|
|
WHERE id = ?',
|
|
array($_SESSION['sess_user_id']));
|
|
|
|
if ($user['policy_trees'] == 1) {
|
|
$default_tree_id = db_fetch_cell_prepared('SELECT graph_tree.id
|
|
FROM graph_tree
|
|
LEFT JOIN user_auth_perms ON user_auth_perms.item_id = graph_tree.id
|
|
AND user_auth_perms.type = 2
|
|
AND user_auth_perms.user_id = ?
|
|
WHERE user_auth_perms.item_id IS NULL
|
|
AND graph_tree.enabled = "on"
|
|
ORDER BY graph_tree.id
|
|
LIMIT 1',
|
|
array($_SESSION['sess_user_id']));
|
|
} else {
|
|
$default_tree_id = db_fetch_cell('SELECT graph_tree.id
|
|
FROM graph_tree
|
|
INNER JOIN user_auth_perms ON user_auth_perms.item_id = graph_tree.id
|
|
AND user_auth_perms.type = 2
|
|
AND user_auth_perms.user_id = ?
|
|
WHERE graph_tree.enabled = "on"
|
|
ORDER BY graph_tree.id
|
|
LIMIT 1',
|
|
array($_SESSION['sess_user_id']));
|
|
}
|
|
} else {
|
|
$default_tree_id = db_fetch_cell('SELECT id FROM graph_tree ORDER BY sequence LIMIT 1');
|
|
}
|
|
|
|
print "<div class='cactiTreeSearch' style='white-space:nowrap'><span style='padding-right:4px;'>" . __('Search') . "</span><input type='text' class='ui-state-default ui-corner-all' id='searcher' style='padding:2px;font-size:12px;max-width:200px;' size='35'><hr></div>\n";
|
|
|
|
$dhtml_tree = create_dhtml_tree();
|
|
if (cacti_sizeof($dhtml_tree)) {
|
|
print "<div id='jstree'></div>\n";
|
|
}
|
|
|
|
?>
|
|
<script type='text/javascript'>
|
|
<?php
|
|
if (isset_request_var('hyper')) {
|
|
$path = json_encode(get_tree_path());
|
|
?>var nodes = <?php print $path;?>;<?php
|
|
} else {
|
|
?>var nodes = [];<?php
|
|
}
|
|
?>
|
|
|
|
var search_to = false;
|
|
|
|
<?php
|
|
if (read_user_setting('tree_history') != 'on') {
|
|
print 'window.onunload = function() { localStorage.removeItem(\'graph_tree_history\'); }';
|
|
}
|
|
?>
|
|
|
|
function checkTreeForLogout() {
|
|
html = $('#jstree').html();
|
|
found = html.indexOf('<?php print __('Login to Cacti');?>');
|
|
if (found >= 0) {
|
|
document.location = 'logout.php';
|
|
}
|
|
}
|
|
|
|
function openNodes() {
|
|
if (nodes.length > 0) {
|
|
var deffereds = $.Deferred(function (def) { def.resolve(); });
|
|
var lastNode = nodes[nodes.length-1];
|
|
|
|
for (var j = 0; j <= nodes.length-1; j++) {
|
|
deffereds = (function(name, deferreds) {
|
|
return deferreds.pipe(function () {
|
|
return $.Deferred(function(def) {
|
|
id = $('a[id^='+name+']').first().attr('id');
|
|
|
|
if (lastNode == name) {
|
|
$('#jstree').jstree('select_node', id, function() {
|
|
def.resolve();
|
|
});
|
|
} else {
|
|
$('#jstree').jstree('open_node', id, function() {
|
|
$('.cactiConsoleNavigationArea').css('overflow-y', 'auto');
|
|
def.resolve();
|
|
});
|
|
}
|
|
});
|
|
});
|
|
})(nodes[j], deffereds);
|
|
}
|
|
}
|
|
}
|
|
|
|
$(function () {
|
|
$('#jstree').each(function(data) {
|
|
var id=$(this).attr('id');
|
|
|
|
$(this)
|
|
.on('init.jstree', function() {
|
|
if (nodes.length > 0) {
|
|
$('#jstree').jstree().clear_state();
|
|
}
|
|
resizeTreePanel();
|
|
})
|
|
.on('loaded.jstree', function() {
|
|
openNodes();
|
|
resizeTreePanel();
|
|
})
|
|
.on('ready.jstree', function() {
|
|
resizeTreePanel();
|
|
})
|
|
.on('changed.jstree', function() {
|
|
resizeTreePanel();
|
|
})
|
|
.on('before_open.jstree', function() {
|
|
checkTreeForLogout();
|
|
})
|
|
.on('after_open.jstree', function() {
|
|
resizeTreePanel();
|
|
responsiveResizeGraphs();
|
|
})
|
|
.on('after_close.jstree', function() {
|
|
resizeTreePanel();
|
|
responsiveResizeGraphs();
|
|
})
|
|
.on('select_node.jstree', function(e, data) {
|
|
if (data.node.id) {
|
|
if (data.node.id.search('tree_anchor') >= 0) {
|
|
href=$('#'+data.node.id).find('a:first').attr('href');
|
|
} else {
|
|
href=$('#'+data.node.id).find('a:first').attr('href');
|
|
}
|
|
|
|
origHref = href;
|
|
|
|
if (typeof href !== 'undefined') {
|
|
href = href.replace('action=tree', 'action=tree_content');
|
|
href = href + '&hyper=true';
|
|
$('.cactiGraphContentArea').hide();
|
|
loadPage(href);
|
|
}
|
|
|
|
node = data.node.id;
|
|
}
|
|
resizeTreePanel();
|
|
})
|
|
.jstree({
|
|
'types' : {
|
|
'tree' : {
|
|
icon : urlPath+'images/tree.png',
|
|
max_children : 0
|
|
},
|
|
'device' : {
|
|
icon : urlPath+'images/server.png',
|
|
max_children : 0
|
|
},
|
|
'graph' : {
|
|
icon : urlPath+'images/server_chart_curve.png',
|
|
max_children : 0
|
|
},
|
|
'graph_template' : {
|
|
icon : urlPath+'images/server_chart.png',
|
|
max_children : 0
|
|
},
|
|
'data_query' : {
|
|
icon : urlPath+'images/server_dataquery.png',
|
|
max_children : 0
|
|
},
|
|
'site' : {
|
|
icon : urlPath+'images/site.png',
|
|
max_children : 0
|
|
},
|
|
'location' : {
|
|
icon : urlPath+'images/location.png',
|
|
max_children : 0
|
|
},
|
|
'host_template' : {
|
|
icon : urlPath+'images/server_device_template.png',
|
|
max_children : 0
|
|
},
|
|
'graph_templates' : {
|
|
icon : urlPath+'images/server_graph_template.png',
|
|
max_children : 0
|
|
}
|
|
},
|
|
'core' : {
|
|
'data' : {
|
|
'url' : urlPath+'graph_view.php?action=get_node&tree_id=0',
|
|
'data' : function(node) {
|
|
return { 'id' : node.id }
|
|
}
|
|
},
|
|
'animation' : 0,
|
|
'check_callback' : false
|
|
},
|
|
'themes' : {
|
|
'name' : 'default',
|
|
'responsive' : true,
|
|
'url' : true,
|
|
'dots' : false
|
|
},
|
|
'state' : { 'key' : 'graph_tree_history' },
|
|
'search' : { 'case_sensitive' : false, 'show_only_matches' : true, 'ajax' : { 'url' : urlPath+'graph_view.php?action=ajax_search'} },
|
|
'plugins' : [ 'types', 'state', 'wholerow', 'search' ]
|
|
});
|
|
});
|
|
|
|
$('#searcher').keyup(function() {
|
|
if(search_to) { clearTimeout(search_to); }
|
|
search_to = setTimeout(function() {
|
|
var v = $('#searcher').val();
|
|
$('#jstree').jstree('search', v, false);
|
|
}, 250);
|
|
});
|
|
|
|
<?php print api_plugin_hook_function('top_graph_jquery_function');?>
|
|
});
|
|
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
function get_tree_path() {
|
|
if (isset_request_var('node')) {
|
|
$nodes = array();
|
|
$nnodes = array();
|
|
$rnodes = array();
|
|
|
|
if (strpos(get_request_var('node'), 'tbranch') !== false) {
|
|
$parts = explode('-', get_request_var('node'));
|
|
$node = $parts[1];
|
|
|
|
$linknode = db_fetch_row_prepared('SELECT *
|
|
FROM graph_tree_items
|
|
WHERE id = ?',
|
|
array($node));
|
|
|
|
if (cacti_sizeof($linknode)) {
|
|
$nodes[] = 'tree_anchor-' . $linknode['graph_tree_id'] . '_anchor';
|
|
|
|
$nstack = 'tbranch-' . $linknode['id'];
|
|
|
|
if (get_request_var('site_id') > 0) {
|
|
$nstack .= '-site-' . get_request_var('site_id');
|
|
$nnodes[] = $nstack;
|
|
|
|
if (isset_request_var('gti')) {
|
|
$nstack .= '-gts';
|
|
$nnodes[] = $nstack;
|
|
} else {
|
|
if (get_request_var('host_template_id') > 0) {
|
|
$nstack .= '-ht-' . get_request_var('host_template_id');
|
|
$nnodes[] = $nstack;
|
|
}
|
|
|
|
if (get_request_var('host_id') > 0) {
|
|
$nstack .= '-host-' . get_request_var('host_id');
|
|
$nnodes[] = $nstack;
|
|
}
|
|
}
|
|
} else {
|
|
$nnodes[] = $nstack;
|
|
}
|
|
|
|
if (isset_request_var('hgd')) {
|
|
$parts = explode(':', get_request_var('hgd'));
|
|
switch($parts[0]) {
|
|
case 'gt':
|
|
$nnodes[] = $nstack . '-gt-' . $parts[1];
|
|
break;
|
|
case 'dq':
|
|
$nnodes[] = $nstack . '-dq-' . $parts[1];
|
|
break;
|
|
case 'dqi':
|
|
$nnodes[] = $nstack . '-dqi-' . $parts[1] . '-' . $parts[2];
|
|
$nnodes[] = $nstack . '-dq-' . $parts[1];
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
while (true) {
|
|
if ($linknode['parent'] > 0) {
|
|
$rnodes[] = 'tbranch-' . $linknode['parent'];
|
|
|
|
$linknode = db_fetch_row_prepared('SELECT *
|
|
FROM graph_tree_items
|
|
WHERE id = ?',
|
|
array($linknode['parent']));
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (cacti_sizeof($rnodes)) {
|
|
$rnodes = array_reverse($rnodes);
|
|
$nodes = array_merge($nodes, $rnodes);
|
|
}
|
|
|
|
if (cacti_sizeof($nnodes)) {
|
|
$nodes = array_merge($nodes, $nnodes);
|
|
}
|
|
} elseif (strpos(get_request_var('node'), 'tree_anchor') !== false) {
|
|
$parts = explode('-', get_request_var('node'));
|
|
$nodes[] = 'tree_anchor-' . $parts[1] . '_anchor';
|
|
}
|
|
|
|
return $nodes;
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
|
|
function get_device_leaf_class($host_id) {
|
|
$status = db_fetch_cell_prepared('SELECT status FROM host WHERE id = ?', array($host_id));
|
|
switch($status) {
|
|
case HOST_DOWN:
|
|
$class = 'deviceDown';
|
|
break;
|
|
case HOST_RECOVERING:
|
|
$class = 'deviceRecovering';
|
|
break;
|
|
case HOST_UP:
|
|
$class = 'deviceUp';
|
|
break;
|
|
case HOST_UNKNOWN:
|
|
$class = 'deviceUnknown';
|
|
break;
|
|
case HOST_ERROR:
|
|
$class = 'deviceError';
|
|
break;
|
|
default:
|
|
$class = '';
|
|
}
|
|
|
|
return $class;
|
|
}
|
|
|
|
function draw_dhtml_tree_level($tree_id, $parent = 0, $editing = false) {
|
|
$dhtml_tree = array();
|
|
|
|
$hierarchy = get_allowed_tree_level($tree_id, $parent, $editing);
|
|
|
|
if (cacti_sizeof($hierarchy)) {
|
|
$dhtml_tree[] = "\t\t\t<ul>\n";
|
|
foreach ($hierarchy as $leaf) {
|
|
if ($leaf['host_id'] > 0) {
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch:" . $leaf['id'] . "_thost:" . $leaf['host_id'] . "' data-jstree='{ \"type\" : \"device\" }'>" . html_escape(strip_domain($leaf['hostname'])) . "</li>\n";
|
|
} elseif ($leaf['site_id'] > 0) {
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch:" . $leaf['id'] . "_tsite:" . $leaf['site_id'] . "' data-jstree='{ \"type\" : \"site\" }'>" . html_escape($leaf['sitename']) . "</a></li>\n";
|
|
} elseif ($leaf['local_graph_id'] > 0) {
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch:" . $leaf['id'] . "_tgraph:" . $leaf['local_graph_id'] . "' data-jstree='{ \"type\" : \"graph\" }'>" . html_escape(get_graph_title_cache($leaf['local_graph_id'])) . "</a></li>\n";
|
|
} else {
|
|
$dhtml_tree[] = "\t\t\t\t<li class='jstree-closed' id='tbranch:" . $leaf['id'] . "'>" . html_escape($leaf['title']) . "</li>\n";
|
|
}
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t</ul>\n";
|
|
}
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function draw_dhtml_tree_level_graphing($tree_id, $parent = 0) {
|
|
global $config;
|
|
|
|
include_once($config['base_path'] . '/lib/data_query.php');
|
|
|
|
$hierarchy = get_allowed_tree_content($tree_id, $parent);
|
|
|
|
$dhtml_tree = array();
|
|
|
|
if (cacti_sizeof($hierarchy)) {
|
|
if ($tree_id > 0) {
|
|
$dhtml_tree[] = "\t\t\t<ul>\n";
|
|
|
|
foreach ($hierarchy as $leaf) {
|
|
if ($leaf['site_id'] > 0) { // It's a site
|
|
$dhtml_tree = array_merge($dhtml_tree, create_site_branch($leaf));
|
|
} elseif ($leaf['host_id'] > 0) { // It's a host
|
|
$dhtml_tree = array_merge($dhtml_tree, create_host_branch($leaf));
|
|
} else { //It's not a host
|
|
$dhtml_tree = array_merge($dhtml_tree, create_branch($leaf));
|
|
}
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t</ul>\n";
|
|
} else {
|
|
$dhtml_tree[] = "<ul>\n";
|
|
|
|
foreach($hierarchy as $h) {
|
|
$dhtml_tree[] = "<li id='tree_anchor-" . $h['tree_id'] . "' data-jstree='{ \"type\" : \"tree\" }' class='jstree-closed'><a href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tree_anchor-' . $h['tree_id'] . '&site_id=-1&host_id=-1&host_template_id=-1&hgd=') . "'>" . html_escape($h['title']) . "</a></li>\n";
|
|
}
|
|
|
|
$dhtml_tree[] = "</ul>\n";
|
|
}
|
|
}
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_site_branch($leaf) {
|
|
global $config, $unique_id;
|
|
|
|
$unique_id++;
|
|
|
|
$dhtml_tree = array();
|
|
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch-" . $leaf['id'] . "-site-" . $leaf['site_id'] . "' data-jstree='{ \"type\" : \"site\" }'><a href=\"" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&site_id=' . $leaf['site_id'] . '&host_id=-1&host_template_id=-1&hgd=') . '">' . html_escape($leaf['sitename']) . "</a>\n";
|
|
|
|
$devices = get_allowed_site_devices($leaf['site_id'], '', 'ht.name ASC, h1.description ASC');
|
|
$ht_name = '';
|
|
|
|
if (cacti_sizeof($devices)) {
|
|
$dhtml_tree[] = "\t\t\t\t\t<ul>\n";
|
|
|
|
foreach($devices as $d) {
|
|
if ($ht_name != $d['host_template_name']) {
|
|
if ($ht_name != '') {
|
|
$dhtml_tree[] = "</ul></li>\n";
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . '-site-' . $leaf['site_id'] . '-ht-' . $d['host_template_id'] . "' data-jstree='{ \"type\" : \"host_template\" }'><a href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&site_id=' . $leaf['site_id'] . '&host_template_id=' . $d['host_template_id'] . '&host_id=-1&hgd=') . "'>" . html_escape($d['host_template_name']) . "</a><ul>\n";
|
|
}
|
|
|
|
$hleaf = $leaf;
|
|
$hleaf['hostname'] = strip_domain($d['description']);
|
|
$hleaf['host_id'] = $d['id'];
|
|
|
|
$dhtml_tree = array_merge($dhtml_tree, create_host_branch($hleaf, $leaf['site_id'], $d['host_template_id']));
|
|
|
|
$ht_name = $d['host_template_name'];
|
|
}
|
|
$dhtml_tree[] = "</ul></li>\n";
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
}
|
|
|
|
// suppress total rows collection
|
|
$total_rows = -1;
|
|
|
|
$graph_templates = get_allowed_graph_templates('h.site_id=' . $leaf['site_id'], 'name', '', $total_rows);
|
|
|
|
if (cacti_sizeof($graph_templates)) {
|
|
$dhtml_tree[] = "\t\t\t\t\t\t<ul>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . '-site-' . $leaf['site_id'] . '-gts' . "' data-jstree='{ \"type\" : \"graph_templates\" }'><a href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&site_id=' . $leaf['site_id'] . '>i=-1&host_id=-1&host_template_id=-1&hgd=') . "'>" . __('Graph Templates') . "</a>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t<ul>\n";
|
|
|
|
foreach ($graph_templates as $graph_template) {
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . '-site-' . $leaf['site_id'] . '-gts-gt-' . $graph_template['id'] . "' data-jstree='{ \"type\" : \"graph_template\" }'><a href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&site_id=' . $leaf['site_id'] . '>i=' . $graph_template['id'] . '&host_id=' . $leaf['host_id'] . '&host_template_id=-1&hgd=gt:' . $graph_template['id']) . "'>" . html_escape($graph_template['name']) . "</a></li>\n";
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t</ul>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t\t</li>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t</li>\n";
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_branch($leaf) {
|
|
global $config;
|
|
|
|
$dhtml_tree = array();
|
|
|
|
$children = db_fetch_cell_prepared('SELECT COUNT(*)
|
|
FROM graph_tree_items
|
|
WHERE parent = ?
|
|
AND local_graph_id=0',
|
|
array($leaf['id']));
|
|
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch-" . $leaf['id'] . "' " . ($children > 0 ? "class='jstree-closed'":"") . "><a href=\"" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&site_id=-1&host_id=-1&host_template_id=-1&hgd=') . '">' . html_escape($leaf['title']) . "</a></li>\n";
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_host_branch($leaf, $site_id = -1, $ht = -1) {
|
|
global $config, $unique_id;
|
|
|
|
$unique_id++;
|
|
|
|
if (isset($leaf['host_id']) && $leaf['host_id'] > 0) {
|
|
$class = get_device_leaf_class($leaf['host_id']);
|
|
} else {
|
|
$class = '';
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t<li id='tbranch-" . $leaf['id'] . ($site_id > 0 ? '-site-' . $site_id:'') . ($ht > 0 ? '-ht-' . $ht:'') . '-host-' . $leaf['host_id'] . '-uid-' . $unique_id . "' data-jstree='{ \"type\" : \"device\" }'><a class='$class' href=\"" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&host_id=' . $leaf['host_id'] . '&site_id=' . $site_id . '&host_template_id=' . $ht .'&hgd=') . '">' . html_escape(strip_domain($leaf['hostname'])) . "</a>\n";
|
|
|
|
if (read_user_setting('expand_hosts') == 'on') {
|
|
if ($leaf['host_grouping_type'] == HOST_GROUPING_DATA_QUERY_INDEX) {
|
|
$dhtml_tree[] = "\t\t\t\t\t<ul>\n";
|
|
$dhtml_tree = array_merge($dhtml_tree, create_data_query_branch($leaf, $site_id, $ht));
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
} elseif ($leaf['host_grouping_type'] == HOST_GROUPING_GRAPH_TEMPLATE) {
|
|
$dhtml_tree[] = "\t\t\t\t\t<ul>\n";
|
|
$dhtml_tree = array_merge($dhtml_tree, create_graph_template_branch($leaf, $site_id, $ht));
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
} else {
|
|
$dhtml_tree[] = "\t\t\t\t\t<ul>\n";
|
|
$dhtml_tree = array_merge($dhtml_tree, create_graph_template_branch($leaf, $site_id, $ht));
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t<ul>\n";
|
|
$dhtml_tree = array_merge($dhtml_tree, create_data_query_branch($leaf, $site_id, $ht));
|
|
$dhtml_tree[] = "\t\t\t\t\t</ul>\n";
|
|
}
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t</li>\n";
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_graph_template_branch($leaf, $site_id = -1, $ht = -1) {
|
|
global $config, $unique_id;
|
|
|
|
$dhtml_tree = array();
|
|
|
|
// suppress total rows collection
|
|
$total_rows = -1;
|
|
|
|
$graph_templates = get_allowed_graph_templates('gl.host_id=' . $leaf['host_id'], 'name', '', $total_rows);
|
|
|
|
if (cacti_sizeof($graph_templates)) {
|
|
foreach ($graph_templates as $graph_template) {
|
|
$unique_id++;
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . ($site_id > 0 ? '-site-' . $site_id . ($ht > 0 ? '-ht-' . $ht:'') . '-host-' . $leaf['host_id']:'') . '-gt-' . $graph_template['id'] . "-uid-$unique_id' data-jstree='{ \"type\" : \"graph_template\" }'><a href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&host_id=' . $leaf['host_id'] . '&site_id=' . $site_id . '&host_template_id=' . $ht . '&hgd=gt:' . $graph_template['id']) . "'>" . html_escape($graph_template['name']) . "</a></li>\n";
|
|
}
|
|
}
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_data_query_branch($leaf, $site_id = -1, $ht = -1) {
|
|
global $config, $unique_id;
|
|
|
|
$dhtml_tree = array();
|
|
|
|
$data_queries = db_fetch_assoc_prepared('SELECT sq.id, sq.name
|
|
FROM graph_local AS gl
|
|
INNER JOIN snmp_query AS sq
|
|
ON gl.snmp_query_id=sq.id
|
|
AND gl.host_id = ?
|
|
GROUP BY sq.id
|
|
ORDER BY sq.name',
|
|
array($leaf['host_id']));
|
|
|
|
array_push($data_queries, array(
|
|
'id' => '0',
|
|
'name' => __('Non Query Based')
|
|
));
|
|
|
|
if (cacti_sizeof($data_queries)) {
|
|
if ($leaf['host_id'] > 0) {
|
|
$ntg = get_allowed_graphs('gl.host_id=' . $leaf['host_id'] . ' AND gl.snmp_query_id=0');
|
|
if (read_user_setting('show_aggregates', 'on') == 'on') {
|
|
$agg = get_allowed_aggregate_graphs('gl.host_id=' . $leaf['host_id'] . ' AND gl.snmp_query_id=0');
|
|
} else {
|
|
$agg = array();
|
|
}
|
|
} else {
|
|
$ntg = get_allowed_graphs('gl.snmp_query_id=0');
|
|
if (read_user_setting('show_aggregates', 'on') == 'on') {
|
|
$agg = get_allowed_aggregate_graphs('gl.snmp_query_id=0');
|
|
} else {
|
|
$agg = array();
|
|
}
|
|
}
|
|
|
|
$ntg = array_merge($ntg, $agg);
|
|
|
|
foreach ($data_queries as $data_query) {
|
|
if ($data_query['id'] == 0) {
|
|
$non_tg = $ntg;
|
|
$sfd = array();
|
|
} else {
|
|
$non_tg = array();
|
|
|
|
/* fetch a list of field names that are sorted by the preferred sort field */
|
|
$sfd = get_formatted_data_query_indexes($leaf['host_id'], $data_query['id']);
|
|
}
|
|
|
|
if (($data_query['id'] == 0 && cacti_sizeof($non_tg)) || ($data_query['id'] > 0 && cacti_sizeof($sfd))) {
|
|
$unique_id++;
|
|
|
|
if ($data_query['name'] != __('Non Query Based')) {
|
|
$dhtml_tree[] = "\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . ($site_id > 0 ? '-site-' . $site_id . ($ht > 0 ? '-ht-' . $ht:'') . '-host-' . $leaf['host_id']:'') . '-dq-' . $data_query['id'] . "-uid-$unique_id' data-jstree='{ \"type\" : \"data_query\" }'><a class='treepick' href=\"" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&host_id=' . $leaf['host_id'] . '&site_id=' . $site_id . '&host_template_id=' . $ht . '&hgd=dq:' . $data_query['id']) . '">' . html_escape($data_query['name']) . "</a>\n";
|
|
} else {
|
|
$dhtml_tree[] = "\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . ($site_id > 0 ? '-site-' . $site_id . ($ht > 0 ? '-ht-' . $ht:'') . '-host-' . $leaf['host_id']:'') . '-dq-' . $data_query['id'] . "-uid-$unique_id' data-jstree='{ \"type\" : \"data_query\" }'><a class='treepick' href=\"" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&host_id=' . $leaf['host_id'] . '&site_id=' . $site_id . '&host_template_id=' . $ht . '&hgd=dq:' . $data_query['id']) . '">' . html_escape($data_query['name']) . "</a>\n";
|
|
}
|
|
|
|
if ($data_query['id'] > 0) {
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t<ul>\n";
|
|
foreach ($sfd as $snmp_index => $sort_field_value) {
|
|
$unique_id++;
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t\t<li id='tbranch-" . $leaf['id'] . ($site_id > 0 ? '-site-' . $site_id . ($ht > 0 ? '-ht-' . $ht:'') . '-host-' . $leaf['host_id']:'') . '-dq-' . $data_query['id'] . '-' . urlencode($snmp_index) . "-uid-$unique_id' data-jstree='{ \"type\" : \"graph\" }'><a class='treepick' href='" . html_escape($config['url_path'] . 'graph_view.php?action=tree&node=tbranch-' . $leaf['id'] . '&host_id=' . $leaf['host_id'] . '&site_id=' . $site_id . '&host_template_id=' . $ht . '&hgd=dqi:' . $data_query['id'] . ':' . $snmp_index) . "'>" . html_escape($sort_field_value) . "</a></li>\n";
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t\t</ul>\n";
|
|
$dhtml_tree[] = "\t\t\t\t\t\t</li>\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$dhtml_tree[] = "\t\t\t\t\t\t</li>\n";
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function create_dhtml_tree() {
|
|
$dhtml_tree = array();
|
|
|
|
$tree_list = get_allowed_trees();
|
|
|
|
if (cacti_sizeof($tree_list)) {
|
|
foreach ($tree_list as $tree) {
|
|
$dhtml_tree['tree:'.$tree['id']] = true;
|
|
}
|
|
}
|
|
|
|
return $dhtml_tree;
|
|
}
|
|
|
|
function html_validate_tree_vars() {
|
|
static $count = false;
|
|
|
|
// prevent double calls in the same stack
|
|
if ($count) {
|
|
return false;
|
|
}
|
|
|
|
/* ================= input validation and session storage ================= */
|
|
$filters = array(
|
|
'graphs' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'pageset' => true,
|
|
'default' => read_user_setting('treeview_graphs_per_page')
|
|
),
|
|
'graph_template_id' => array(
|
|
'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST,
|
|
'pageset' => true,
|
|
'default' => '-1'
|
|
),
|
|
'columns' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => read_user_setting('num_columns_tree', '2')
|
|
),
|
|
'page' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => '1'
|
|
),
|
|
'predefined_timeshift' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => read_user_setting('default_timeshift')
|
|
),
|
|
'predefined_timespan' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => read_user_setting('default_timespan')
|
|
),
|
|
'node' => array(
|
|
'filter' => FILTER_VALIDATE_REGEXP,
|
|
'options' => array('options' => array('regexp' => '/([_\-a-z:0-9#]+)/')),
|
|
'pageset' => true,
|
|
'default' => ''
|
|
),
|
|
'site_id' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => '-1'
|
|
),
|
|
'host_id' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => '-1'
|
|
),
|
|
'host_template_id' => array(
|
|
'filter' => FILTER_VALIDATE_INT,
|
|
'default' => '-1'
|
|
),
|
|
'hgd' => array(
|
|
'filter' => FILTER_CALLBACK,
|
|
'pageset' => true,
|
|
'default' => '',
|
|
'options' => array('options' => 'sanitize_search_string')
|
|
),
|
|
'rfilter' => array(
|
|
'filter' => FILTER_VALIDATE_IS_REGEX,
|
|
'pageset' => true,
|
|
'default' => '',
|
|
),
|
|
'thumbnails' => array(
|
|
'filter' => FILTER_VALIDATE_REGEXP,
|
|
'options' => array('options' => array('regexp' => '(true|false)')),
|
|
'pageset' => true,
|
|
'default' => read_user_setting('thumbnail_section_tree_2') == 'on' ? 'true':'false'
|
|
)
|
|
);
|
|
|
|
validate_store_request_vars($filters, 'sess_grt');
|
|
/* ================= input validation ================= */
|
|
|
|
$count = true;
|
|
}
|
|
|
|
function grow_right_pane_tree($tree_id, $leaf_id, $host_group_data) {
|
|
global $current_user, $config, $graphs_per_page, $graph_timeshifts;
|
|
|
|
include($config['include_path'] . '/global_arrays.php');
|
|
include_once($config['library_path'] . '/data_query.php');
|
|
include_once($config['library_path'] . '/html_utility.php');
|
|
|
|
if (empty($tree_id)) { return; }
|
|
if (empty($leaf_id)) { $leaf_id = 0; }
|
|
|
|
$sql_where = '';
|
|
$sql_join = '';
|
|
$title = '';
|
|
$host_name = '';
|
|
$site_name = '';
|
|
$host_template_name = '';
|
|
$title_delimiter = '';
|
|
$host_group_data_name = '';
|
|
$graph_template_id = '-1';
|
|
$data_query_id = '-1';
|
|
$data_query_index = '';
|
|
$leaf_names = array();
|
|
|
|
$leaf = db_fetch_row_prepared('SELECT
|
|
title, host_id, site_id, host_grouping_type, parent
|
|
FROM graph_tree_items
|
|
WHERE id = ?',
|
|
array($leaf_id));
|
|
|
|
$leaf_type = api_tree_get_item_type($leaf_id);
|
|
|
|
/* get information for the headers */
|
|
if (!empty($tree_id)) {
|
|
$tree_name = db_fetch_cell_prepared('SELECT name
|
|
FROM graph_tree
|
|
WHERE id = ?',
|
|
array($tree_id));
|
|
}
|
|
|
|
if (isset($leaf['title']) && $leaf['title'] != '') {
|
|
$leaf_names[] = $leaf['title'];
|
|
}
|
|
|
|
if (($leaf_type == 'site' || $leaf_type == 'host') && $leaf['parent'] != 0) {
|
|
$parent = $leaf['parent'];
|
|
$leaf_names = array();
|
|
|
|
while ($parent != 0) {
|
|
$pleaf = db_fetch_row_prepared('SELECT * FROM graph_tree_items
|
|
WHERE id = ?',
|
|
array($parent));
|
|
|
|
if (cacti_sizeof($pleaf)) {
|
|
$leaf_names[] = $pleaf['title'];
|
|
$parent = $pleaf['parent'];
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($leaf_id)) {
|
|
$host_name = db_fetch_cell_prepared('SELECT description
|
|
FROM host
|
|
WHERE id = ?',
|
|
array($leaf['host_id']));
|
|
|
|
$site_name = db_fetch_cell_prepared('SELECT name
|
|
FROM sites
|
|
WHERE id = ?',
|
|
array($leaf['site_id']));
|
|
}
|
|
|
|
if (isset_request_var('host_id') && get_request_var('host_id') > 0 && $host_name == '') {
|
|
$host_name = db_fetch_cell_prepared('SELECT description
|
|
FROM host
|
|
WHERE id = ?',
|
|
array(get_request_var('host_id')));
|
|
}
|
|
|
|
if (isset_request_var('site_id') && get_request_var('site_id') > 0 && $site_name == '') {
|
|
$site_name = db_fetch_cell_prepared('SELECT name
|
|
FROM sites
|
|
WHERE id = ?',
|
|
array(get_request_var('site_id')));
|
|
}
|
|
|
|
if (isset_request_var('host_template_id') && get_request_var('host_template_id') > 0) {
|
|
$host_template_name = db_fetch_cell_prepared('SELECT name
|
|
FROM host_template
|
|
WHERE id = ?',
|
|
array(get_request_var('host_template_id')));
|
|
}
|
|
|
|
$host_group_data_array = explode(':', $host_group_data);
|
|
|
|
if ($host_group_data_array[0] == 'gt') {
|
|
$name = db_fetch_cell_prepared('SELECT name
|
|
FROM graph_templates
|
|
WHERE id = ?',
|
|
array($host_group_data_array[1]));
|
|
|
|
$host_group_data_name = '<strong>' . __('Graph Template:'). '</strong> ' . $name;
|
|
$graph_template_id = $host_group_data_array[1];
|
|
} elseif ($host_group_data_array[0] == 'dq') {
|
|
$name = db_fetch_cell_prepared('SELECT name
|
|
FROM snmp_query
|
|
WHERE id = ?',
|
|
array($host_group_data_array[1]));
|
|
|
|
$host_group_data_name = '<strong>' . __('Graph Template:') . '</strong> ' . (empty($host_group_data_array[1]) ? __('Non Query Based') : $name);
|
|
$data_query_id = $host_group_data_array[1];
|
|
} elseif ($host_group_data_array[0] == 'dqi') {
|
|
$name = db_fetch_cell_prepared('SELECT name
|
|
FROM snmp_query
|
|
WHERE id = ?',
|
|
array($host_group_data_array[1]));
|
|
|
|
$host_group_data_name = '<strong>' . __('Graph Template:') . '</strong> ' . (empty($host_group_data_array[1]) ? __('Non Query Based') : $name) . '-> ' . (empty($host_group_data_array[2]) ? __('Template Based') : get_formatted_data_query_index($leaf['host_id'], $host_group_data_array[1], $host_group_data_array[2]));
|
|
$data_query_id = $host_group_data_array[1];
|
|
$data_query_index = $host_group_data_array[2];
|
|
}
|
|
|
|
if ($tree_name != '') {
|
|
$title .= $title_delimiter . '<strong>' . __('Tree:') . '</strong> ' . html_escape($tree_name);
|
|
$title_delimiter = '-> ';
|
|
}
|
|
|
|
if ($site_name != '') {
|
|
$title .= $title_delimiter . '<strong>' . __('Site:') . '</strong> ' . html_escape($site_name);
|
|
$title_delimiter = '-> ';
|
|
}
|
|
|
|
if (cacti_sizeof($leaf_names)) {
|
|
foreach($leaf_names as $leaf_name) {
|
|
$title .= $title_delimiter . '<strong>' . __('Leaf:') . '</strong> ' . html_escape($leaf_name);
|
|
$title_delimiter = '-> ';
|
|
}
|
|
}
|
|
|
|
if ($host_template_name != '') {
|
|
$title .= $title_delimiter . '<strong>' . __('Device Template:') . '</strong> ' . html_escape($host_template_name);
|
|
$title_delimiter = '-> ';
|
|
}
|
|
|
|
if ($host_name != '') {
|
|
$title .= $title_delimiter . '<strong>' . __('Device:') . '</strong> ' . html_escape($host_name);
|
|
$title_delimiter = '-> ';
|
|
}
|
|
|
|
if ($host_group_data_name != '') {
|
|
$title .= $title_delimiter . " $host_group_data_name";
|
|
$title_delimiter = '-> ';
|
|
}
|
|
|
|
html_start_box(__('Graph Filters') . (get_request_var('rfilter') != '' ? " [ " . __('Filter') . " '" . html_escape_request_var('rfilter') . "' " . __('Applied') . " ]" : ''), '100%', "", '3', 'center', '');
|
|
|
|
?>
|
|
<tr class='even noprint' id='search'>
|
|
<td class='noprint'>
|
|
<form id='form_graph_view' method='post' onSubmit='applyGraphFilter();return false'>
|
|
<table class='filterTable'>
|
|
<tr>
|
|
<td>
|
|
<?php print __('Search');?>
|
|
</td>
|
|
<td>
|
|
<input type='text' class='ui-state-default ui-corner-all' id='rfilter' size='55' value='<?php print html_escape_request_var('rfilter');?>'>
|
|
</td>
|
|
<td>
|
|
<?php print __('Template');?>
|
|
</td>
|
|
<td>
|
|
<select id='graph_template_id' multiple style='opacity:0.1;overflow-y:auto;overflow-x:hide;height:0px;'>
|
|
<option value='-1'<?php if (get_request_var('graph_template_id') == '-1') {?> selected<?php }?>><?php print __('All Graphs & Templates');?></option>
|
|
<option value='0'<?php if (get_request_var('graph_template_id') == '0') {?> selected<?php }?>><?php print __('Not Templated');?></option>
|
|
<?php
|
|
// suppress total rows collection
|
|
$total_rows = -1;
|
|
|
|
$graph_templates = get_allowed_graph_templates('', 'name', '', $total_rows);
|
|
|
|
if (cacti_sizeof($graph_templates)) {
|
|
$selected = explode(',', get_request_var('graph_template_id'));
|
|
foreach ($graph_templates as $gt) {
|
|
$found = db_fetch_cell_prepared('SELECT id
|
|
FROM graph_local
|
|
WHERE graph_template_id = ? LIMIT 1',
|
|
array($gt['id']));
|
|
|
|
if ($found) {
|
|
print "<option value='" . $gt['id'] . "'";
|
|
if (cacti_sizeof($selected)) {
|
|
if (in_array($gt['id'], $selected)) {
|
|
print ' selected';
|
|
}
|
|
}
|
|
print '>' . html_escape($gt['name']) . '</option>';
|
|
}
|
|
}
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<input type='submit' class='ui-button ui-corner-all ui-widget' id='go' value='<?php print __esc('Go');?>' title='<?php print __esc('Set/Refresh Filter');?>'>
|
|
<input type='button' class='ui-button ui-corner-all ui-widget' id='clear' value='<?php print __esc('Clear');?>' title='<?php print __esc('Clear Filters');?>'>
|
|
<?php if (is_view_allowed('graph_settings')) {?>
|
|
<input type='button' class='ui-button ui-corner-all ui-widget' id='save' value='<?php print __esc('Save');?>' title='<?php print __esc('Save the current Graphs, Columns, Thumbnail, Preset, and Timeshift preferences to your profile');?>'>
|
|
<?php }?>
|
|
</span>
|
|
</td>
|
|
<td id='text'></td>
|
|
</tr>
|
|
</table>
|
|
<table class='filterTable'>
|
|
<tr>
|
|
<td>
|
|
<?php print __('Graphs');?>
|
|
</td>
|
|
<td>
|
|
<select id='graphs' onChange='applyGraphFilter()'>
|
|
<?php
|
|
if (cacti_sizeof($graphs_per_page)) {
|
|
foreach ($graphs_per_page as $key => $value) {
|
|
print "<option value='" . $key . "'"; if (get_request_var('graphs') == $key) { print ' selected'; } print '>' . $value . '</option>';
|
|
}
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<?php print __('Columns');?>
|
|
</td>
|
|
<td>
|
|
<select id='columns' onChange='applyGraphFilter()'>
|
|
<option value='1' <?php print (get_request_var('columns') == '1' ? ' selected':'');?>><?php print __('%d Column', 1);?></option>
|
|
<option value='2' <?php print (get_request_var('columns') == '2' ? ' selected':'');?>><?php print __('%d Columns', 2);?></option>
|
|
<option value='3' <?php print (get_request_var('columns') == '3' ? ' selected':'');?>><?php print __('%d Columns', 3);?></option>
|
|
<option value='4' <?php print (get_request_var('columns') == '4' ? ' selected':'');?>><?php print __('%d Columns', 4);?></option>
|
|
<option value='5' <?php print (get_request_var('columns') == '5' ? ' selected':'');?>><?php print __('%d Columns', 5);?></option>
|
|
<option value='6' <?php print (get_request_var('columns') == '6' ? ' selected':'');?>><?php print __('%d Columns', 6);?></option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<input id='thumbnails' type='checkbox' name='thumbnails' onClick='applyGraphFilter()' <?php print ((get_request_var('thumbnails') == 'true' || get_request_var('thumbnails') == 'on') ? 'checked':'');?>>
|
|
<label for='thumbnails'><?php print __('Thumbnails');?></label>
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
<tr class='even noprint'>
|
|
<td class='noprint'>
|
|
<form name='form_timespan_selector' method='post' action='<?php print $config['url_path'];?>graph_view.php'>
|
|
<table class='filterTable'>
|
|
<tr id='timespan'>
|
|
<td>
|
|
<?php print __('Presets');?>
|
|
</td>
|
|
<td>
|
|
<select id='predefined_timespan' onChange='applyGraphTimespan()'>
|
|
<?php
|
|
$graph_timespans[GT_CUSTOM] = __('Custom');
|
|
$start_val = 0;
|
|
$end_val = cacti_sizeof($graph_timespans);
|
|
|
|
if (cacti_sizeof($graph_timespans)) {
|
|
foreach($graph_timespans as $value => $text) {
|
|
print "<option value='$value'"; if ($_SESSION['sess_current_timespan'] == $value) { print ' selected'; } print '>' . html_escape($text) . '</option>';
|
|
}
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<?php print __('From');?>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<input type='text' class='ui-state-default ui-corner-all' id='date1' size='18' value='<?php print (isset($_SESSION['sess_current_date1']) ? $_SESSION['sess_current_date1'] : '');?>'>
|
|
<i id='startDate' class='calendar fa fa-calendar-alt' title='<?php print __esc('Start Date Selector');?>'></i>
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<?php print __('To');?>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<input type='text' class='ui-state-default ui-corner-all' id='date2' size='18' value='<?php print (isset($_SESSION['sess_current_date2']) ? $_SESSION['sess_current_date2'] : '');?>'>
|
|
<i id='endDate' class='calendar fa fa-calendar-alt' title='<?php print __esc('End Date Selector');?>'></i>
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<i class='shiftArrow fa fa-backward' onClick='timeshiftGraphFilterLeft()' title='<?php print __esc('Shift Time Backward');?>'></i>
|
|
<select id='predefined_timeshift' title='<?php print __esc('Define Shifting Interval');?>'>
|
|
<?php
|
|
$start_val = 1;
|
|
$end_val = cacti_sizeof($graph_timeshifts)+1;
|
|
if (cacti_sizeof($graph_timeshifts)) {
|
|
for ($shift_value=$start_val; $shift_value < $end_val; $shift_value++) {
|
|
print "<option value='$shift_value'"; if ($_SESSION['sess_current_timeshift'] == $shift_value) { print ' selected'; } print '>' . html_escape($graph_timeshifts[$shift_value]) . '</option>';
|
|
}
|
|
}
|
|
?>
|
|
</select>
|
|
<i class='shiftArrow fa fa-forward' onClick='timeshiftGraphFilterRight()' title='<?php print __esc('Shift Time Forward');?>'></i>
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<span>
|
|
<input type='button' class='ui-button ui-corner-all ui-widget' id='tsrefresh' value='<?php print __esc('Refresh');?>' title='<?php print __esc('Refresh selected time span');?>' onClick='refreshGraphTimespanFilter()'>
|
|
<input type='button' class='ui-button ui-corner-all ui-widget' id='tsclear' value='<?php print __esc('Clear');?>' title='<?php print __esc('Return to the default time span');?>' onClick='clearGraphTimespanFilter()'>
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class='filterTable'>
|
|
<tr id='realtime' style='display:none;'>
|
|
<td>
|
|
<?php print __('Window');?>
|
|
</td>
|
|
<td>
|
|
<select id='graph_start' onChange='realtimeGrapher()'>
|
|
<?php
|
|
foreach ($realtime_window as $interval => $text) {
|
|
printf('<option value="%d"%s>%s</option>', $interval, $interval == $_SESSION['sess_realtime_window'] ? ' selected="selected"' : '', $text);
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<?php print __('Refresh');?>
|
|
</td>
|
|
<td>
|
|
<select id='ds_step' onChange="realtimeGrapher()">
|
|
<?php
|
|
foreach ($realtime_refresh as $interval => $text) {
|
|
printf('<option value="%d"%s>%s</option>', $interval, $interval == $_SESSION['sess_realtime_dsstep'] ? ' selected="selected"' : '', $text);
|
|
}
|
|
?>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input type='button' class='ui-button ui-corner-all ui-widget' id='realtimeoff' value='<?php print __esc('Stop');?>'>
|
|
</td>
|
|
<td class='center' colspan='6'>
|
|
<span id='countdown'></span>
|
|
</td>
|
|
<td>
|
|
<input id='future' type='hidden' value='<?php print read_config_option('allow_graph_dates_in_future');?>'></input>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</form>
|
|
</td>
|
|
</tr><?php
|
|
html_end_box();
|
|
|
|
?>
|
|
<script type='text/javascript'>
|
|
|
|
var graph_start = <?php print get_current_graph_start();?>;
|
|
var graph_end = <?php print get_current_graph_end();?>;
|
|
var timeOffset = <?php print date('Z');?>;
|
|
var pageAction = 'tree';
|
|
var graphPage = '<?php print $config['url_path'];?>graph_view.php';
|
|
var hgd = '<?php print $host_group_data;?>';
|
|
var date1Open = false;
|
|
var date2Open = false;
|
|
|
|
function initPage() {
|
|
<?php html_graph_template_multiselect();?>
|
|
|
|
$('#startDate').click(function() {
|
|
if (date1Open) {
|
|
date1Open = false;
|
|
$('#date1').datetimepicker('hide');
|
|
} else {
|
|
date1Open = true;
|
|
$('#date1').datetimepicker('show');
|
|
}
|
|
});
|
|
|
|
$('#endDate').click(function() {
|
|
if (date2Open) {
|
|
date2Open = false;
|
|
$('#date2').datetimepicker('hide');
|
|
} else {
|
|
date2Open = true;
|
|
$('#date2').datetimepicker('show');
|
|
}
|
|
});
|
|
|
|
$('#date1').datetimepicker({
|
|
minuteGrid: 10,
|
|
stepMinute: 1,
|
|
showAnim: 'slideDown',
|
|
numberOfMonths: 1,
|
|
timeFormat: 'HH:mm',
|
|
dateFormat: 'yy-mm-dd',
|
|
showButtonPanel: false
|
|
});
|
|
|
|
$('#date2').datetimepicker({
|
|
minuteGrid: 10,
|
|
stepMinute: 1,
|
|
showAnim: 'slideDown',
|
|
numberOfMonths: 1,
|
|
timeFormat: 'HH:mm',
|
|
dateFormat: 'yy-mm-dd',
|
|
showButtonPanel: false
|
|
});
|
|
|
|
var navBar = "<div id='navBar' class='navBar'><?php print draw_navigation_text();?></div>";
|
|
if (navBar != '') {
|
|
$('#navBar').replaceWith(navBar);
|
|
}
|
|
|
|
setupBreadcrumbs();
|
|
}
|
|
|
|
$(function() {
|
|
$('#go').off('click').on('click', function(event) {
|
|
event.preventDefault();
|
|
applyGraphFilter();
|
|
});
|
|
|
|
$('#clear').off('click').on('click', function() {
|
|
clearGraphFilter();
|
|
});
|
|
|
|
$('#save').off('click').on('click', function() {
|
|
saveGraphFilter('tree');
|
|
});
|
|
|
|
$.when(initPage()).done(function() {
|
|
initializeGraphs();
|
|
});
|
|
});
|
|
|
|
</script>
|
|
<?php
|
|
html_spikekill_js();
|
|
|
|
api_plugin_hook_function('graph_tree_page_buttons',
|
|
array(
|
|
'treeid' => $tree_id,
|
|
'leafid' => $leaf_id,
|
|
'mode' => 'tree',
|
|
'timespan' => $_SESSION['sess_current_timespan'],
|
|
'starttime' => get_current_graph_start(),
|
|
'endtime' => get_current_graph_end()
|
|
)
|
|
);
|
|
|
|
$graph_list = array();
|
|
|
|
if (($leaf_type == 'header') || (empty($leaf_id))) {
|
|
$sql_where = '';
|
|
|
|
if (get_request_var('rfilter') != '') {
|
|
$sql_where .= ' (gtg.title_cache RLIKE "' . get_request_var('rfilter') . '" OR gtg.title RLIKE "' . get_request_var('rfilter') . '")';
|
|
}
|
|
|
|
if (isset_request_var('graph_template_id') && get_request_var('graph_template_id') >= 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))';
|
|
}
|
|
|
|
$graph_list = get_allowed_tree_header_graphs($tree_id, $leaf_id, $sql_where);
|
|
} elseif ($leaf_type == 'host') {
|
|
if ($graph_template_id == '-1') {
|
|
$graph_template_id = get_request_var('graph_template_id');
|
|
}
|
|
|
|
$graph_list = get_host_graph_list($leaf['host_id'], $graph_template_id, $data_query_id, $leaf['host_grouping_type'], $data_query_index);
|
|
} elseif ($leaf_type == 'site') {
|
|
$sql_where = '';
|
|
|
|
if (isset_request_var('site_id') && get_filter_request_var('site_id') > 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'h.site_id = ' . get_request_var('site_id');
|
|
}
|
|
|
|
if (isset_request_var('host_template_id') && get_filter_request_var('host_template_id') > 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'h.host_template_id = ' . get_request_var('host_template_id');
|
|
}
|
|
|
|
if (isset_request_var('host_id') && get_filter_request_var('host_id') > 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.host_id = ' . get_request_var('host_id');
|
|
}
|
|
|
|
if (isset_request_var('hgd')) {
|
|
$parts = explode(':', get_request_var('hgd'));
|
|
switch($parts[0]) {
|
|
case 'gt':
|
|
input_validate_input_number($parts[1]);
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.graph_template_id = ' . $parts[1];
|
|
break;
|
|
case 'dq':
|
|
input_validate_input_number($parts[1]);
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.snmp_query_id = ' . $parts[1];
|
|
break;
|
|
case 'dqi':
|
|
input_validate_input_number($parts[1]);
|
|
$dqi = db_qstr($parts[2]);
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.snmp_query_id = ' . $parts[1] . ' AND snmp_index = ' . $dqi;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (get_request_var('rfilter') != '') {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . '(gtg.title_cache RLIKE "' . get_request_var('rfilter') . '")';
|
|
}
|
|
|
|
if (isset_request_var('graph_template_id') && get_request_var('graph_template_id') >= 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . '(gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))';
|
|
}
|
|
|
|
$graphs = get_allowed_graphs($sql_where);
|
|
if (read_user_setting('show_aggregates', 'on') == 'on') {
|
|
$agg = get_allowed_aggregate_graphs($sql_where);
|
|
} else {
|
|
$agg = array();
|
|
}
|
|
|
|
$graphs = array_merge($graphs, $agg);
|
|
|
|
/* let's sort the graphs naturally */
|
|
usort($graphs, 'naturally_sort_graphs');
|
|
|
|
if (cacti_sizeof($graphs)) {
|
|
foreach ($graphs as $graph) {
|
|
array_push($graph_list, $graph);
|
|
}
|
|
}
|
|
}
|
|
|
|
$total_rows = cacti_sizeof($graph_list);
|
|
|
|
/* generate page list */
|
|
$nav = html_nav_bar($config['url_path'] . 'graph_view.php?action=tree_content&tree_id=' . $tree_id . '&leaf_id=' . $leaf_id . '&node=' . get_request_var('node') . '&hgd=' . $host_group_data, MAX_DISPLAY_PAGES, get_request_var('page'), get_request_var('graphs'), $total_rows, get_request_var('columns'), __('Graphs'), 'page', 'main');
|
|
|
|
print $nav;
|
|
|
|
html_start_box('', '100%', '', '3', 'center', '');
|
|
|
|
/* start graph display */
|
|
print "<tr class='tableHeader'><td style='width:390px;' colspan='" . get_request_var('columns') . "' class='graphSubHeaderColumn textHeaderDark'>$title</td></tr>";
|
|
|
|
$i = get_request_var('graphs') * (get_request_var('page') - 1);
|
|
$last_graph = $i + get_request_var('graphs');
|
|
|
|
$new_graph_list = array();
|
|
while ($i < $total_rows && $i < $last_graph) {
|
|
$new_graph_list[] = $graph_list[$i];
|
|
$i++;
|
|
}
|
|
|
|
if (get_request_var('thumbnails') == 'true' || get_request_var('thumbnails') == 'on') {
|
|
html_graph_thumbnail_area($new_graph_list, '', 'view_type=tree&graph_start=' . get_current_graph_start() . '&graph_end=' . get_current_graph_end(), '', get_request_var('columns'), $tree_id, $leaf_id);
|
|
} else {
|
|
html_graph_area($new_graph_list, '', 'view_type=tree&graph_start=' . get_current_graph_start() . '&graph_end=' . get_current_graph_end(), '', get_request_var('columns'), $tree_id, $leaf_id);
|
|
}
|
|
|
|
if (!empty($leaf_id)) {
|
|
api_plugin_hook_function('tree_after', $host_name . ',' . get_nfilter_request_var('leaf_id'));
|
|
}
|
|
|
|
api_plugin_hook_function('tree_view_page_end');
|
|
|
|
html_end_box();
|
|
|
|
if ($total_rows) {
|
|
print $nav;
|
|
}
|
|
}
|
|
|
|
function get_host_graph_list($host_id, $graph_template_id, $data_query_id, $host_grouping_type = '', $data_query_index = '') {
|
|
$graph_list = array();
|
|
$sql_where = '';
|
|
|
|
/* graph template grouping */
|
|
if ($host_grouping_type == HOST_GROUPING_GRAPH_TEMPLATE) {
|
|
if ($host_id > 0) {
|
|
$sql_where = 'gl.host_id=' . $host_id;
|
|
}
|
|
|
|
if ($graph_template_id != '' && $graph_template_id != '-1' && $graph_template_id != '0') {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . $graph_template_id . '))';
|
|
} elseif ($graph_template_id == 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . $graph_template_id . '))';
|
|
}
|
|
|
|
// suppress total rows collection
|
|
$total_rows = -1;
|
|
|
|
$graph_templates = get_allowed_graph_templates('', 'name', '', $total_rows);
|
|
$final_templates = array();
|
|
if ($graph_template_id != '' && $graph_template_id != '-1' && $graph_template_id != '0') {
|
|
$templates = explode(',', $graph_template_id);
|
|
foreach($templates as $id) {
|
|
$ptemplates[$id]['id'] = $id;
|
|
}
|
|
|
|
foreach($graph_templates as $template) {
|
|
if (isset($ptemplates[$template['id']])) {
|
|
$final_templates[$template['id']]['id'] = $template['id'];
|
|
$final_templates[$template['id']]['name'] = $template['name'];
|
|
}
|
|
}
|
|
} elseif ($graph_template_id == '0') {
|
|
$final_templates = array();
|
|
} else {
|
|
$final_templates = $graph_templates;
|
|
}
|
|
|
|
/* for graphs without a template */
|
|
array_push(
|
|
$final_templates, array(
|
|
'id' => '0',
|
|
'name' => __('(Non Graph Template)')
|
|
)
|
|
);
|
|
|
|
if (cacti_sizeof($final_templates)) {
|
|
$sql_where = '';
|
|
if (get_request_var('rfilter') != '') {
|
|
$sql_where = ' (gtg.title_cache RLIKE "' . get_request_var('rfilter') . '")';
|
|
}
|
|
|
|
if ($host_id > 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.host_id=' . $host_id;
|
|
}
|
|
|
|
$graph_template_ids = [];
|
|
|
|
foreach ($final_templates as $graph_template) {
|
|
array_push($graph_template_ids, $graph_template['id']);
|
|
}
|
|
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') . 'gl.graph_template_id IN (' . implode(', ', $graph_template_ids) . ')';
|
|
$graphs = get_allowed_graphs($sql_where);
|
|
|
|
if (read_user_setting('show_aggregates', 'on') == 'on') {
|
|
$agg = get_allowed_aggregate_graphs($sql_where);
|
|
} else {
|
|
$agg = array();
|
|
}
|
|
|
|
$graphs = array_merge($graphs, $agg);
|
|
|
|
/* let's sort the graphs naturally */
|
|
usort($graphs, 'naturally_sort_graphs');
|
|
|
|
if (cacti_sizeof($graphs)) {
|
|
foreach ($graphs as $graph) {
|
|
$graph['graph_template_name'] = $graph_template['name'];
|
|
array_push($graph_list, $graph);
|
|
}
|
|
}
|
|
}
|
|
} elseif ($host_grouping_type == HOST_GROUPING_DATA_QUERY_INDEX) {
|
|
/* data query index grouping */
|
|
if ($host_id > 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'gl.host_id=' . $host_id;
|
|
}
|
|
|
|
if ($data_query_id >= 0) {
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'sq.id=' . $data_query_id;
|
|
}
|
|
|
|
$data_queries = db_fetch_assoc("SELECT sq.id, sq.name
|
|
FROM graph_local AS gl
|
|
INNER JOIN snmp_query AS sq
|
|
ON gl.snmp_query_id=sq.id
|
|
$sql_where
|
|
GROUP BY sq.id
|
|
ORDER BY sq.name");
|
|
|
|
/* for graphs without a data query */
|
|
if ($data_query_id <= 0) {
|
|
array_push($data_queries,
|
|
array(
|
|
'id' => '0',
|
|
'name' => __('Non Query Based')
|
|
)
|
|
);
|
|
}
|
|
|
|
if (cacti_sizeof($data_queries)) {
|
|
foreach ($data_queries as $data_query) {
|
|
$sql_where = '';
|
|
|
|
/* fetch a list of field names that are sorted by the preferred sort field */
|
|
$sfd = get_formatted_data_query_indexes($host_id, $data_query['id']);
|
|
|
|
if (get_request_var('rfilter') != '') {
|
|
$sql_where = ' (gtg.title_cache RLIKE "' . get_request_var('rfilter') . '")';
|
|
}
|
|
|
|
/* grab a list of all graphs for this host/data query combination */
|
|
$sql_where .= ($sql_where != '' ? ' AND ':'') .
|
|
'gl.snmp_query_id=' . $data_query['id'] . ($host_id > 0 ? ' AND gl.host_id=' . $host_id:'') .
|
|
' ' . ($data_query_index != '' ? ' AND gl.snmp_index = ' . db_qstr($data_query_index): '');
|
|
|
|
$graphs = get_allowed_graphs($sql_where);
|
|
|
|
if (read_user_setting('show_aggregates', 'on') == 'on') {
|
|
$agg = get_allowed_aggregate_graphs($sql_where);
|
|
} else {
|
|
$agg = array();
|
|
}
|
|
|
|
$graphs = array_merge($graphs, $agg);
|
|
|
|
/* re-key the results on data query index */
|
|
$snmp_index_to_graph = array();
|
|
if (cacti_sizeof($graphs)) {
|
|
/* let's sort the graphs naturally */
|
|
usort($graphs, 'naturally_sort_graphs');
|
|
|
|
foreach ($graphs as $graph) {
|
|
$snmp_index_to_graph[$graph['snmp_index']][$graph['local_graph_id']] = $graph['title_cache'];
|
|
$graphs_height[$graph['local_graph_id']] = $graph['height'];
|
|
$graphs_width[$graph['local_graph_id']] = $graph['width'];
|
|
}
|
|
}
|
|
|
|
/* using the sorted data as they key; grab each snmp index from the master list */
|
|
foreach ($sfd as $snmp_index => $sort_field_value) {
|
|
/* render each graph for the current data query index */
|
|
if (isset($snmp_index_to_graph[$snmp_index])) {
|
|
foreach ($snmp_index_to_graph[$snmp_index] as $local_graph_id => $graph_title) {
|
|
/* reformat the array so it's compatable with the html_graph* area functions */
|
|
array_push($graph_list, array(
|
|
'data_query_name' => $data_query['name'],
|
|
'sort_field_value' => $sort_field_value,
|
|
'local_graph_id' => $local_graph_id,
|
|
'title_cache' => $graph_title,
|
|
'height' => $graphs_height[$local_graph_id],
|
|
'width' => $graphs_width[$local_graph_id]
|
|
));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $graph_list;
|
|
}
|