newdevice: Added more health information for APC units (#6619)

* fix: Fixed apc state support emsOutput

* newdevice: Added more health information for APC devices

* update schema file

* schema file renamed
This commit is contained in:
Neil Lathwood
2017-05-17 22:41:53 +01:00
committed by GitHub
parent f43ad4629c
commit 895801d855
8 changed files with 117 additions and 7 deletions

View File

@@ -187,7 +187,7 @@ function discover_device(&$device, $options = null)
// Discover sensors
function discover_sensor(&$valid, $class, $device, $oid, $index, $type, $descr, $divisor = 1, $multiplier = 1, $low_limit = null, $low_warn_limit = null, $warn_limit = null, $high_limit = null, $current = null, $poller_type = 'snmp', $entPhysicalIndex = null, $entPhysicalIndex_measured = null)
function discover_sensor(&$valid, $class, $device, $oid, $index, $type, $descr, $divisor = 1, $multiplier = 1, $low_limit = null, $low_warn_limit = null, $warn_limit = null, $high_limit = null, $current = null, $poller_type = 'snmp', $entPhysicalIndex = null, $entPhysicalIndex_measured = null, $user_func = null)
{
$low_limit = set_null($low_limit);
@@ -241,6 +241,7 @@ function discover_sensor(&$valid, $class, $device, $oid, $index, $type, $descr,
'sensor_current' => $current,
'entPhysicalIndex' => $entPhysicalIndex,
'entPhysicalIndex_measured' => $entPhysicalIndex_measured,
'user_func' => $user_func,
);
foreach ($insert as $key => $val_check) {
@@ -324,7 +325,8 @@ function discover_sensor(&$valid, $class, $device, $oid, $index, $type, $descr,
$multiplier == $sensor_entry['sensor_multiplier'] &&
$divisor == $sensor_entry['sensor_divisor'] &&
$entPhysicalIndex_measured == $sensor_entry['entPhysicalIndex_measured'] &&
$entPhysicalIndex == $sensor_entry['entPhysicalIndex']
$entPhysicalIndex == $sensor_entry['entPhysicalIndex'] &&
$user_func == $sensor_entry['user_func']
) {
echo '.';
} else {
@@ -335,6 +337,7 @@ function discover_sensor(&$valid, $class, $device, $oid, $index, $type, $descr,
'sensor_divisor' => $divisor,
'entPhysicalIndex' => $entPhysicalIndex,
'entPhysicalIndex_measured' => $entPhysicalIndex_measured,
'user_func' => $user_func,
);
$updated = dbUpdate($update, 'sensors', '`sensor_id` = ?', array($sensor_entry['sensor_id']));
echo 'U';

View File

@@ -39,3 +39,14 @@ foreach (array_keys($apc_env_data) as $index) {
}
}
}
foreach ($pre_cache['mem_sensors_status'] as $index => $data) {
$cur_oid = '.1.3.6.1.4.1.318.1.1.10.4.2.3.1.6.' . $index;
$descr = $data['memSensorsStatusSensorName'] . ' - ' . $data['memSensorsStatusSensorLocation'];
$divisor = 1;
$multiplier = 1;
$value = $data['memSensorsHumidity'];
if (is_numeric($value)) {
discover_sensor($valid['sensor'], 'humidity', $device, $cur_oid, 'memSensorsHumidity.' . $index, 'apc', $descr, $divisor, $multiplier, null, null, null, null, $value);
}
}

View File

@@ -25,5 +25,11 @@
echo 'coolingUnitStatusAnalogEntry ';
$pre_cache['cooling_unit_analog'] = snmpwalk_cache_oid($device, 'coolingUnitStatusAnalogEntry', array(), 'PowerNet-MIB');
echo 'upsPhaseNumInputPhases';
echo 'upsPhaseNumInputPhases ';
$pre_cache['apcups_phase_count'] = snmp_get($device, 'upsPhaseNumInputPhases.1', '-OQv', 'PowerNet-MIB');
echo 'memSensorsStatusTable ';
$pre_cache['mem_sensors_status'] = snmpwalk_cache_oid($device, 'memSensorsStatusTable', array(), 'PowerNet-MIB', null, '-OQUse');
echo 'memSensorsStatusSysTempUnits ';
$pre_cache['memSensorsStatusSysTempUnits'] = snmp_get($device, 'memSensorsStatusSysTempUnits.0', '-OQv', 'PowerNet-MIB');

View File

@@ -131,8 +131,8 @@ foreach ($relays as $index => $data) {
}
$current = apc_relay_state($data['emsOutputRelayControlOutputRelayCommand']);
if (is_numeric($current)) {
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $cur_oid, 'apc', $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $index);
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $cur_oid, $state_name, $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $cur_oid);
}
}
unset(
@@ -165,8 +165,8 @@ foreach ($switched as $index => $data) {
}
$current = apc_relay_state($data['emsOutletControlOutletCommand']);
if (is_numeric($current)) {
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $cur_oid, 'apc', $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $index);
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $cur_oid, $state_name, $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $cur_oid);
}
}
unset(
@@ -174,3 +174,67 @@ unset(
$index,
$data
);
foreach ($pre_cache['mem_sensors_status'] as $index => $data) {
if ($data['memSensorsCommStatus']) {
$cur_oid = '.1.3.6.1.4.1.318.1.1.10.4.2.3.1.7.' . $index;
$state_name = 'memSensorsCommStatus';
$state_index_id = create_state_index($state_name);
if ($state_index_id !== null) {
$states = array(
array($state_index_id,'notInstalled',0,1,1),
array($state_index_id,'commsOK',0,2,0),
array($state_index_id,'commsLost',0,3,2),
);
foreach ($states as $value) {
$insert = array(
'state_index_id' => $value[0],
'state_descr' => $value[1],
'state_draw_graph' => $value[2],
'state_value' => $value[3],
'state_generic_value' => $value[4]
);
dbInsert($insert, 'state_translations');
}
}
$current = $data['memSensorsCommStatus'];
}
$descr = $data['memSensorsStatusSensorName'] . ' - ' . $data['memSensorsStatusSensorLocation'];
$divisor = 1;
$multiplier = 1;
if (is_numeric($current)) {
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $state_name . '.' . $index, $state_name, $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $state_name . '.' . $index);
}
if ($data['memSensorsAlarmStatus']) {
$cur_oid = '.1.3.6.1.4.1.318.1.1.10.4.2.3.1.8.' . $index;
$state_name = 'memSensorsAlarmStatus';
$state_index_id = create_state_index($state_name);
if ($state_index_id !== null) {
$states = array(
array($state_index_id,'memNormal',0,1,0),
array($state_index_id,'memWarning',0,2,1),
array($state_index_id,'memCritical',0,3,2),
);
foreach ($states as $value) {
$insert = array(
'state_index_id' => $value[0],
'state_descr' => $value[1],
'state_draw_graph' => $value[2],
'state_value' => $value[3],
'state_generic_value' => $value[4]
);
dbInsert($insert, 'state_translations');
}
}
$current = $data['memSensorsAlarmStatus'];
}
$descr = $data['memSensorsStatusSensorName'] . ' - ' . $data['memSensorsStatusSensorLocation'];
$divisor = 1;
$multiplier = 1;
if (is_numeric($current)) {
discover_sensor($valid['sensor'], 'state', $device, $cur_oid, $state_name . '.' . $index, $state_name, $state_name, '1', '1', null, null, null, null, $current);
create_sensor_to_state_index($device, $state_name, $state_name . '.' . $index);
}
}

