commit version 22.12.12447

This commit is contained in:
2023-01-01 22:36:12 -05:00
parent af1b03d79f
commit b948283a96
744 changed files with 620715 additions and 27381 deletions

View File

@ -118,9 +118,11 @@ if ($device['state']['la']['5min']) {
} else {
$la_class = '';
}
echo('<tr>
echo('<tr>
<td class="entity">Load average</td>
<td class="'.$la_class.'">' . $device['state']['la']['1min'] . ', ' . $device['state']['la']['5min'] . ', ' . $device['state']['la']['15min'] . '</td>
<td class="'.$la_class.'">' . number_format((float)$device['state']['la']['1min'],2) . ', ' .
number_format((float)$device['state']['la']['5min'], 2) . ', ' .
number_format((float)$device['state']['la']['15min'], 2) . '</td>
</tr>');
}

View File

@ -128,7 +128,9 @@ if ($device['state']['la']['5min']) {
}
echo('<tr>
<td class="entity">Load average</td>
<td class="'.$la_class.'">' . $device['state']['la']['1min'] . ', ' . $device['state']['la']['5min'] . ', ' . $device['state']['la']['15min'] . '</td>
<td class="'.$la_class.'">' . number_format((float)$device['state']['la']['1min'],2) . ', ' .
number_format((float)$device['state']['la']['5min'], 2) . ', ' .
number_format((float)$device['state']['la']['15min'], 2) . '</td>
</tr>');
}

View File

@ -6,22 +6,40 @@
*
* @package observium
* @subpackage web
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2021 Observium Limited
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
*
*/
$sensor_types = array_keys($config['sensor_types']);
// Keep sensors order for base types static
$sensor_types = [ 'temperature', 'humidity', 'fanspeed', 'airflow', 'current', 'voltage', 'power', 'apower', 'rpower', 'frequency' ];
$other_types = array_diff(array_keys($config['sensor_types']), $sensor_types);
$sensor_types = array_merge($sensor_types, $other_types);
//r($sensor_types);
$measured_entindex = []; // collect measured entities
$measured_ifindex = []; // collect measured entities (by ifindex)
$measured_multi = [];
$sensors_db = [];
//foreach ($sensor_types as $sensor_type) {
$sql = "SELECT * FROM `sensors`";
//$sql .= " WHERE `sensor_class` = ? AND `device_id` = ? AND `sensor_deleted` = 0 ORDER BY `sensor_type`, `entPhysicalIndex` * 1, `sensor_descr`"; // order numerically by entPhysicalIndex for ports
$sql .= " WHERE `device_id` = ? " . generate_query_values($sensor_types, 'sensor_class') .
$sql .= " WHERE `device_id` = ? " . generate_query_values_and($sensor_types, 'sensor_class') .
" AND `sensor_deleted` = 0 ORDER BY `entPhysicalIndex_measured` * 1, `entPhysicalIndex` * 1, `sensor_descr`"; // order numerically by entPhysicalIndex for ports
// Cache all sensors
foreach (dbFetchRows($sql, [ $device['device_id'] ]) as $entry) {
if (is_numeric($entry['measured_entity']) && strlen($entry['measured_class'])) {
if (is_numeric($entry['measured_entity']) && !safe_empty($entry['measured_class'])) {
// Collect entPhysical entities
if (!(isset($measured_entindex[$entry['measured_entity']]) || isset($measured_ifindex[$entry['measured_entity']]))) {
if ($entry['entPhysicalIndex']) {
$measured_entindex[$entry['measured_entity']] = $entry['entPhysicalIndex'];
} elseif ($entry['measured_class'] === 'port') {
// When not correct entPhysicalIndex stored
$port = get_port_by_id_cache($entry['measured_entity']);
$measured_ifindex[$entry['measured_entity']] = $port['ifIndex'];
}
}
// Sensors bounded with measured class, mostly ports
// array index -> ['measured']['port']['345'][] = sensor array
switch ($entry['measured_class']) {
@ -33,12 +51,16 @@ $measured_multi = [];
$lane = 0;
}
$sensors_db['measured'][$entry['measured_class']][$entry['measured_entity']][$entry['sensor_class']][] = $entry;
$measured_multi[$entry['measured_class']][$entry['measured_entity']][$lane][$entry['sensor_class']][] = $entry;
$measured_multi[$entry['measured_class']][$entry['measured_entity']][$lane][$entry['sensor_class']][] = $entry;
break;
default:
$sensors_db['measured'][$entry['measured_class']][$entry['measured_entity']][$entry['sensor_class']][] = $entry;
}
} elseif ($entry['measured_class'] === 'outlet' && !safe_empty($entry['measured_entity_label'])) {
// Outlet currently not have real entity associations
//r($entry);
$sensors_db['measured'][$entry['measured_class']][$entry['measured_entity_label']][$entry['sensor_class']][] = $entry;
} else {
$sensors_db[$entry['sensor_class']][$entry['sensor_id']] = $entry;
}
@ -47,84 +69,162 @@ $measured_multi = [];
//r($sensors_db['measured']);
//r($measured_multi);
// Print Multi sensors at single line for each entity
/* WiP
if (count($measured_multi)) {
$vars['measured_icon'] = FALSE; // Hide measured icons
foreach ($measured_multi as $measured_class => $measured_entity) {
$box_args = ['title' => nicecase($measured_class) . ' sensors',
'url' => generate_url(['page' => 'device', 'device' => $device['device_id'], 'tab' => $measured_class . 's', 'view' => 'sensors']),
'icon' => $config['icon']['sensor']
];
echo generate_box_open($box_args);
echo ' <table class="table table-condensed table-striped">';
echo ' </table>';
echo generate_box_close();
}
}
*/
// Now print founded bundle (measured_class+sensor)
if (isset($sensors_db['measured'])) {
$vars['measured_icon'] = FALSE; // Hide measured icons
// Fetch entphysical serials and part/vendor names
$measured_entphysical = [];
if ($measured_entindex) {
foreach (dbFetchRows('SELECT * FROM `entPhysical` WHERE `device_id` = ? AND `deleted` IS NULL' . generate_query_values_and($measured_entindex, 'entPhysicalIndex'), [ $device['device_id'] ]) as $entry) {
foreach ($measured_entindex as $entity_id => $entPhysicalIndex) {
if ($entPhysicalIndex === $entry['entPhysicalIndex']) {
if (empty($entry['entPhysicalModelName']) && empty($entry['entPhysicalSerialNum'])) {
// Containers.. try to get inside
//r($entry);
$tmp_entry = dbFetchRow('SELECT * FROM `entPhysical` WHERE `device_id` = ? AND `deleted` IS NULL AND `entPhysicalIndex` = ?', [ $device['device_id'], $entry['entPhysicalContainedIn'] ]);
if (!empty($tmp_entry['entPhysicalModelName']) || !empty($tmp_entry['entPhysicalSerialNum'])) {
$entry = $tmp_entry;
//r($tmp_entry);
}
}
$measured_entphysical[$entity_id] = $entry;
unset($measured_entindex[$entity_id]);
break;
}
}
}
}
if ($measured_ifindex) {
foreach (dbFetchRows('SELECT * FROM `entPhysical` WHERE `device_id` = ? AND `deleted` IS NULL' . generate_query_values_and($measured_ifindex, 'ifIndex'), [ $device['device_id'] ]) as $entry) {
foreach ($measured_ifindex as $entity_id => $ifIndex) {
if ($ifIndex === $entry['ifIndex']) {
$measured_entphysical[$entity_id] = $entry;
unset($measured_ifindex[$entity_id]);
break;
}
}
}
}
//r($measured_entphysical);
$show_compact = $config['sensors']['web_measured_compact'];
foreach ($sensors_db['measured'] as $measured_class => $measured_entity) {
$box_args = array('title' => nicecase($measured_class).' sensors',
'url' => generate_url(array('page' => 'device', 'device' => $device['device_id'], 'tab' => $measured_class.'s', 'view' => 'sensors')),
'icon' => $config['icon']['sensor']
);
$box_args = [
'title' => nicecase($measured_class).' sensors',
'url' => generate_url([ 'page' => 'device', 'device' => $device['device_id'], 'tab' => $measured_class.'s', 'view' => 'sensors' ]),
'icon' => $config['icon']['sensor']
];
$box_args['header-controls'] = [
'controls' => [
'compact' => [ 'text' => $show_compact ? 'Full View' : 'Compact View',
'icon' => $show_compact ? 'glyphicon-th-list' : 'glyphicon-th',
'config' => 'sensors|web_measured_compact', // check this config
'value' => $show_compact ? 'no' : 'yes', // toggle
]
]
];
echo generate_box_open($box_args);
echo ' <table class="table table-condensed table-striped">';
foreach ($measured_entity as $entity_id => $entry)
{
$entity = get_entity_by_id_cache($measured_class, $entity_id);
//r($entity);
$entity_link = generate_entity_link($measured_class, $entity);
$entity_type = entity_type_translate_array($measured_class);
// Remove port name from sensor description
$rename_from = [];
if ($measured_class === 'port') {
if (is_numeric($entity['port_label'])) {
$rename_from[] = $entity['port_label'].' ';
} else {
$rename_from[] = $entity['port_label'];
$rename_from[] = $entity['ifDescr'];
$rename_from[] = $entity['port_label_short'];
}
if (strlen($entity['port_label_base']) > 4) { $rename_from[] = $entity['port_label_base']; }
$rename_from = array_unique($rename_from);
//r($measured_entity);
foreach ($measured_entity as $entity_id => $entry) {
if ($measured_class === 'outlet') {
// Outlets not have real entities association
$entity = [];
$entity_link = $entity_id; // Just Outlet Label
$entity_type = [ 'icon' => 'outlet' ];
$entity_parts = '';
} else {
$rename_from[] = entity_rewrite($measured_class, $entity);
// Common known entities
$entity = get_entity_by_id_cache($measured_class, $entity_id);
//r($entity);
$entity_link = generate_entity_link($measured_class, $entity);
$entity_type = entity_type_translate_array($measured_class);
$entity_parts = '';
if ($measured_entphysical[$entity_id]) {
// Entity Vendor/PartNum/Serial
if ($measured_entphysical[$entity_id]['entPhysicalMfgName']) {
$entity_parts .= ' <span class="label label-info">' . $measured_entphysical[$entity_id]['entPhysicalMfgName'] . '</span>';
}
if ($measured_entphysical[$entity_id]['entPhysicalModelName']) {
$entity_parts .= ' <span class="label label-warning">' . $measured_entphysical[$entity_id]['entPhysicalModelName'] . '</span>';
}
if ($measured_entphysical[$entity_id]['entPhysicalSerialNum']) {
$entity_parts .= ' <span class="label label-primary">SN: ' . $measured_entphysical[$entity_id]['entPhysicalSerialNum'] . '</span>';
}
}
// Remove port name from sensor description
$rename_from = [];
if ($measured_class === 'port') {
if (is_numeric($entity['port_label'])) {
$rename_from[] = $entity['port_label'] . ' ';
} else {
$rename_from[] = $entity['port_label'];
$rename_from[] = $entity['ifDescr'];
$rename_from[] = $entity['port_label_short'];
}
if (strlen($entity['port_label_base']) > 4) {
$rename_from[] = $entity['port_label_base'];
}
$rename_from = array_unique($rename_from);
} else {
entity_rewrite($measured_class, $entity);
}
$entity['rename_from'] = $rename_from;
}
//r($rename_from);
//echo(' <tr class="'.$port['row_class'].'">
// <td class="state-marker"></td>
echo(' <tr>
<td colspan="6" class="entity">' . get_icon($entity_type['icon']) . '&nbsp;' . $entity_link . '</td></tr>');
<td colspan="6" class="entity">' . get_icon($entity_type['icon']) . '&nbsp;' . $entity_link . $entity_parts . '</td></tr>');
// order dom sensors always by temperature, voltage, current, dbm, power
$order = [];
if (safe_count($entry) > 0) {
$classes = array_keys($entry);
//r($types);
$order = array_intersect([ 'temperature', 'voltage', 'current', 'dbm', 'power' ], $classes);
$order = array_merge($order, array_diff($classes, $order));
//r($order);
}
foreach ($order as $class) {
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']);
if ($show_compact && $measured_class !== 'outlet') {
// In compact view need multi-lane split
$lanes_count = safe_count($measured_multi[$measured_class][$entity_id]);
if ($lanes_count > 1) {
if (isset($measured_multi[$measured_class][$entity_id][0]) && $lanes_count === 5) {
// Multilane with separated voltage or others
for ($i = 1; $i <= 4; $i++) {
$measured_multi[$measured_class][$entity_id][$i] = array_merge($measured_multi[$measured_class][$entity_id][$i],
$measured_multi[$measured_class][$entity_id][0]);
}
unset($measured_multi[$measured_class][$entity_id][0]);
}
foreach ($measured_multi[$measured_class][$entity_id] as $lane => $lane_entry) {
echo '<tr><td style="width: 10px;" class="vertical-align"><span class="label">L'.$lane.'</span></td>' .
get_compact_sensors_line($measured_class, $lane_entry, $vars) . '</tr>';
}
} else {
echo '<tr><td style="width: 10px;"></td>' . get_compact_sensors_line($measured_class, $entry, $vars) . '</tr>';
}
} else {
// order dom sensors always by temperature, voltage, current, dbm, power
$order = [];
if (safe_count($entry) > 0) {
$classes = array_keys($entry);
//r($types);
$order = array_intersect([ 'temperature', 'voltage', 'current', 'dbm', 'power' ], $classes);
$order = array_merge($order, array_diff($classes, $order));
//r($order);
}
print_sensor_row($sensor, $vars);
foreach ($order as $class) {
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']);
}
print_sensor_row($sensor, $vars);
}
}
}
//if ($show_compact) { echo '<tr>' . $line . '</tr>'; }
}
?>
@ -136,27 +236,23 @@ if (isset($sensors_db['measured'])) {
unset($sensors_db['measured']);
}
foreach ($sensors_db as $sensor_type => $sensors)
{
if ($sensor_type === 'measured') { continue; } // Just be on the safe side
foreach ($sensor_types as $sensor_type) {
if (safe_empty($sensors_db[$sensor_type])) { continue; }
if (count($sensors))
{
$box_args = array('title' => nicecase($sensor_type),
'url' => generate_url(array('page' => 'device', 'device' => $device['device_id'], 'tab' => 'health', 'metric' => $sensor_type)),
'icon' => $config['sensor_types'][$sensor_type]['icon'],
);
echo generate_box_open($box_args);
$box_args = [
'title' => nicecase($sensor_type),
'url' => generate_url([ 'page' => 'device', 'device' => $device['device_id'], 'tab' => 'health', 'metric' => $sensor_type ]),
'icon' => $config['sensor_types'][$sensor_type]['icon'],
];
echo generate_box_open($box_args);
echo('<table class="table table-condensed table-striped">');
foreach ($sensors as $sensor)
{
print_sensor_row($sensor, $vars);
}
echo("</table>");
echo generate_box_close();
echo('<table class="table table-condensed table-striped">');
foreach ($sensors_db[$sensor_type] as $sensor) {
print_sensor_row($sensor, $vars);
}
echo("</table>");
echo generate_box_close();
}
// EOF

View File

@ -6,57 +6,50 @@
*
* @package observium
* @subpackage web
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2020 Observium Limited
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
*
*/
$graph_type = "storage_usage";
$sql = "SELECT * FROM `storage`";
//$sql .= " LEFT JOIN `storage-state` USING(`storage_id`)";
$sql .= " WHERE `device_id` = ?";
$sql .= " WHERE `device_id` = ? AND `storage_ignore` = ? AND `storage_deleted` = ?";
$drives = dbFetchRows($sql, array($device['device_id']));
$drives = dbFetchRows($sql, [ $device['device_id'], 0, 0 ]);
if (count($drives))
{
$drives = array_sort_by($drives, 'storage_descr', SORT_ASC, SORT_STRING);
if (!safe_empty($drives)) {
$drives = array_sort_by($drives, 'storage_mib', SORT_ASC, SORT_STRING,
'storage_descr', SORT_ASC, SORT_STRING);
$box_args = array('title' => 'Storage',
'url' => generate_url(array('page' => 'device', 'device' => $device['device_id'], 'tab' => 'health', 'metric' => 'storage')),
'icon' => $config['icon']['storage'],
);
$box_args = [
'title' => 'Storage',
'url' => generate_url([ 'page' => 'device', 'device' => $device['device_id'], 'tab' => 'health', 'metric' => 'storage' ]),
'icon' => $config['icon']['storage'],
];
echo generate_box_open($box_args);
echo('<table class="table table-condensed table-striped">');
foreach ($drives as $drive)
{
foreach ($drives as $drive) {
$skipdrive = FALSE;
if ($device["os"] === "junos")
{
foreach ($config['ignore_junos_os_drives'] as $jdrive)
{
if (preg_match($jdrive, $drive["storage_descr"]))
{
if ($device["os"] === "junos") {
foreach ($config['ignore_junos_os_drives'] as $jdrive) {
if (preg_match($jdrive, $drive["storage_descr"])) {
$skipdrive = TRUE;
}
}
//$drive["storage_descr"] = preg_replace("/.*mounted on: (.*)/", "\\1", $drive["storage_descr"]);
}
if ($device['os'] === "freebsd")
{
foreach ($config['ignore_bsd_os_drives'] as $jdrive)
{
if (preg_match($jdrive, $drive["storage_descr"]))
{
if ($device['os'] === "freebsd") {
foreach ($config['ignore_bsd_os_drives'] as $jdrive) {
if (preg_match($jdrive, $drive["storage_descr"])) {
$skipdrive = TRUE;
}
}
}
if ($drive['storage_ignore']) { $skipdrive = TRUE; }
//if ($drive['storage_ignore']) { $skipdrive = TRUE; }
if ($skipdrive) { continue; }
@ -69,13 +62,13 @@ if (count($drives))
$used = formatStorage($drive['storage_used']);
$background = get_percentage_colours($percent);
$graph_array = array();
$graph_array = [];
$graph_array['height'] = "100";
$graph_array['width'] = "210";
$graph_array['to'] = $config['time']['now'];
$graph_array['to'] = get_time();
$graph_array['id'] = $drive['storage_id'];
$graph_array['type'] = $graph_type;
$graph_array['from'] = $config['time']['day'];
$graph_array['from'] = get_time('day');
$graph_array['legend'] = "no";
$link_array = $graph_array;
@ -85,7 +78,9 @@ if (count($drives))
$overlib_content = generate_overlib_content($graph_array, $device['hostname'] . " - " . $drive['storage_descr']);
$graph_array['width'] = 80; $graph_array['height'] = 20; $graph_array['bg'] = 'ffffff00';
$graph_array['width'] = 80;
$graph_array['height'] = 20;
$graph_array['bg'] = 'ffffff00';
// $graph_array['style'][] = 'margin-top: -6px';
$minigraph = generate_graph_tag($graph_array);