$entry) { $entry['found'] = FALSE; // Check duplicate processors by $valid['processor'] array if (discovery_check_if_type_exist($entry, 'processor')) { continue 2; } // Precision (scale) $precision = 1; if (isset($entry['scale']) && is_numeric($entry['scale']) && $entry['scale'] != 1) { // FIXME, currently we support only int precision, need convert all to float scale! $precision = round(1 / $entry['scale'], 0); } // Units, see: LANCOM-GS2310PPLUS-MIB $unit = $entry['unit'] ?? NULL; if ($entry['type'] === 'table') { // Use the type as the table if no table is set. if (!isset($entry['table'])) { $entry['table'] = $entry_name; } // Fetch table or Oids $table_oids = [ 'oid', 'oid_descr', 'oid_scale', 'oid_precision', 'oid_count', //'oid_limit_low', 'oid_limit_low_warn', 'oid_limit_high_warn', 'oid_limit_high', 'oid_limit_warn', //'oid_limit_nominal', 'oid_limit_delta_warn', 'oid_limit_delta', 'oid_limit_scale', 'oid_extra', //'oid_unit', 'oid_entPhysicalIndex' ]; $processors_array = discover_fetch_oids($device, $mib, $entry, $table_oids); // $processors_array = snmpwalk_cache_oid($device, $entry['table'], [], $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX); // if ($entry['table_descr']) { // // If descr in separate table with same indexes // $processors_array = snmpwalk_cache_oid($device, $entry['table_descr'], $processors_array, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX); // } if (empty($entry['oid_num'])) { // Use snmptranslate if oid_num not set $entry['oid_num'] = snmp_translate($entry['oid'], $mib); } $i = 1; // Used in descr as $i++ $processors_count = count($processors_array); foreach ($processors_array as $index => $processor) { $dot_index = '.' . $index; $oid_num = $entry['oid_num'] . $dot_index; // Rewrite specific keys $replace_array = [ 'index' => $index, // Index in descr 'i' => $i, // i++ counter in descr ]; $descr = entity_descr_definition('processor', $entry, array_merge($replace_array, $processor), $processors_count); if (isset($entry['oid_count'])) { // See F5-PLATFORM-STATS-MIB if (str_contains($entry['oid_count'], '.')) { $oid = array_tag_replace($replace_array, $entry['oid_count']); // Get processors count if exist for MIB $processor_count = snmp_get_oid($device, $oid, $mib); } else { $processor_count = $processor[$entry['oid_count']]; } if (is_numeric($processor_count) && $processor_count > 1) { $descr .= ' x' . $processor_count; } } $idle = (isset($entry['idle']) && $entry['idle'] ? 1 : 0); $usage = snmp_fix_numeric($processor[$entry['oid']], $unit); if (is_numeric($usage)) { if (isset($entry['rename_rrd'])) { $old_rrd = 'processor-' . $entry['rename_rrd'] . '-' . $index; $new_rrd = 'processor-' . $entry_name . '-' . $entry['table'] . $dot_index; rename_rrd($device, $old_rrd, $new_rrd); unset($old_rrd, $new_rrd); } discover_processor($valid['processor'], $device, $oid_num, $entry['oid'] . $dot_index, $entry_name, $descr, $precision, $usage, NULL, NULL, $idle); $entry['found'] = TRUE; } $i++; } } else { // Static processor $index = 0; // FIXME. Need use same indexes style as in sensors // Fetch description from oid if specified $replace_array = ['index' => $index]; if (isset($entry['oid_descr'])) { $replace_array[$entry['oid_descr']] = snmp_get_oid($device, $entry['oid_descr'], $mib); } $descr = entity_descr_definition('processor', $entry, $replace_array); if (isset($entry['oid_count']) && $entry['oid_count']) { $oid = array_tag_replace($replace_array, $entry['oid_count']); // Get processors count if exist for MIB $processor_count = snmp_get_oid($device, $oid, $mib); if ($processor_count > 1) { $descr .= ' x' . $processor_count; } } if (empty($entry['oid_num'])) { // Use snmptranslate if oid_num not set $entry['oid_num'] = snmp_translate($entry['oid'], $mib); } // Idle $idle = (isset($entry['idle']) && $entry['idle'] ? 1 : 0); $usage = snmp_fix_numeric(snmp_get_oid($device, $entry['oid'], $mib), $unit); // If we have valid usage, discover the processor if (is_numeric($usage) && $usage != '4294967295') { // Rename RRD if requested if (isset($entry['rename_rrd'])) { $old_rrd = 'processor-' . $entry['rename_rrd']; $new_rrd = 'processor-' . $entry_name . '-' . $index; rename_rrd($device, $old_rrd, $new_rrd); unset($old_rrd, $new_rrd); } discover_processor($valid['processor'], $device, $entry['oid_num'], $index, $entry_name, $descr, $precision, $usage, NULL, NULL, $idle); $entry['found'] = TRUE; } } unset($processors_array, $processor, $dot_index, $descr, $i); // Clean up if (isset($entry['stop_if_found']) && $entry['stop_if_found'] && $entry['found']) { break; } // Stop loop if processor found } print_cli(PHP_EOL); // Close MIB entry line. } // Remove processors which weren't redetected here foreach (dbFetchRows('SELECT * FROM `processors` WHERE `device_id` = ?', [$device['device_id']]) as $test_processor) { $processor_index = $test_processor['processor_index']; $processor_type = $test_processor['processor_type']; $processor_descr = $test_processor['processor_descr']; print_debug($processor_index . " -> " . $processor_type); if (!$valid['processor'][$processor_type][$processor_index]) { $GLOBALS['module_stats'][$module]['deleted']++; //echo('-'); dbDelete('processors', '`processor_id` = ?', [$test_processor['processor_id']]); log_event("Processor removed: type " . $processor_type . " index " . $processor_index . " descr " . $processor_descr, $device, 'processor', $test_processor['processor_id']); } unset($processor_oid); unset($processor_type); } $GLOBALS['module_stats'][$module]['status'] = safe_count($valid['processor']); if (OBS_DEBUG && $GLOBALS['module_stats'][$module]['status']) { print_vars($valid['processor']); } // EOF