$value) { $$metatype = $value; // Set metatype variable } // Cache hardware/version/serial info from ENTITY-MIB (if possible use inventory module data) if (isset($config['os'][$device['os']]['entPhysical']) && is_device_mib($device, 'ENTITY-MIB')) { $entPhysical_def = $config['os'][$device['os']]['entPhysical']; // Get entPhysical tables for some OS and OS groups if (is_module_enabled($device, 'inventory', 'discovery')) { $entPhysicalContainedIn = $entPhysical_def['containedin'] ?? '0'; $entPhysical = dbFetchRow('SELECT * FROM `entPhysical` WHERE `device_id` = ? AND `entPhysicalContainedIn` = ? AND `deleted` IS NULL', [$device['device_id'], $entPhysicalContainedIn]); if (isset($entPhysical_def['class']) && (empty($entPhysical) || $entPhysical['entPhysicalClass'] === 'stack')) { $entPhysical = dbFetchRow('SELECT * FROM `entPhysical` WHERE `device_id` = ? AND `entPhysicalClass` = ? AND `deleted` IS NULL ORDER BY `entPhysicalIndex` ASC', [$device['device_id'], $entPhysical_def['class']]); } } else { $oids = isset($entPhysical_def['oids']) ? (array)$entPhysical_def['oids'] : []; foreach ($entPhysical_def as $metatype => $def) { if (isset($def['oid']) && !isset($os_values[$metatype])) { $oids[] = $def['oid']; // Append extra oid(s) if (isset($def['oid_extra'])) { $oids[] = $def['oid_extra']; } } } $data = snmp_get_multi_oid($device, $oids, [], snmp_mib_entity_vendortype($device, 'ENTITY-MIB')); $entPhysical = array_shift($data); } print_debug_vars($entPhysical, 1); foreach ($os_metatypes as $metatype) { // skip undefined metatype or already found metatype if (!isset($entPhysical_def[$metatype]) || isset($os_values[$metatype])) { continue; } $entry = $entPhysical_def[$metatype]; [ $oid, $index ] = explode('.', $entry['oid'], 2); // skip empty oids if (!isset($entPhysical[$oid]) || safe_empty($entPhysical[$oid])) { continue; } $value = $entPhysical[$oid]; // Append extra value, ie lenovo-cnos if (isset($entry['oid_extra'])) { $oid_extra = explode('.', $entry['oid_extra'], 2)[0]; if ($entPhysical[$oid_extra] != $value && !safe_empty($entPhysical[$oid_extra])) { $value .= ' (' . $entPhysical[$oid_extra] . ')'; } } // Field found (no SNMP error), perform optional transformations. if (isset($entry['transform'])) { // Just simplify definition entry (unify with others) $entry['transformations'] = $entry['transform']; } if (isset($entry['transformations'])) { $value = string_transform($value, $entry['transformations']); } elseif ($oid === 'entPhysicalDescr') { $value = rewrite_entity_name($value); } // finally set os value if (is_valid_param($value, $metatype)) { $os_values[$metatype] = $value; $$metatype = $os_values[$metatype]; // Set metatype variable print_debug("Added OS param from ENTITY-MIB: '$metatype' = '" . $os_values[$metatype] . "'"); } } } // Find MIB-specific SNMP data via OID fetch: serial number, version number, hardware description, features, asset tag foreach (poll_device_mib_metatypes($device, $os_metatypes, $os_values) as $metatype => $value) { $$metatype = $value; // Set metatype variable } print_debug_vars($os_values, 1); // Include OS-specific poller code, if available if (is_file($config['install_dir'] . "/includes/polling/os/" . $device['os'] . ".inc.php")) { print_cli_data("OS Poller", 'OS', 2); // OS Specific include($config['install_dir'] . "/includes/polling/os/" . $device['os'] . ".inc.php"); } elseif ($device['os_group'] && is_file($config['install_dir'] . "/includes/polling/os/" . $device['os_group'] . ".inc.php")) { // OS Group-specific code as fallback, if OS-specific code does not exist print_cli_data("OS Poller", 'Group', 2); include($config['install_dir'] . "/includes/polling/os/" . $device['os_group'] . ".inc.php"); } else { print_cli_data("OS Poller", '%rGeneric%w', 2); } // Now recheck and set empty os params from os/group by regex/definitions values foreach ($os_values as $metatype => $value) { if (!isset($$metatype) || $$metatype == '' || str_istarts($$metatype, 'generic')) { print_debug("Re-added OS param from sysDescr parse or SNMP definition walk: '$metatype' = '$value'"); $$metatype = $value; } } // Set hardware by model definition if it's exist if (empty($hardware) && $hw = get_model_param($device, 'hardware', $poll_device['sysObjectID'])) { $hardware = $hw; } // Unified vendor name if ($vendor) { // Vendor fetched from sysDescr, Oid or os poller $vendor = rewrite_vendor($vendor); } elseif ($vn = get_model_param($device, 'vendor', $poll_device['sysObjectID'])) { // Model specific $vendor = rewrite_vendor($vn); } elseif (isset($config['os'][$device['os']]['vendor'])) { // Use os defined vendor name $vendor = rewrite_vendor($config['os'][$device['os']]['vendor']); } // If vendor and hardware not empty, remove excessive vendor part from beginning of hardware // I.e.: "Xerox Phaser 8560" -> "Phaser 8560" if ($vendor && $hardware && preg_match('/^' . preg_quote($vendor, '/') . '/i', $hardware)) { $hardware = preg_replace('/^' . preg_quote($vendor, '/') . '\s*/i', '', $hardware); } // Fields notified in event log $update_fields = ['version', 'features', 'hardware', 'vendor', 'serial', 'kernel', 'distro', 'distro_ver', 'arch', 'asset_tag']; // Log changed variables foreach ($update_fields as $field) { if (isset($$field)) { $$field = snmp_fix_string($$field); } // Fix unprintable chars if ((isset($$field) || strlen($device[$field])) && $$field != $device[$field]) { $update_array[$field] = $$field; //log_event(nicecase($field)." changed: '".$device[$field]."' -> '".$update_array[$field]."'", $device, 'device', $device['device_id']); } } // Here additional fields, change only if not set already $update_fields[] = 'type'; if (isset($attribs['override_type'])) { // already set by web device config $type = $device['type']; } elseif (isset($type, $config['devicetypes'][$type])) { if ($type != $device['type']) { $update_array['type'] = $type; } } elseif (isset($config['os'][$device['os']]['type'])) { $type = $config['os'][$device['os']]['type']; if ($config['os'][$device['os']]['type'] != $device['type']) { $update_array['type'] = $type; } } else { // default unknown $type = 'unknown'; if ($type != $device['type']) { $update_array['type'] = $type; } } $update_fields[] = 'icon'; if (isset($attribs['override_icon'])) { // already set by web device config $icon = $device['icon']; } elseif (isset($icon)) { if ($icon != $device['icon']) { $update_array['icon'] = $icon; } } elseif (isset($config['os'][$device['os']]['icon'])) { $icon = $config['os'][$device['os']]['icon']; if ($device['icon'] && $config['os'][$device['os']]['icon'] != $device['icon']) { $update_array['icon'] = $icon; } } else { // default empty $icon = ''; if ($icon != $device['icon']) { $update_array['icon'] = $icon; } } // Log changed variables foreach ($update_fields as $field) { if ($update_array[$field]) { log_event(nicecase($field) . " changed: '" . $device[$field] . "' -> '" . $update_array[$field] . "'", $device, 'device', $device['device_id']); } } // Extra metrics for @previous compare $alert_metrics['device_version'] = $version; $alert_metrics['device_distro_ver'] = $distro_ver; print_cli_data("Type", ($config['devicetypes'][$type]['text'] ?: "%b%n")); print_cli_data("Vendor", ($vendor ?: "%b%n")); print_cli_data("Hardware", ($hardware ?: "%b%n")); print_cli_data("Version", ($version ?: "%b%n")); print_cli_data("Features", ($features ?: "%b%n")); print_cli_data("Serial", ($serial ?: "%b%n")); print_cli_data("Asset", ($asset_tag ?: "%b%n")); // Remote access URLs are stored as a device attribute instead of a database field foreach (['ra_url_http'] as $ra_url) { if (isset($$ra_url)) { set_dev_attrib($device, $ra_url, $$ra_url); print_cli_data("Management URL", $ra_url_http); } elseif (isset($attribs[$ra_url])) { del_dev_attrib($device, $ra_url); } } /* foreach (array('type', 'icon') as $field) { if (!isset($$field) || isset($attribs['override_'.$field]) || $$field == $device[$field]) { continue; } if ($device[$field] == "unknown" || empty($device[$field]) || $field == 'icon') { $update_array[$field] = $$field; log_event(nicecase($field)." changed: '".$device[$field]."' -> '".$update_array[$field]."'", $device, 'device', $device['device_id']); } } */ echo(PHP_EOL); foreach ($os_additional_info as $header => $entries) { print_cli_heading($header, 3); foreach ($entries as $field => $entry) { print_cli_data($field, $entry, 3); } echo(PHP_EOL); } unset($entPhysical, $oids, $hw, $os_additional_info, $entry); // EOF