- <?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 <http>.
- *
- * @package LibreNMS
- * @link http://librenms.org
- * @copyright 2017 Tony Murray
- * @author Tony Murray <murraytony>
- */
- 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;
- }
- }