<?php /** * Ios.php - cpcat * * Cisco IOS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * @package LibreNMS * @link http://librenms.org * @copyright 2017 Tony Murray * @author Tony Murray */ namespace LibreNMS\OS; use LibreNMS\Device\WirelessSensor; use LibreNMS\Interfaces\Discovery\Sensors\WirelessClientsDiscovery; use LibreNMS\Interfaces\Discovery\Sensors\WirelessRssiDiscovery; use LibreNMS\OS\Shared\Cisco; class Ios extends Cisco implements WirelessClientsDiscovery, WirelessRssiDiscovery { // use CiscoCellular; /** * @return array Sensors */ public function discoverWirelessClients() { $device = $this->getDevice(); if (!starts_with($device['hardware'], 'AIR-') && !str_contains($device['hardware'], 'ciscoAIR')) { // unsupported IOS hardware return array(); } $data = snmpwalk_cache_oid($device, 'cDot11ActiveBridges', array(), 'CISCO-DOT11-ASSOCIATION-MIB'); $entPhys = snmpwalk_cache_oid($device, 'entPhysicalDescr', array(), 'ENTITY-MIB'); // fixup incorrect/missing entPhysicalIndex mapping foreach ($data as $index => $_unused) { foreach ($entPhys as $entIndex => $ent) { $descr = $ent['entPhysicalDescr']; unset($entPhys[$entIndex]); // only use each one once if (ends_with($descr, 'Radio')) { d_echo("Mapping entPhysicalIndex $entIndex to ifIndex $index\n"); $data[$index]['entPhysicalIndex'] = $entIndex; $data[$index]['entPhysicalDescr'] = $descr; break; } } } $sensors = array(); foreach ($data as $index => $entry) { $sensors[] = new WirelessSensor( 'clients', $device['device_id'], ".1.3.6.1.4.1.9.9.273.1.1.2.1.2.$index", 'ios', $index, $entry['entPhysicalDescr'], $entry['cDot11ActiveBridges'], 1, 1, 'sum', null, null, 0, null, null, $entry['entPhysicalIndex'], 'ports' ); } return $sensors; } public function discoverWirelessRssi() { function gen_descr ($index) { // $descr = "RSSI: "; $raw = explode(".", str_replace ("1.3.6.1.4.1.9.9.273.1.3.1.1.3.", "", $index)); for ($i=0; $i < $raw[1]; $i++) { // bridge name $descr = $descr . chr($raw[$i+2]); } $descr = $descr . " "; for ($i=6; $i > 0; $i--) { // MAC address of client $descr = $descr . ($raw[count($raw)-$i] > 15 ? "" : "0") . dechex($raw[count($raw)-$i]); } return $descr; } $device = $this->getDevice(); if (!starts_with($device['hardware'], 'AIR-') && !str_contains($device['hardware'], 'ciscoAIR')) { // unsupported IOS hardware return array(); } $sensors = array(); $data = snmpwalk_cache_multi_oid($this->getDevice(), 'cDot11ClientSignalStrength', array(), 'CISCO-DOT11-ASSOCIATION-MIB', null, '-OQUn'); foreach ($data as $index => $entry) { $sensors[] = new WirelessSensor( 'rssi', // $type $device['device_id'], // $device_id $index, // $oids 'ios', // $subtype $index, // $index gen_descr($index), // $description $entry['.1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.1'], // $current 1, // $multiplier 1, // $divisor 'avg', // $aggregator null, // $access_point_id -10, // $low_limit -80, // $high_warn -20, // $high_warn -70, // $low_warn ); } return $sensors; } }