856 lines
30 KiB
PHP
856 lines
30 KiB
PHP
<?php
|
|
/**
|
|
* Observium
|
|
*
|
|
* This file is part of Observium.
|
|
*
|
|
* @package observium
|
|
* @subpackage web
|
|
* @copyright (C) Adam Armstrong
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Humanize sensor.
|
|
*
|
|
* Returns a the $sensor array with processed information:
|
|
* sensor_state (TRUE: state sensor, FALSE: normal sensor)
|
|
* human_value, sensor_symbol, state_name, state_event, state_class
|
|
*
|
|
* @param array $sensor
|
|
*
|
|
* @return array $sensor
|
|
*
|
|
*/
|
|
// TESTME needs unit testing
|
|
function humanize_sensor(&$sensor)
|
|
{
|
|
global $config;
|
|
|
|
// Exit if already humanized
|
|
if ($sensor['humanized']) {
|
|
return;
|
|
}
|
|
|
|
$sensor['sensor_symbol'] = $config['sensor_types'][$sensor['sensor_class']]['symbol'];
|
|
$sensor['sensor_format'] = (string)$config['sensor_types'][$sensor['sensor_class']]['format'];
|
|
$sensor['state_class'] = ''; //'text-success';
|
|
|
|
// Generate "pretty" thresholds
|
|
if (is_numeric($sensor['sensor_limit_low'])) {
|
|
$sensor_threshold_low = format_value($sensor['sensor_limit_low'], $sensor['sensor_format']) . $sensor['sensor_symbol'];
|
|
} else {
|
|
$sensor_threshold_low = "∞";
|
|
}
|
|
|
|
if (is_numeric($sensor['sensor_limit_low_warn'])) {
|
|
$sensor_warn_low = format_value($sensor['sensor_limit_low_warn'], $sensor['sensor_format']) . $sensor['sensor_symbol'];
|
|
} else {
|
|
$sensor_warn_low = NULL;
|
|
}
|
|
|
|
if ($sensor_warn_low) {
|
|
$sensor_threshold_low = $sensor_threshold_low . " (" . $sensor_warn_low . ")";
|
|
}
|
|
|
|
if (is_numeric($sensor['sensor_limit'])) {
|
|
$sensor_threshold_high = format_value($sensor['sensor_limit'], $sensor['sensor_format']) . $sensor['sensor_symbol'];
|
|
} else {
|
|
$sensor_threshold_high = "∞";
|
|
}
|
|
|
|
if (is_numeric($sensor['sensor_limit_warn'])) {
|
|
$sensor_warn_high = format_value($sensor['sensor_limit_warn'], $sensor['sensor_format']) . $sensor['sensor_symbol'];
|
|
} else {
|
|
$sensor_warn_high = "∞";
|
|
}
|
|
|
|
if ($sensor_warn_high) {
|
|
$sensor_threshold_high = "(" . $sensor_warn_high . ") " . $sensor_threshold_high;
|
|
}
|
|
|
|
$sensor['sensor_thresholds'] = $sensor_threshold_low . ' - ' . $sensor_threshold_high;
|
|
|
|
// generate pretty value
|
|
if (!is_numeric($sensor['sensor_value'])) {
|
|
$sensor['human_value'] = 'NaN';
|
|
$sensor['sensor_symbol'] = '';
|
|
} else {
|
|
$sensor['human_value'] = format_value($sensor['sensor_value'], $sensor['sensor_format'], 2, 4);
|
|
}
|
|
|
|
if (isset($config['entity_events'][$sensor['sensor_event']])) {
|
|
$sensor = array_merge($sensor, $config['entity_events'][$sensor['sensor_event']]);
|
|
} else {
|
|
$sensor['event_class'] = 'label label-primary';
|
|
$sensor['row_class'] = '';
|
|
}
|
|
|
|
if (device_is_ignored($sensor['device_id']) &&
|
|
($sensor['row_class'] === "error" || $sensor['row_class'] === "warning")) {
|
|
$sensor['row_class'] = 'suppressed';
|
|
}
|
|
|
|
if ($sensor['sensor_deleted']) {
|
|
$sensor['row_class'] = 'disabled';
|
|
}
|
|
|
|
// Set humanized entry in the array so we can tell later
|
|
$sensor['humanized'] = TRUE;
|
|
}
|
|
|
|
function build_sensor_query($vars, $query_count = FALSE)
|
|
{
|
|
|
|
if ($query_count) {
|
|
$sql = "SELECT COUNT(*) FROM `sensors`";
|
|
} else {
|
|
$sql = "SELECT * FROM `sensors`";
|
|
|
|
if ($vars['sort'] === 'hostname' || $vars['sort'] === 'device' || $vars['sort'] === 'device_id') {
|
|
$sql .= ' LEFT JOIN `devices` USING(`device_id`)';
|
|
}
|
|
}
|
|
|
|
// Build query
|
|
$where_array = [];
|
|
foreach ($vars as $var => $value) {
|
|
switch ($var) {
|
|
case "group":
|
|
case "group_id":
|
|
$values = get_group_entities($value);
|
|
$where_array[] = generate_query_values($values, 'sensors.sensor_id');
|
|
break;
|
|
|
|
case 'device_group_id':
|
|
case 'device_group':
|
|
$values = get_group_entities($value, 'device');
|
|
$where_array[] = generate_query_values($values, 'sensors.device_id');
|
|
break;
|
|
|
|
case "device":
|
|
case "device_id":
|
|
$where_array[] = generate_query_values($value, 'sensors.device_id');
|
|
break;
|
|
|
|
case "id":
|
|
case "sensor_id":
|
|
$where_array[] = generate_query_values($value, 'sensors.sensor_id');
|
|
break;
|
|
|
|
case "entity_id":
|
|
$where_array[] = generate_query_values($value, 'sensors.measured_entity');
|
|
break;
|
|
|
|
case "entity_type":
|
|
$where_array[] = generate_query_values($value, 'sensors.measured_class');
|
|
break;
|
|
|
|
case 'entity_state':
|
|
case "measured_state":
|
|
$where_array[] = generate_query_entity_measured('sensor', [ 'measured_state' => $value ]);
|
|
break;
|
|
|
|
case "metric":
|
|
// old metric param don't allow an array
|
|
if (!isset($GLOBALS['config']['sensor_types'][$value])) {
|
|
break;
|
|
}
|
|
case 'class':
|
|
case "sensor_class":
|
|
$where_array[] = generate_query_values($value, 'sensor_class');
|
|
break;
|
|
|
|
case "descr":
|
|
case "sensor_descr":
|
|
$where_array[] = generate_query_values($value, 'sensors.sensor_descr', '%LIKE%');
|
|
break;
|
|
|
|
case "type":
|
|
case "sensor_type":
|
|
$where_array[] = generate_query_values($value, 'sensor_type', '%LIKE%');
|
|
break;
|
|
|
|
case "event":
|
|
case "sensor_event":
|
|
$where_array[] = generate_query_values($value, 'sensor_event');
|
|
break;
|
|
}
|
|
}
|
|
$where_array[] = '`sensor_deleted` = 0';
|
|
|
|
$sql .= generate_where_clause($where_array, generate_query_permitted_ng([ 'device', 'sensor' ]));
|
|
|
|
// If need count, just return sql without sorting
|
|
if ($query_count) {
|
|
return $sql;
|
|
}
|
|
|
|
if (isset($vars['sort'])) {
|
|
$sort_order = get_sort_order($vars);
|
|
switch ($vars['sort']) {
|
|
case 'device':
|
|
$sql .= generate_query_sort('hostname', $sort_order);
|
|
break;
|
|
|
|
case 'descr':
|
|
case 'event':
|
|
case 'value':
|
|
case 'last_change':
|
|
$sql .= generate_query_sort('sensor_'. $vars['sort'], $sort_order);
|
|
break;
|
|
|
|
case 'class':
|
|
case 'sensor_class':
|
|
$sql .= generate_query_sort('sensor_class', $sort_order);
|
|
break;
|
|
|
|
case 'mib':
|
|
$sql .= generate_query_sort([ 'sensor_mib', 'sensor_object', 'sensor_type', 'sensor_index:integer' ], $sort_order);
|
|
break;
|
|
default:
|
|
// $sql .= generate_query_sort([ 'hostname', 'sensor_descr' ], $sort_order);
|
|
}
|
|
}
|
|
|
|
if (isset($vars['pageno'])) {
|
|
$sql .= generate_query_limit($vars);
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
function print_sensor_table($vars, $default_order = [])
|
|
{
|
|
|
|
pagination($vars, 0, TRUE); // Get default pagesize/pageno
|
|
|
|
$sql = build_sensor_query($vars);
|
|
|
|
$sensors = [];
|
|
foreach (dbFetchRows($sql) as $sensor) {
|
|
|
|
// fixme - not clear what this is doing or why it's here. if it's for some special page, it should not be here
|
|
|
|
$sensor['hostname'] = get_device_hostname_by_id($sensor['device_id']);
|
|
$sensors[$sensor['sensor_class']][] = $sensor;
|
|
}
|
|
|
|
// order dom sensors always by temperature, voltage, current, dbm, power
|
|
$order = [];
|
|
if (safe_count($sensors)) {
|
|
if (safe_count($default_order)) {
|
|
$types = array_keys($sensors);
|
|
//r($types);
|
|
$order = array_intersect($default_order, $types);
|
|
$order = array_merge($order, array_diff($types, $order));
|
|
//r($order);
|
|
} else {
|
|
$order = array_keys($sensors);
|
|
}
|
|
}
|
|
|
|
//$sensors_count = count($sensors); // This is count incorrect, when pagination used!
|
|
//$sensors_count = dbFetchCell(build_sensor_query($vars, TRUE), NULL, TRUE);
|
|
$sensors_count = dbFetchCell(build_sensor_query($vars, TRUE));
|
|
|
|
$pagination_html = pagination($vars, $sensors_count);
|
|
echo $pagination_html;
|
|
|
|
echo generate_box_open();
|
|
|
|
print_sensor_table_header($vars);
|
|
|
|
foreach ($order as $type) {
|
|
foreach ($sensors[$type] as $sensor) {
|
|
print_sensor_row($sensor, $vars);
|
|
}
|
|
}
|
|
|
|
echo("</tbody></table>");
|
|
|
|
echo generate_box_close();
|
|
|
|
echo $pagination_html;
|
|
}
|
|
|
|
function print_sensor_table_header($vars)
|
|
{
|
|
if ($vars['view'] === "graphs" || get_var_true($vars['graph']) || isset($vars['id'])) {
|
|
$stripe_class = "table-striped-two";
|
|
} else {
|
|
$stripe_class = "table-striped";
|
|
}
|
|
|
|
echo('<table class="table ' . $stripe_class . ' table-condensed ">' . PHP_EOL);
|
|
$cols = [];
|
|
$cols[] = [NULL, 'class="state-marker"'];
|
|
$cols['device'] = ['Device', 'style="width: 250px;"'];
|
|
//$cols[] = array(NULL, 'class="no-width"'); // Measured entity link
|
|
$cols['descr'] = ['Description'];
|
|
$cols['sensor_class'] = ['Class', 'style="width: 100px;"'];
|
|
$cols['mib'] = ['MIB::Object'];
|
|
$cols[] = ['Thresholds', 'style="width: 100px;"'];
|
|
$cols[] = ['History'];
|
|
$cols['last_change'] = ['Last changed', 'style="width: 80px;"'];
|
|
$cols['event'] = ['Event', 'style="width: 60px; text-align: right;"'];
|
|
$cols['value'] = ['Value', 'style="width: 80px; text-align: right;"'];
|
|
|
|
if ($vars['page'] == "device") {
|
|
unset($cols['device']);
|
|
}
|
|
if ($vars['page'] != "device" || $vars['tab'] == "overview") {
|
|
unset($cols['mib']);
|
|
}
|
|
|
|
// if ( ( isset($vars['sensor_class']) && !is_array($vars['sensor_class']) ) ||
|
|
// ( isset($vars['class']) && !is_array($vars['class']) ) ||
|
|
// ( $vars['page'] == "device" && $vars['tab'] == "overview") ||
|
|
// ( isset($vars['metric']) && $vars['metric'] !== "sensors") ||
|
|
// ( $vars['page'] == "device" && $vars['tab'] == "ports" ) ) {
|
|
|
|
if ( !($vars['metric'] == "sensors" || // Display sensor_class on all-sensor pages
|
|
( !isset($vars['class']) || is_array($vars['class'])) &&
|
|
( !isset($vars['sensor_class']) || is_array($vars['sensor_class'])) &&
|
|
($vars['page'] != "device" && $vars['tab'] != "overview") )
|
|
) {
|
|
|
|
unset($cols['sensor_class']);
|
|
}
|
|
|
|
if ($vars['tab'] == "overview") {
|
|
unset($cols[1]);
|
|
} // Thresholds
|
|
|
|
echo(get_table_header($cols, $vars));
|
|
echo('<tbody>' . PHP_EOL);
|
|
}
|
|
|
|
function generate_sensor_line($sensor, $vars)
|
|
{
|
|
global $config;
|
|
|
|
humanize_sensor($sensor);
|
|
|
|
$graph_array = [];
|
|
$graph_array['to'] = get_time();
|
|
$graph_array['id'] = $sensor['sensor_id'];
|
|
$graph_array['type'] = "sensor_graph";
|
|
$graph_array['width'] = 80;
|
|
$graph_array['height'] = 20;
|
|
$graph_array['bg'] = 'ffffff00';
|
|
$graph_array['from'] = get_time('day');
|
|
$graph_array['style'] = 'margin-top: 5px';
|
|
|
|
if ($sensor['sensor_event'] && is_numeric($sensor['sensor_value'])) {
|
|
$mini_graph = generate_graph_tag($graph_array);
|
|
} else {
|
|
$mini_graph = '';
|
|
}
|
|
|
|
$text = '<span class="' . $sensor['event_class'] . '">' . $sensor['human_value'] . $sensor['sensor_symbol'] . '</span>';
|
|
|
|
$line = '<td class="entity ' . $sensor['row_class'] . '">';
|
|
//$line = '<td class="state-marker"></td>';
|
|
//$btn_class = str_replace('label', 'btn', $sensor['event_class']); // FIXME Need button-outline-* class from bs4+
|
|
if (get_var_true($vars['compact'])) {
|
|
$line .= '<button class="btn btn-default" style="width: 105px; text-align: right;">';
|
|
} else {
|
|
// fixed button size for keep size without images
|
|
$line .= '<button class="btn btn-default" style="width: 105px; height: 55px;">';
|
|
}
|
|
|
|
$icon = get_icon($config['sensor_types'][$sensor['sensor_class']]['icon']);
|
|
if ($sensor['sensor_class'] === 'power' || $sensor['sensor_class'] === 'dbm') {
|
|
if (str_icontains_array($sensor['sensor_descr'], [' Rx', 'Rx ', 'Receive'])) {
|
|
// rx
|
|
$icon = get_icon('glyphicon-arrow-down text-primary') . ' ';
|
|
} elseif (str_icontains_array($sensor['sensor_descr'], [' Tx', 'Tx ', 'Trans'])) {
|
|
// tx
|
|
$icon = get_icon('glyphicon-arrow-up text-danger') . ' ';
|
|
}
|
|
}
|
|
|
|
$line .= $icon . ' ';
|
|
$line .= generate_entity_link('sensor', $sensor, $text, NULL, FALSE);
|
|
if (!get_var_true($vars['compact'])) {
|
|
$line .= '<br />' . generate_entity_link('sensor', $sensor, $mini_graph, NULL, FALSE);
|
|
}
|
|
$line .= '</button>';
|
|
$line .= '</td>';
|
|
|
|
//r($line);
|
|
return $line;
|
|
}
|
|
|
|
function get_compact_sensors_line($measured_class, $entry, $vars) {
|
|
|
|
// order dom sensors always by temperature, voltage, current, dbm, power
|
|
$order = [];
|
|
if (safe_count($entry) > 0) {
|
|
$classes = array_keys($entry);
|
|
//r($types);
|
|
switch($measured_class) {
|
|
case 'port':
|
|
// always display all classes for dom (also if not exist)
|
|
$order = [ 'temperature', 'voltage', 'current', /* 'dbm', 'power' */ ];
|
|
// or dbm or power
|
|
if (in_array('dbm', $classes, TRUE)) {
|
|
$order[] = 'dbm';
|
|
} elseif (in_array('power', $classes, TRUE)) {
|
|
$order[] = 'power';
|
|
} else {
|
|
$order[] = 'dbm';
|
|
}
|
|
break;
|
|
|
|
case 'outlet':
|
|
// always display all classes for dom (also if not exist)
|
|
$order = [ 'voltage', 'current', 'power', 'load' ];
|
|
break;
|
|
|
|
default:
|
|
$order = array_intersect([ 'temperature', 'voltage', 'current', 'dbm', 'power' ], $classes);
|
|
}
|
|
$order = array_merge($order, array_diff($classes, $order));
|
|
//r($order);
|
|
}
|
|
|
|
$line = '';
|
|
foreach ($order as $class) {
|
|
if (!isset($entry[$class])) {
|
|
// Add empty columns for port entities (for correct aligning)
|
|
$line .= '<td class="entity" style="min-width: 60px;"></td>';
|
|
}
|
|
|
|
foreach ($entry[$class] as $sensor) {
|
|
/*
|
|
$sensor['sensor_descr'] = trim(str_ireplace($rename_from, '', $sensor['sensor_descr']), ":- \t\n\r\0\x0B");
|
|
if (empty($sensor['sensor_descr'])) {
|
|
// Some time sensor descriptions equals to entity name
|
|
$sensor['sensor_descr'] = nicecase($sensor['sensor_class']);
|
|
}
|
|
*/
|
|
|
|
// Compact view per entity/lane
|
|
$line .= generate_sensor_line($sensor, $vars);
|
|
}
|
|
}
|
|
|
|
return $line;
|
|
}
|
|
|
|
function print_sensor_row($sensor, $vars)
|
|
{
|
|
echo generate_sensor_row($sensor, $vars);
|
|
}
|
|
|
|
function generate_sensor_row($sensor, $vars)
|
|
{
|
|
global $config;
|
|
|
|
humanize_sensor($sensor);
|
|
|
|
$table_cols = 4;
|
|
|
|
$graph_array = [];
|
|
$graph_array['to'] = get_time();
|
|
$graph_array['id'] = $sensor['sensor_id'];
|
|
$graph_array['type'] = "sensor_graph";
|
|
$graph_array['width'] = 80;
|
|
$graph_array['height'] = 20;
|
|
$graph_array['bg'] = 'ffffff00';
|
|
$graph_array['from'] = get_time('day');
|
|
|
|
if ($sensor['sensor_event'] && is_numeric($sensor['sensor_value'])) {
|
|
$mini_graph = generate_graph_tag($graph_array);
|
|
} else {
|
|
// Do not show "Draw Error" minigraph
|
|
$mini_graph = '';
|
|
}
|
|
|
|
$row = '
|
|
<tr class="' . $sensor['row_class'] . '">
|
|
<td class="state-marker"></td>';
|
|
|
|
if ($vars['page'] != "device" && $vars['popup'] != TRUE) {
|
|
$row .= ' <td class="entity">' . generate_device_link($sensor) . '</td>' . PHP_EOL;
|
|
$table_cols++;
|
|
}
|
|
|
|
// Measured link & icon
|
|
/* Disabled because it breaks the overview box layout
|
|
$row .= ' <td style="padding-right: 0px;" class="no-width vertical-align">'; // minify column if empty
|
|
if ($vars['entity_icon']) // this used for entity popup
|
|
{
|
|
$row .= get_icon($config['sensor_types'][$sensor['sensor_class']]['icon']);
|
|
}
|
|
else if ($sensor['measured_entity'] &&
|
|
(!isset($vars['measured_icon']) || $vars['measured_icon'])) // hide measured icon if not required
|
|
{
|
|
//$row .= generate_entity_link($sensor['measured_class'], $sensor['measured_entity'], get_icon($sensor['measured_class']));
|
|
$row .= generate_entity_icon_link($sensor['measured_class'], $sensor['measured_entity']);
|
|
}
|
|
$row .= '</td>';
|
|
$table_cols++;
|
|
*/
|
|
|
|
$row .= ' <td class="entity">' . generate_entity_link("sensor", $sensor) . '</td>';
|
|
$table_cols++;
|
|
|
|
if ( $vars['metric'] == "sensors" || // Display sensor_class on all-sensor pages
|
|
( !isset($vars['class']) || is_array($vars['class'])) &&
|
|
( !isset($vars['sensor_class']) || is_array($vars['sensor_class'])) &&
|
|
($vars['page'] != "device" && $vars['tab'] != "overview")) {
|
|
$row .= ' <td>' . get_type_class_label($sensor['sensor_class'], 'sensor') . '</td>' . PHP_EOL;
|
|
$table_cols++;
|
|
}
|
|
|
|
// FIXME -- Generify this. It's not just for sensors.
|
|
if ($vars['page'] === "device" && $vars['tab'] !== "overview") {
|
|
$row .= ' <td><span class="label-group">' . (!safe_empty($sensor['sensor_mib']) ? '<span class="label label-primary"><a href="' . OBSERVIUM_MIBS_URL . '/' . $sensor['sensor_mib'] . '/" target="_blank">' . nicecase($sensor['sensor_mib']) . '</a></span>' : '') .
|
|
(!safe_empty($sensor['sensor_mib']) ? '<span class="label label-success"><a href="' . OBSERVIUM_MIBS_URL . '/' . $sensor['sensor_mib'] . '/#' . $sensor['sensor_object'] . '" target="_blank">' . $sensor['sensor_object'] . '</a></span>' : '') .
|
|
'<span class="label label-delayed">' . $sensor['sensor_index'] . '</span></span></td>' . PHP_EOL;
|
|
$table_cols++;
|
|
}
|
|
|
|
|
|
if ($vars['tab'] !== 'overview') {
|
|
$sensor_thresholds_class = $sensor['sensor_custom_limit'] ? ' label-suppressed' : '';
|
|
$sensor_thresholds = $sensor['sensor_custom_limit'] ? generate_tooltip_link(NULL, $sensor['sensor_thresholds'], 'Custom thresholds') : $sensor['sensor_thresholds'];
|
|
$row .= ' <td><span class="label' . $sensor_thresholds_class . '">' . $sensor_thresholds . '</span></td>' . PHP_EOL;
|
|
$table_cols++;
|
|
}
|
|
$row .= ' <td style="width: 90px; text-align: right;">' . generate_entity_link('sensor', $sensor, $mini_graph, NULL, FALSE) . '</td>';
|
|
|
|
if ($vars['tab'] !== 'overview') {
|
|
$row .= ' <td style="white-space: nowrap">' . ($sensor['sensor_last_change'] == '0' ? 'Never' : generate_tooltip_link(NULL, format_uptime((get_time('now') - $sensor['sensor_last_change']), 'short-2') . ' ago', format_unixtime($sensor['sensor_last_change']))) . '</td>';
|
|
$table_cols++;
|
|
$row .= ' <td style="text-align: right;"><strong>' . generate_tooltip_link('', $sensor['sensor_event'], $sensor['event_descr'], $sensor['event_class']) . '</strong></td>';
|
|
$table_cols++;
|
|
}
|
|
$sensor_tooltip = $sensor['event_descr'];
|
|
|
|
// Append value in alternative units to tooltip
|
|
if (isset($config['sensor_types'][$sensor['sensor_class']]['alt_units'])) {
|
|
foreach (value_to_units($sensor['sensor_value'],
|
|
$config['sensor_types'][$sensor['sensor_class']]['symbol'],
|
|
$sensor['sensor_class'],
|
|
$config['sensor_types'][$sensor['sensor_class']]['alt_units']) as $unit => $unit_value) {
|
|
if (is_numeric($unit_value)) {
|
|
$sensor_tooltip .= "<br />{$unit_value}{$unit}";
|
|
}
|
|
}
|
|
}
|
|
|
|
$row .= ' <td style="width: 80px; text-align: right;"><strong>' . generate_tooltip_link('', $sensor['human_value'] . $sensor['sensor_symbol'], $sensor_tooltip, $sensor['event_class']) . '</strong>
|
|
</tr>' . PHP_EOL;
|
|
|
|
if ($vars['view'] == "graphs" || $vars['id'] == $sensor['sensor_id']) {
|
|
$vars['graph'] = "graph";
|
|
}
|
|
if ($vars['graph']) {
|
|
$row .= '
|
|
<tr class="' . $sensor['row_class'] . '">
|
|
<td class="state-marker"></td>
|
|
<td colspan="' . $table_cols . '">';
|
|
|
|
$graph_array = [];
|
|
$graph_array['to'] = get_time();
|
|
$graph_array['id'] = $sensor['sensor_id'];
|
|
$graph_array['type'] = 'sensor_' . $vars['graph'];
|
|
|
|
$row .= generate_graph_row($graph_array, TRUE);
|
|
|
|
$row .= '</td></tr>';
|
|
} # endif graphs
|
|
|
|
return $row;
|
|
}
|
|
|
|
function print_sensor_form($vars, $single_device = FALSE)
|
|
{
|
|
global $config;
|
|
|
|
$form = ['type' => 'rows',
|
|
'space' => '10px',
|
|
'submit_by_key' => TRUE,
|
|
'url' => generate_url($vars)];
|
|
|
|
$form_items = [];
|
|
|
|
if ($single_device) {
|
|
// Single device, just hidden field
|
|
$form['row'][0]['device_id'] = [
|
|
'type' => 'hidden',
|
|
'name' => 'Device',
|
|
'value' => $vars['device_id'],
|
|
'grid' => 2,
|
|
'width' => '100%'];
|
|
} else {
|
|
$form_items['devices'] = generate_form_values('device', dbFetchColumn('SELECT DISTINCT `device_id` FROM `sensors`'));
|
|
|
|
$form['row'][0]['device_id'] = [
|
|
'type' => 'multiselect',
|
|
'name' => 'Device',
|
|
'value' => $vars['device_id'],
|
|
'grid' => 2,
|
|
'width' => '100%', //'180px',
|
|
'values' => $form_items['devices']];
|
|
}
|
|
|
|
$sensor_permitted = generate_query_permitted(['device', 'sensor']);
|
|
foreach (['sensor_class' => 'Sensor Class', 'sensor_event' => 'Sensor Event'] as $param => $param_name) {
|
|
$sql = 'SELECT DISTINCT `' . $param . '` FROM `sensors` WHERE `sensor_deleted` = ?' . $sensor_permitted;
|
|
if ($entries = dbFetchColumn($sql, [0])) {
|
|
asort($entries);
|
|
}
|
|
foreach ($entries as $entry) {
|
|
if (safe_empty($entry)) {
|
|
$entry = OBS_VAR_UNSET;
|
|
}
|
|
if ($param === 'sensor_class') {
|
|
$name = nicecase($entry);
|
|
if (isset($config['sensor_types'][$entry]['icon'])) {
|
|
$name = ['name' => $name, 'icon' => $config['sensor_types'][$entry]['icon']];
|
|
} else {
|
|
$name = ['name' => $name, 'icon' => $config['icon']['sensor']];
|
|
}
|
|
} else {
|
|
$name = $entry;
|
|
}
|
|
$form_items[$param][$entry] = $name;
|
|
}
|
|
|
|
// Alternative param name, ie event
|
|
$short_param = str_replace('sensor_', '', $param);
|
|
if (!isset($vars[$param]) && isset($vars[$short_param])) {
|
|
$vars[$param] = $vars[$short_param];
|
|
}
|
|
|
|
$form['row'][0][$param] = [
|
|
'type' => 'multiselect',
|
|
'name' => $param_name,
|
|
'width' => '100%', //'180px',
|
|
'grid' => 2,
|
|
'value' => $vars[$param],
|
|
'values' => $form_items[$param]];
|
|
}
|
|
// Currently unused, just dumb space
|
|
$form['row'][0]['sensor_value'] = [
|
|
'type' => 'hidden',
|
|
'name' => 'Value',
|
|
'width' => '100%', //'180px',
|
|
'grid' => 2,
|
|
'value' => $vars['sensor_value']];
|
|
|
|
// Measured entities
|
|
$form['row'][0]['measured_state'] = [
|
|
'type' => 'multiselect',
|
|
'name' => 'Measured State',
|
|
'width' => '100%', //'180px',
|
|
'grid' => 2,
|
|
'value' => $vars['measured_state'],
|
|
'values' => ['none' => ['name' => 'Without Measure', 'icon' => $config['icon']['filter']],
|
|
'up' => ['name' => 'Measured UP', 'icon' => $config['icon']['up']],
|
|
'down' => ['name' => 'Measured DOWN', 'icon' => $config['icon']['down']],
|
|
'shutdown' => ['name' => 'Measured SHUTDOWN', 'icon' => $config['icon']['shutdown']]]];
|
|
|
|
|
|
$form['row'][1]['sensor_descr'] = [
|
|
'type' => 'text',
|
|
'placeholder' => 'Sensor description',
|
|
'width' => '100%', //'180px',
|
|
'grid' => 4,
|
|
'value' => $vars['sensor_descr']];
|
|
|
|
|
|
$form['row'][1]['sensor_type'] = [
|
|
'type' => 'text',
|
|
'placeholder' => 'Sensor type',
|
|
'width' => '100%', //'180px',
|
|
'grid' => 4,
|
|
'value' => $vars['status_descr']];
|
|
|
|
// Groups
|
|
foreach (get_type_groups('sensor') as $entry) {
|
|
$form_items['group'][$entry['group_id']] = $entry['group_name'];
|
|
}
|
|
$form['row'][1]['group'] = [
|
|
'community' => FALSE,
|
|
'type' => 'multiselect',
|
|
'name' => 'Select Groups',
|
|
'width' => '100%', //'180px',
|
|
'grid' => 2,
|
|
'value' => $vars['group'],
|
|
'values' => $form_items['group']];
|
|
|
|
$form['row'][1]['search'] = [
|
|
'type' => 'submit',
|
|
'grid' => 2,
|
|
//'name' => 'Search',
|
|
//'icon' => 'icon-search',
|
|
'right' => TRUE];
|
|
|
|
|
|
// Show search form
|
|
echo '<div class="hidden-xl">';
|
|
print_form($form);
|
|
echo '</div>';
|
|
|
|
// Custom panel form
|
|
$panel_form = ['type' => 'rows',
|
|
'title' => 'Search Sensors',
|
|
'space' => '10px',
|
|
//'brand' => NULL,
|
|
//'class' => '',
|
|
'submit_by_key' => TRUE,
|
|
'url' => generate_url($vars)];
|
|
|
|
// Clean grids
|
|
foreach ($form['row'] as $row => $rows) {
|
|
foreach (array_keys($rows) as $param) {
|
|
if (isset($form['row'][$row][$param]['grid'])) {
|
|
unset($form['row'][$row][$param]['grid']);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Copy forms
|
|
$panel_form['row'][0]['device_id'] = $form['row'][0]['device_id'];
|
|
$panel_form['row'][0]['sensor_class'] = $form['row'][0]['sensor_class'];
|
|
|
|
$panel_form['row'][1]['sensor_event'] = $form['row'][0]['sensor_event'];
|
|
$panel_form['row'][1]['sensor_value'] = $form['row'][0]['sensor_value'];
|
|
|
|
$panel_form['row'][2]['measured_state'] = $form['row'][0]['measured_state'];
|
|
$panel_form['row'][2]['group'] = $form['row'][1]['group'];
|
|
|
|
$panel_form['row'][3]['sensor_type'] = $form['row'][1]['sensor_type'];
|
|
|
|
$panel_form['row'][4]['sensor_descr'] = $form['row'][1]['sensor_descr'];
|
|
|
|
//$panel_form['row'][5]['sort'] = $form['row'][0]['sort'];
|
|
$panel_form['row'][5]['search'] = $form['row'][1]['search'];
|
|
|
|
// Register custom panel
|
|
register_html_panel(generate_form($panel_form));
|
|
}
|
|
|
|
function print_sensor_permission_box($mode, $perms, $params = []) {
|
|
global $config;
|
|
|
|
echo generate_box_open([ 'header-border' => TRUE, 'title' => 'Sensor Permissions' ]);
|
|
|
|
if (!safe_empty($perms['sensor'])) {
|
|
echo('<table class="' . OBS_CLASS_TABLE . '">' . PHP_EOL);
|
|
|
|
foreach (array_keys($perms['sensor']) as $entity_id) {
|
|
$sensor = get_entity_by_id_cache('sensor', $entity_id);
|
|
$device = device_by_id_cache($sensor['device_id']);
|
|
|
|
echo('<tr><td style="width: 1px;"></td>
|
|
<td style="width: 200px; overflow: hidden;">' . get_icon($config['devicetypes'][$device['type']]['icon'] ?? $config['entities']['device']['icon']) . generate_entity_link('device', $device) . '</td>
|
|
<td style="overflow: hidden;">' . get_icon($config['entities']['sensor']['icon']) . generate_entity_link('sensor', $sensor) . '
|
|
<td width="25">');
|
|
|
|
$form = [];
|
|
$form['type'] = 'simple';
|
|
|
|
$action_del = $mode === 'role' ? 'role_entity_del' : 'user_perm_del';
|
|
// Elements
|
|
$form['row'][0]['action'] = [
|
|
'type' => 'hidden',
|
|
'value' => $action_del
|
|
];
|
|
$form['row'][0]['entity_id'] = [
|
|
'type' => 'hidden',
|
|
'value' => $sensor['sensor_id']
|
|
];
|
|
$form['row'][0]['entity_type'] = [
|
|
'type' => 'hidden',
|
|
'value' => 'sensor'
|
|
];
|
|
$form['row'][0]['submit'] = [
|
|
'type' => 'submit',
|
|
'name' => ' ',
|
|
'class' => 'btn-danger btn-mini',
|
|
'icon' => 'icon-trash',
|
|
'value' => $action_del
|
|
];
|
|
print_form($form);
|
|
unset($form);
|
|
|
|
echo('</td>
|
|
</tr>');
|
|
}
|
|
echo('</table>' . PHP_EOL);
|
|
|
|
} else {
|
|
echo('<p class="text-center text-warning bg-warning" style="padding: 10px; margin: 0px;"><strong>This '.$mode.' currently has no permitted sensors</strong></p>');
|
|
}
|
|
|
|
// Sensors
|
|
$permissions_list = array_keys((array)$perms['sensor']);
|
|
|
|
// Display devices this user doesn't have Permissions to
|
|
$form = [];
|
|
$form['type'] = 'simple';
|
|
$form['style'] = 'padding: 7px; margin: 0px;';
|
|
|
|
// Elements
|
|
if ($mode === 'role') {
|
|
$action_add = 'role_entity_add';
|
|
$form['row'][0]['role_id'] = [
|
|
'type' => 'hidden',
|
|
'value' => $params['role_id']
|
|
];
|
|
} else {
|
|
$action_add = 'user_perm_add';
|
|
$form['row'][0]['user_id'] = [
|
|
'type' => 'hidden',
|
|
'value' => $params['user_id']
|
|
];
|
|
}
|
|
$form['row'][0]['entity_type'] = [
|
|
'type' => 'hidden',
|
|
'value' => 'sensor'
|
|
];
|
|
$form['row'][0]['action'] = [
|
|
'type' => 'hidden',
|
|
'value' => $action_add
|
|
];
|
|
|
|
// FIXME, limit devices list only with sensors?
|
|
$form_items['devices'] = generate_form_values('device', array_keys((array)$perms['device']), NULL,
|
|
[ 'filter_mode' => 'exclude', 'subtext' => '%location%', 'show_disabled' => TRUE, 'show_icon' => TRUE ]);
|
|
$form['row'][0]['device_id'] = [
|
|
'type' => 'select',
|
|
'name' => 'Select a device',
|
|
'width' => '150px',
|
|
'onchange' => "getEntityList(this.value, 'sensor_entity_id', 'sensor')",
|
|
//'value' => $vars['device_id'],
|
|
'groups' => ['', 'UP', 'DOWN', 'DISABLED'], // This is optgroup order for values (if required)
|
|
'values' => $form_items['devices']];
|
|
$form['row'][0]['sensor_entity_id'] = [
|
|
'type' => 'multiselect',
|
|
'name' => 'Permit Sensor',
|
|
'width' => '150px',
|
|
//'value' => $vars['sensor_entity_id'],
|
|
'values' => []
|
|
];
|
|
// add button
|
|
$form['row'][0]['Submit'] = [
|
|
'type' => 'submit',
|
|
'name' => 'Add',
|
|
'icon' => $config['icon']['plus'],
|
|
'right' => TRUE,
|
|
'value' => 'Add'
|
|
];
|
|
print_form($form);
|
|
|
|
echo generate_box_close();
|
|
}
|
|
|
|
// EOF
|