diff --git a/includes/discovery/functions.inc.php b/includes/discovery/functions.inc.php index f5361cbcd7..9c59e9632c 100644 --- a/includes/discovery/functions.inc.php +++ b/includes/discovery/functions.inc.php @@ -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'; diff --git a/includes/discovery/sensors/humidity/apc.inc.php b/includes/discovery/sensors/humidity/apc.inc.php index 501e2e62a6..fe8cdeee4f 100644 --- a/includes/discovery/sensors/humidity/apc.inc.php +++ b/includes/discovery/sensors/humidity/apc.inc.php @@ -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); + } +} diff --git a/includes/discovery/sensors/pre-cache/apc.inc.php b/includes/discovery/sensors/pre-cache/apc.inc.php index fddc6ffa1a..121c39230a 100644 --- a/includes/discovery/sensors/pre-cache/apc.inc.php +++ b/includes/discovery/sensors/pre-cache/apc.inc.php @@ -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'); diff --git a/includes/discovery/sensors/state/apc.inc.php b/includes/discovery/sensors/state/apc.inc.php index d0922bff58..4e99714eec 100644 --- a/includes/discovery/sensors/state/apc.inc.php +++ b/includes/discovery/sensors/state/apc.inc.php @@ -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); + } +} diff --git a/includes/discovery/sensors/temperature/apc.inc.php b/includes/discovery/sensors/temperature/apc.inc.php index c7b175e097..be52da254f 100644 --- a/includes/discovery/sensors/temperature/apc.inc.php +++ b/includes/discovery/sensors/temperature/apc.inc.php @@ -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); + } +} diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index 2bb56c48de..3adb741876 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -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); +} diff --git a/misc/db_schema.yaml b/misc/db_schema.yaml index 9ab584fb80..e7c6043fd4 100644 --- a/misc/db_schema.yaml +++ b/misc/db_schema.yaml @@ -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 } diff --git a/sql-schema/192.sql b/sql-schema/192.sql new file mode 100644 index 0000000000..e67b317c9d --- /dev/null +++ b/sql-schema/192.sql @@ -0,0 +1 @@ +ALTER TABLE `sensors` ADD `user_func` VARCHAR(100) NULL; \ No newline at end of file