. * * @package LibreNMS * @link http://librenms.org * @copyright 2018 Tony Murray * @author Tony Murray * @copyright 2018 Jose Augusto Cardoso */ namespace LibreNMS\OS\Shared; use App\Models\PortsNac; use LibreNMS\Device\Processor; use LibreNMS\Interfaces\Discovery\ProcessorDiscovery; use LibreNMS\Interfaces\Polling\NacPolling; use LibreNMS\OS; use LibreNMS\Util\IP; class Cisco extends OS implements ProcessorDiscovery, NacPolling { /** * Discover processors. * Returns an array of LibreNMS\Device\Processor objects that have been discovered * * @return array Processors */ public function discoverProcessors() { $processors_data = snmpwalk_group($this->getDevice(), 'cpmCPU', 'CISCO-PROCESS-MIB'); $processors = array(); foreach ($processors_data as $index => $entry) { if (is_numeric($entry['cpmCPUTotal5minRev'])) { $usage_oid = '.1.3.6.1.4.1.9.9.109.1.1.1.1.8.'.$index; $usage = $entry['cpmCPUTotal5minRev']; } elseif (is_numeric($entry['cpmCPUTotal5min'])) { $usage_oid = '.1.3.6.1.4.1.9.9.109.1.1.1.1.5.'.$index; $usage = $entry['cpmCPUTotal5min']; } else { continue; // skip bad data } $entPhysicalIndex = $entry['cpmCPUTotalPhysicalIndex']; if ($entPhysicalIndex) { if ($this->isCached('entPhysicalName')) { $entPhysicalName_array = $this->getCacheByIndex('entPhysicalName', 'ENTITY-MIB'); $descr = $entPhysicalName_array[$entPhysicalIndex]; } if (empty($descr)) { $descr = snmp_get($this->getDevice(), 'entPhysicalName.'.$entPhysicalIndex, '-Oqv', 'ENTITY-MIB'); } } if (empty($descr)) { $descr = "Processor $index"; } if (is_array($entry['cpmCore5min'])) { // This CPU has data per individual core foreach ($entry['cpmCore5min'] as $core_index => $core_usage) { $processors[] = Processor::discover( 'cpm', $this->getDeviceId(), ".1.3.6.1.4.1.9.9.109.1.1.2.1.5.$index.$core_index", "$index.$core_index", "$descr: Core $core_index", 1, $core_usage, null, $entPhysicalIndex ); } } else { $processors[] = Processor::discover( 'cpm', $this->getDeviceId(), $usage_oid, $index, $descr, 1, $usage, null, $entPhysicalIndex ); } } if (empty($processors)) { // fallback to old pre-12.0 OID $processors[] = Processor::discover( 'ios', $this->getDeviceId(), '.1.3.6.1.4.1.9.2.1.58.0', // OLD-CISCO-CPU-MIB::avgBusy5 0 ); } return $processors; } public function pollNac() { $nac = collect(); $portAuthSessionEntry = snmpwalk_cache_oid($this->getDevice(), 'cafSessionEntry', [], 'CISCO-AUTH-FRAMEWORK-MIB'); if (!empty($portAuthSessionEntry)) { $cafSessionMethodsInfoEntry = collect(snmpwalk_cache_oid($this->getDevice(), 'cafSessionMethodsInfoEntry', [], 'CISCO-AUTH-FRAMEWORK-MIB'))->mapWithKeys(function ($item, $key) { $key_parts = explode('.', $key); $key = implode('.', array_slice($key_parts, 0, 2)); // remove the auth method return [$key => ['method' => $key_parts[2], 'authc_status' => $item['cafSessionMethodState']]]; }); // cache port ifIndex -> port_id map $ifIndex_map = $this->getDeviceModel()->ports()->pluck('port_id', 'ifIndex'); // update the DB foreach ($portAuthSessionEntry as $index => $portAuthSessionEntryParameters) { list($ifIndex, $auth_id) = explode('.', str_replace("'", '', $index)); $session_info = $cafSessionMethodsInfoEntry->get($ifIndex . '.' . $auth_id); $mac_address = strtolower(implode(array_map('zeropad', explode(':', $portAuthSessionEntryParameters['cafSessionClientMacAddress'])))); $nac->put($mac_address, new PortsNac([ 'port_id' => $ifIndex_map->get($ifIndex, 0), 'mac_address' => $mac_address, 'auth_id' => $auth_id, 'domain' => $portAuthSessionEntryParameters['cafSessionDomain'], 'username' => $portAuthSessionEntryParameters['cafSessionAuthUserName'], 'ip_address' => (string)IP::fromHexString($portAuthSessionEntryParameters['cafSessionClientAddress'], true), 'host_mode' => $portAuthSessionEntryParameters['cafSessionAuthHostMode'], 'authz_status' => $portAuthSessionEntryParameters['cafSessionStatus'], 'authz_by' => $portAuthSessionEntryParameters['cafSessionAuthorizedBy'], 'timeout' => $portAuthSessionEntryParameters['cafSessionTimeout'], 'time_left' => $portAuthSessionEntryParameters['cafSessionTimeLeft'], 'vlan' => $portAuthSessionEntryParameters['cafSessionAuthVlan'], 'authc_status' => $session_info['authc_status'], 'method' => $session_info['method'], ])); } } return $nac; } }