';
$data_template_rrds = db_fetch_assoc_prepared('SELECT dtr.id, dtr.data_source_name,
sqgr.snmp_field_name, sqgr.snmp_query_graph_id
FROM data_template_rrd AS dtr
LEFT JOIN snmp_query_graph_rrd AS sqgr
ON sqgr.data_template_rrd_id = dtr.id
AND sqgr.snmp_query_graph_id = ?
AND sqgr.data_template_id = ?
WHERE dtr.data_template_id = ?
AND dtr.local_data_id = 0
ORDER BY dtr.data_source_name',
[grv('id'), $data_template['id'], $data_template['id']]);
$i = 0;
if (cacti_sizeof($data_template_rrds)) {
foreach ($data_template_rrds as $data_template_rrd) {
if (empty($data_template_rrd['snmp_query_graph_id'])) {
$old_value = '';
} else {
$old_value = 'on';
}
form_alternate_row();
?>
['no_form_tag' => true],
'fields' => inject_form_variables($fields_data_query_edit, (isset($snmp_query) ? $snmp_query : []))
]
);
html_end_box(false, true);
if (!empty($snmp_query['id'])) {
$search = ['', '', ''];
$replace = [CACTI_PATH_BASE, read_config_option('path_snmpget'), read_config_option('path_php_binary')];
$xml_filename = str_replace($search, $replace, $snmp_query['xml_path']);
// Confine the resolved path to the Cacti base path so this located/not-located
// check cannot be used as a filesystem existence oracle (GHSA-2x86-jpm8-9vgp).
// cacti_path_is_within() normalizes Windows casing/long-path forms and matches
// the containment check used by the XML loader in lib/data_query.php. Reject a
// NUL byte first so realpath() cannot throw a ValueError on PHP 8+.
if ($xml_filename !== '' && strpos($xml_filename, "\0") === false &&
cacti_path_is_within($xml_filename, CACTI_PATH_BASE) &&
is_file($xml_filename)) {
$text = "" . __('Successfully located XML file') . '';
$xml_file_exists = true;
} else {
$text = "" . __('Could not locate XML file.') . '';
$xml_file_exists = false;
}
html_start_box('', '100%', false, 3, 'center', '');
print "
$text
";
html_end_box(false);
$display_text = [
[
'display' => __('Name'),
'align' => 'left'
],
[
'display' => __('Graph Template Name'),
'align' => 'left'
],
[
'display' => __('Graphs Using'),
'align' => 'right'
],
[
'display' => __('Mapping ID'),
'align' => 'right'
],
[
'display' => __('Action'),
'align' => 'right'
]
];
html_start_box(__('Associated Graph Templates'), '100%', false, 3, 'center', 'data_queries.php?action=item_edit&snmp_query_id=' . $snmp_query['id']);
html_header($display_text, 1);
$snmp_query_graphs = db_fetch_assoc_prepared('SELECT sqg.id,
gt.name AS graph_template_name, sqg.name, COUNT(gl.id) AS graphs
FROM snmp_query_graph AS sqg
LEFT JOIN graph_templates AS gt
ON sqg.graph_template_id = gt.id
LEFT JOIN graph_local AS gl
ON gl.snmp_query_graph_id = sqg.id
AND gl.graph_template_id = sqg.graph_template_id
WHERE sqg.snmp_query_id = ?
GROUP BY sqg.id
ORDER BY sqg.name',
[$snmp_query['id']]);
if (cacti_sizeof($snmp_query_graphs)) {
$i = 0;
foreach ($snmp_query_graphs as $snmp_query_graph) {
form_alternate_row('line' . $i, true);
if ($xml_file_exists) {
$url = 'data_queries.php?action=item_edit&id=' . $snmp_query_graph['id'] . '&snmp_query_id=' . $snmp_query['id'];
form_selectable_cell(filter_value($snmp_query_graph['name'], '', $url), $i);
} else {
form_selectable_cell(filter_value($snmp_query_graph['name'], '', '', __('Association Read Only until XML file located')), $i);
}
form_selectable_ecell($snmp_query_graph['graph_template_name'], $i);
form_selectable_cell(number_format_i18n($snmp_query_graph['graphs'], -1), $i, '', 'right');
form_selectable_cell($snmp_query_graph['id'], $i, '', 'right');
if ($snmp_query_graph['graphs'] == 0) {
$url = htmle('data_queries.php?action=item_remove_confirm&id=' . $snmp_query_graph['id'] . '&snmp_query_id=' . $snmp_query['id']);
form_selectable_cell("", $i, '', 'right');
} else {
form_selectable_cell("", $i, '', 'right');
}
form_end_row();
$i++;
}
} else {
print "
" . __('No Graph Templates Defined.') . '
';
}
html_end_box();
}
form_save_button('data_queries.php', 'return');
?>
rows_label = __('Data Queries');
$pageFilter->render();
if (grv('rows') == '-1') {
$rows = read_config_option('num_rows_table');
} else {
$rows = grv('rows');
}
// form the 'where' clause for our main sql query
if (grv('filter') != '') {
$sql_where = 'WHERE (sq.name LIKE ' . db_qstr('%' . grv('filter') . '%') . ' OR di.name LIKE ' . db_qstr('%' . grv('filter') . '%') . ')';
} else {
$sql_where = '';
}
$total_rows = db_fetch_cell("SELECT COUNT(*)
FROM snmp_query AS sq
INNER JOIN data_input AS di
ON sq.data_input_id=di.id
$sql_where");
$sql_order = get_order_string();
$sql_limit = ' LIMIT ' . ($rows * (grv('page') - 1)) . ',' . $rows;
$snmp_queries = db_fetch_assoc("SELECT sq.id, sq.name, sq.graphs, sq.templates, sq.last_updated,
di.name AS data_input_method
FROM snmp_query AS sq
LEFT JOIN data_input AS di
ON sq.data_input_id=di.id
$sql_where
$sql_order
$sql_limit");
$display_text = [
'name' => [
'display' => __('Data Query Name'),
'align' => 'left',
'sort' => 'ASC',
'tip' => __('The name of this Data Query.')
],
'id' => [
'display' => __('ID'),
'align' => 'right',
'sort' => 'ASC',
'tip' => __('The internal ID for this Graph Template. Useful when performing automation or debugging.')
],
'nosort' => [
'display' => __('Deletable'),
'align' => 'right',
'tip' => __('Data Queries that are in use cannot be Deleted. In use is defined as being referenced by either a Graph or a Graph Template.')
],
'graphs' => [
'display' => __('Graphs Using'),
'align' => 'right',
'sort' => 'DESC',
'tip' => __('The number of Graphs using this Data Query.')
],
'templates' => [
'display' => __('Templates Using'),
'align' => 'right',
'sort' => 'DESC',
'tip' => __('The number of Graphs Templates using this Data Query.')
],
'data_input_method' => [
'display' => __('Data Input Method'),
'align' => 'right',
'sort' => 'ASC',
'tip' => __('The Data Input Method used to collect data for Data Sources associated with this Data Query.')
],
'last_updated' => [
'display' => __('Last Updated'),
'align' => 'right',
'sort' => 'ASC',
'tip' => __('The last time this Template was updated.')
]
];
$nav = html_nav_bar('data_queries.php?filter=' . grv('filter'), MAX_DISPLAY_PAGES, grv('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Data Queries'), 'page', 'main');
form_start('data_queries.php', 'chk');
print $nav;
html_start_box('', '100%', false, 3, 'center', '');
html_header_sort_checkbox($display_text, grv('sort_column'), grv('sort_direction'), false);
if (cacti_sizeof($snmp_queries)) {
foreach ($snmp_queries as $snmp_query) {
if ($snmp_query['graphs'] == 0) {
$disabled = false;
} else {
$disabled = true;
}
form_alternate_row('line' . $snmp_query['id'], true, $disabled);
form_selectable_cell(filter_value($snmp_query['name'], grv('filter'), 'data_queries.php?action=edit&id=' . $snmp_query['id']), $snmp_query['id']);
form_selectable_cell($snmp_query['id'], $snmp_query['id'], '', 'right');
form_selectable_cell($disabled ? __('No') : __('Yes'), $snmp_query['id'], '', 'right');
form_selectable_cell(number_format_i18n($snmp_query['graphs'], -1), $snmp_query['id'], '', 'right');
form_selectable_cell(number_format_i18n($snmp_query['templates'], -1), $snmp_query['id'], '', 'right');
form_selectable_cell(filter_value($snmp_query['data_input_method'], grv('filter')), $snmp_query['id'], '', 'right');
form_selectable_cell($snmp_query['last_updated'], $snmp_query['id'], '', 'right');
form_checkbox_cell($snmp_query['name'], $snmp_query['id'], $disabled);
form_end_row();
}
} else {
print "
" . __('No Data Queries Found') . '
';
}
html_end_box(false);
if (cacti_sizeof($snmp_queries)) {
print $nav;
}
// draw the dropdown containing a list of available actions for this form
draw_actions_dropdown($actions);
form_end();
}