View File

@@ -157,3 +157,18 @@ foreach ($cooling_unit_analog as $index => $data) {
discover_sensor($valid['sensor'], 'temperature', $device, $cur_oid, $cur_oid, 'apc', $descr, $scale, 1, null, null, null, null, $value);
}
}
foreach ($pre_cache['mem_sensors_status'] as $index => $data) {
$cur_oid = '.1.3.6.1.4.1.318.1.1.10.4.2.3.1.5.' . $index;
$descr = $data['memSensorsStatusSensorName'] . ' - ' . $data['memSensorsStatusSensorLocation'];
$divisor = 1;
$multiplier = 1;
$value = $data['memSensorsTemperature'];
if (is_numeric($value)) {
$user_func = null;
if ($pre_cache['memSensorsStatusSysTempUnits'] === 'fahrenheit') {
$user_func = 'convert_to_celsius';
}
discover_sensor($valid['sensor'], 'temperature', $device, $cur_oid, 'memSensorsTemperature.' . $index, 'apc', $descr, $divisor, $multiplier, null, null, null, null, $value, 'snmp', null, null, $user_func);
}
}

View File

@@ -65,6 +65,9 @@ function poll_sensor($device, $class)
require 'includes/polling/sensors/'. $class .'/'. $device['os'] .'.inc.php';
}
if (isset($sensor['user_func']) && function_exists($sensor['user_func'])) {
$sensor_value = $sensor['user_func']($sensor_value);
}
if ($class == 'temperature') {
preg_match('/[\d\.\-]+/', $sensor_value, $temp_response);
@@ -578,3 +581,9 @@ function update_application($app, $response, $current = '')
}
dbUpdate($data, 'applications', '`app_id` = ?', array($app['app_id']));
}
function convert_to_celsius($value)
{
$value = ($value - 32) / 1.8;
return sprintf('%.02f', $value);
}

View File

@@ -1319,6 +1319,7 @@ sensors:
sensor_oid: { Field: sensor_oid, Type: varchar(255), 'Null': false, Default: null, Extra: '' }
sensor_prev: { Field: sensor_prev, Type: float, 'Null': true, Default: null, Extra: '' }
sensor_type: { Field: sensor_type, Type: varchar(255), 'Null': false, Default: null, Extra: '' }
user_func: { Field: user_func, Type: varchar(100), 'Null': true, Default: null, Extra: '' }
Indexes:
PRIMARY: { Name: PRIMARY, Columns: [sensor_id], Unique: true, Type: BTREE }
sensor_host: { Name: sensor_host, Columns: [device_id], Unique: false, Type: BTREE }

1
sql-schema/192.sql Normal file
View File

@@ -0,0 +1 @@
ALTER TABLE `sensors` ADD `user_func` VARCHAR(100) NULL;