Files
snmp-info/Info/Airespace.pm
2007-11-26 04:24:52 +00:00

1604 lines
41 KiB
Perl

# SNMP::Info::Airespace
# Eric Miller
# $Id$
#
# Copyright (c) 2005 Eric Miller
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Airespace;
$VERSION = '1.07';
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::Airespace::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Airespace::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
'AIRESPACE-WIRELESS-MIB' => 'bsnAPName',
'AIRESPACE-SWITCHING-MIB' => 'agentInventorySerialNumber',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
'airespace_type' => 'agentInventoryMachineType',
'airespace_model' => 'agentInventoryMachineModel',
'airespace_serial' => 'agentInventorySerialNumber',
'airespace_maint_ver' => 'agentInventoryMaintenanceLevel',
'airespace_mac' => 'agentInventoryBurnedInMacAddress',
'airespace_os' => 'agentInventoryOperatingSystem',
'airespace_vendor' => 'agentInventoryManufacturerName',
'airespace_prod_name' => 'agentInventoryProductName',
'os_ver' => 'agentInventoryProductVersion',
'airespace_bssid_mode' => 'agentNetworkBroadcastSsidMode',
'airespace_mc_mode' => 'agentNetworkMulticastMode',
'airespace_lwapp_mode' => 'agentSwitchLwappTransportMode',
'airespace_ul_mode' => 'agentTransferUploadMode',
'airespace_ul_ip' => 'agentTransferUploadServerIP',
'airespace_ul_path' => 'agentTransferUploadPath',
'airespace_ul_file' => 'agentTransferUploadFilename',
'airespace_ul_type' => 'agentTransferUploadDataType',
'airespace_ul_start' => 'agentTransferUploadStart',
'airespace_ul_status' => 'agentTransferUploadStatus',
);
%FUNCS = (
%SNMP::Info::FUNCS,
# AIRESPACE-WIRELESS-MIB::bsnDot11EssTable
'airespace_ess_idx' => 'bsnDot11EssIndex',
'airespace_ess_ssid' => 'bsnDot11EssSsid',
'airespace_ess_macflt' => 'bsnDot11EssMacFiltering',
'airespace_ess_status' => 'bsnDot11EssAdminStatus',
'airespace_ess_sec_auth' => 'bsnDot11EssSecurityAuthType',
'airespace_ess_radio_pol' => 'bsnDot11EssRadioPolicy',
'airespace_ess_qos' => 'bsnDot11EssQualityOfService',
'airespace_ess_ifname' => 'bsnDot11EssInterfaceName',
'airespace_ess_aclname' => 'bsnDot11EssAclName',
# AIRESPACE-WIRELESS-MIB::bsnAPTable
'airespace_ap_mac' => 'bsnAPDot3MacAddress',
'airespace_ap_name' => 'bsnAPName',
'airespace_ap_ip' => 'bsnApIpAddress',
'airespace_ap_loc' => 'bsnAPLocation',
'airespace_ap_sw' => 'bsnAPSoftwareVersion',
'airespace_ap_fw' => 'bsnAPBootVersion',
'airespace_ap_model' => 'bsnAPModel',
'airespace_ap_serial' => 'bsnAPSerialNumber',
'airespace_ap_type' => 'bsnAPType',
'airespace_ap_status' => 'bsnAPAdminStatus',
# AIRESPACE-WIRELESS-MIB::bsnAPIfTable
'airespace_apif_slot' => 'bsnAPIfSlotId',
'airespace_apif_type' => 'bsnAPIfType',
'airespace_apif_ch_num' => 'bsnAPIfPhyChannelNumber',
'airespace_apif_power' => 'bsnAPIfPhyTxPowerLevel',
'airespace_apif' => 'bsnAPIfOperStatus',
'airespace_apif_oride' => 'bsnAPIfWlanOverride',
'airespace_apif_admin' => 'bsnAPIfAdminStatus',
# AIRESPACE-WIRELESS-MIB::bsnMobileStationTable
'airespace_sta_mac' => 'bsnMobileStationAPMacAddr',
'fw_mac' => 'bsnMobileStationMacAddress',
'airespace_sta_slot' => 'bsnMobileStationAPIfSlotId',
'airespace_sta_ess_idx' => 'bsnMobileStationEssIndex',
'airespace_sta_ssid' => 'bsnMobileStationSsid',
'airespace_sta_delete' => 'bsnMobileStationDeleteAction',
# AIRESPACE-WIRELESS-MIB::bsnUsersTable
'airespace_user_name' => 'bsnUserName',
'airespace_user_pw' => 'bsnUserPassword',
'airespace_user_ess_idx' => 'bsnUserEssIndex',
'airespace_user_access' => 'bsnUserAccessMode',
'airespace_user_type' => 'bsnUserType',
'airespace_user_ifname' => 'bsnUserInterfaceName',
'airespace_user_rstat' => 'bsnUserRowStatus',
# AIRESPACE-WIRELESS-MIB::bsnBlackListClientTable
'airespace_bl_mac' => 'bsnBlackListClientMacAddress',
'airespace_bl_descr' => 'bsnBlackListClientDescription',
'airespace_bl_rstat' => 'bsnBlackListClientRowStatus',
# AIRESPACE-WIRELESS-MIB::bsnAPIfWlanOverrideTable
'airespace_oride_id' => 'bsnAPIfWlanOverrideId',
'airespace_oride_ssid' => 'bsnAPIfWlanOverrideSsid',
# AIRESPACE-SWITCHING-MIB::agentInterfaceConfigTable
'airespace_if_name' => 'agentInterfaceName',
'airespace_if_vlan' => 'agentInterfaceVlanId',
'airespace_if_type' => 'agentInterfaceType',
'airespace_if_mac' => 'agentInterfaceMacAddress',
'airespace_if_ip' => 'agentInterfaceIPAddress',
'airespace_if_mask' => 'agentInterfaceIPNetmask',
'airespace_if_acl' => 'agentInterfaceAclName',
'airespace_if_rstat' => 'agentInterfaceRowStatus',
# AIRESPACE-SWITCHING-MIB::agentPortConfigTable
'airespace_duplex_admin' => 'agentPortPhysicalMode',
'airespace_duplex' => 'agentPortPhysicalStatus',
);
%MUNGE = (
%SNMP::Info::MUNGE,
'airespace_ap_mac' => \&SNMP::Info::munge_mac,
'fw_port' => \&SNMP::Info::munge_mac,
'airespace_bl_mac' => \&SNMP::Info::munge_mac,
'airespace_if_mac' => \&SNMP::Info::munge_mac,
'airespace_sta_mac' => \&SNMP::Info::munge_mac,
);
sub layers {
return '00000011';
}
sub serial {
my $airespace = shift;
my $sn = $airespace->airespace_serial();
return undef unless defined $sn;
return $sn;
}
# Wirless switches do not support ifMIB requirements to get MAC
# and port status
sub i_index {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->orig_i_index($partial) || {};
my $ap_index = $airespace->airespace_apif_slot($partial) || {};
my $if_index = $airespace->airespace_if_name($partial) || {};
my %if_index;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
$if_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id (keys %$ap_index){
if ($ap_id =~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)\.(\d+)/) {
my $mac = join(':',map {sprintf("%02x",$_)} split(/\./,$1));
my $slot = $2;
next unless ( (defined $mac) and (defined $slot) );
$if_index{$ap_id} = "$mac.$slot";
}
}
# Get Switch Interfaces from Interface Config Table
foreach my $if_id (keys %$if_index){
my $name = $if_index->{$if_id};
next unless defined $name;
$if_index{$if_id} = $name;
}
return \%if_index;
}
sub interfaces {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my %if;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
$if{$iid} = "1.$index";
}
else {
$if{$iid} = $index;
}
}
return \%if;
}
sub i_name {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_name = $airespace->orig_i_name($partial) || {};
my $ap_name = $airespace->airespace_ap_name($partial) || {};
my %i_name;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_name{$iid} = $name;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $idx = $iid;
$idx =~ s/\.\d+$//;
my $name = $ap_name->{$idx};
next unless defined $name;
$i_name{$iid} = $name;
}
else {
$i_name{$iid} = $index;
}
}
return \%i_name;
}
sub i_description {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_descr = $airespace->orig_i_description($partial) || {};
my $ap_loc = $airespace->airespace_ap_loc($partial) || {};
my %descr;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $descr = $i_descr->{$iid};
next unless defined $descr;
$descr{$iid} = $descr;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $idx = $iid;
$idx =~ s/\.\d+$//;
my $name = $ap_loc->{$idx};
next unless defined $name;
$descr{$iid} = $name;
}
else {
$descr{$iid} = $index;
}
}
return \%descr;
}
sub i_type {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_descr = $airespace->orig_i_type($partial) || {};
my $apif_type = $airespace->airespace_apif_type($partial) || {};
my $if_type = $airespace->airespace_if_type($partial) || {};
my %i_type;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $descr = $i_descr->{$iid};
next unless defined $descr;
$i_type{$iid} = $descr;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $type = $apif_type->{$iid};
next unless defined $type;
$i_type{$iid} = $type;
}
else {
my $type = $if_type->{$iid};
$i_type{$iid} = $type;
}
}
return \%i_type;
}
sub i_up {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_up = $airespace->orig_i_up($partial) || {};
my $apif_up = $airespace->airespace_apif($partial) || {};
my %i_up;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $stat = $i_up->{$iid};
next unless defined $stat;
$i_up{$iid} = $stat;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $stat = $apif_up->{$iid};
next unless defined $stat;
$i_up{$iid} = $stat;
}
else {
next;
}
}
return \%i_up;
}
sub i_up_admin {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_up = $airespace->orig_i_up($partial) || {};
my $apif_up = $airespace->airespace_apif_admin($partial) || {};
my %i_up_admin;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $stat = $i_up->{$iid};
next unless defined $stat;
$i_up_admin{$iid} = $stat;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $stat = $apif_up->{$iid};
next unless defined $stat;
$i_up_admin{$iid} = $stat;
}
else {
next;
}
}
return \%i_up_admin;
}
sub i_mac {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $i_mac = $airespace->orig_i_mac($partial) || {};
my $if_mac = $airespace->airespace_if_mac($partial) || {};
my %i_mac;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $mac = $i_mac->{$iid};
next unless defined $mac;
$i_mac{$iid} = $mac;
}
# Don't grab AP MACs - we want the AP to show up on edge switch
# ports
# Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00
else {
my $mac = $if_mac->{$iid};
next unless defined $mac;
next if $mac =~ /00:00:00:00:00:00/;
$i_mac{$iid} = $mac;
}
}
return \%i_mac;
}
sub i_vlan {
my $airespace = shift;
my $partial = shift;
my $if_vlan = $airespace->airespace_if_vlan($partial) || {};
my %i_vlan;
foreach my $iid (keys %$if_vlan){
my $vlan = $if_vlan->{$iid};
next unless defined $vlan;
$i_vlan{$iid} = $vlan;
}
return \%i_vlan;
}
sub i_duplex {
my $airespace = shift;
my $partial = shift;
my $ap_duplex = $airespace->airespace_duplex($partial) || {};
my %i_duplex;
foreach my $if (keys %$ap_duplex){
my $duplex = $ap_duplex->{$if};
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex{$if}=$duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $airespace = shift;
my $partial = shift;
my $ap_duplex_admin = $airespace->airespace_duplex_admin($partial) || {};
my %i_duplex_admin;
foreach my $if (keys %$ap_duplex_admin){
my $duplex = $ap_duplex_admin->{$if};
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex_admin{$if}=$duplex;
}
return \%i_duplex_admin;
}
sub ip_index {
my $airespace = shift;
my $partial = shift;
my $ip_index = $airespace->orig_ip_index($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my %ip_index;
foreach my $ip (keys %$ip_index){
my $iid = $ip_index->{$ip};
next unless defined $iid;
$ip_index{$ip} = $iid;
}
foreach my $iid (keys %$if_ip){
my $ip = $if_ip->{$iid};
next unless defined $ip;
next if (defined $partial and $partial !~ /$ip/);
$ip_index{$ip} = $iid;
}
return \%ip_index;
}
sub ip_netmask {
my $airespace = shift;
my $partial = shift;
my $ip_mask = $airespace->orig_ip_netmask($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my $if_mask = $airespace->airespace_if_mask() || {};
my %ip_netmask;
foreach my $ip (keys %$ip_mask){
my $mask = $ip_mask->{$ip};
next unless defined $mask;
$ip_netmask{$ip} = $mask;
}
foreach my $iid (keys %$if_mask){
my $ip = $if_ip->{$iid};
next unless defined $ip;
next if (defined $partial and $partial !~ /$ip/);
my $mask = $if_mask->{$iid};
next unless defined $mask;
$ip_netmask{$ip} = $mask;
}
return \%ip_netmask;
}
# Wireless switches do not support the standard Bridge MIB
sub bp_index {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my %bp_index;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
$bp_index{$index} = $iid;
}
return \%bp_index;
}
sub fw_port {
my $airespace = shift;
my $partial = shift;
my $sta_mac = $airespace->airespace_sta_mac($partial) || {};
my $sta_slot = $airespace->airespace_sta_slot($partial) || {};
my %fw_port;
foreach my $iid (keys %$sta_mac){
my $mac = $sta_mac->{$iid};
next unless defined $mac;
my $slot = $sta_slot->{$iid};
next unless defined $slot;
$fw_port{$iid} = "$mac.$slot";
}
return \%fw_port;
}
sub i_ssidlist {
my $airespace = shift;
my $partial = shift;
my $apif_override = $airespace->airespace_apif_oride($partial) || {};
my $apif_type = $airespace->airespace_apif_type($partial) || {};
my $ssids = $airespace->airespace_ess_ssid() || {};
my $ssid_policy = $airespace->airespace_ess_radio_pol() || {};
my $ssid_status = $airespace->airespace_ess_status() || {};
my $ovride_ssids = $airespace->airespace_oride_ssid($partial) || {};
my %i_ssidlist;
foreach my $iid (keys %$apif_override){
my $override = $apif_override->{$iid};
next unless defined $override;
next unless $override =~ /disable/i ;
my $ap_type = $apif_type->{$iid};
next unless defined $ap_type;
$ap_type =~ s/dot11//;
foreach my $idx (keys %$ssids){
my $ssid = $ssids->{$idx};
next unless defined $ssid;
my $status = $ssid_status->{$idx};
next unless defined $status;
next if ( $status =~ /disable/ );
my $policy = $ssid_policy->{$idx};
next unless $policy =~ /$ap_type/ or $policy =~ /all/;
$i_ssidlist{"$iid.$idx"} = $ssid;
}
next;
}
foreach my $iid (keys %$ovride_ssids){
my $ssid = $ovride_ssids->{$iid};
next unless $ssid;
$i_ssidlist{$iid} = $ssid;
}
return \%i_ssidlist;
}
sub i_ssidbcast {
my $airespace = shift;
my $partial = shift;
my $ssidlist = $airespace->i_ssidlist($partial) || {};
my $bc_mode = $airespace->airespace_bssid_mode() || 'enable';
my %bcmap = qw/enable 1 disable 0/;
my $broadcast = $bcmap{$bc_mode};
my %i_ssidbcast;
foreach my $iid (keys %$ssidlist){
$i_ssidbcast{$iid} = $broadcast;
}
return \%i_ssidbcast;
}
sub i_80211channel {
my $airespace = shift;
my $partial = shift;
my $ch_list = $airespace->airespace_apif_ch_num($partial) || {};
my %i_80211channel;
foreach my $iid (keys %$ch_list){
my $ch = $ch_list->{$iid};
$ch =~ s/ch//;
$i_80211channel{$iid} = $ch;
}
return \%i_80211channel;
}
# Psuedo ENTITY-MIB methods
sub e_index {
my $airespace = shift;
my $ap_model = $airespace->airespace_ap_model() || {};
my %e_index;
# Chassis
$e_index{1} = 1;
# We're going to hack an index to capture APs
foreach my $idx (keys %$ap_model){
# Create the integer index by joining the last three octets of the MAC.
# Hopefully, this will be unique since the manufacturer should be
# limited to Airespace and Cisco. We can't use the entire MAC since
# we would exceed the intger size limit.
if ($idx =~ /(\d+\.\d+\.\d+)$/) {
my $index = int (join('',map { sprintf "%03d",$_ } split /\./, $1));
$e_index{$idx} = $index;
}
}
return \%e_index;
}
sub e_class {
my $airespace = shift;
my $e_idx = $airespace->e_index() || {};
my %e_class;
foreach my $iid (keys %$e_idx){
if ($iid eq 1) {
$e_class{$iid} = 'chassis';
}
# This isn't a valid PhysicalClass, but we're hacking this anyway
else {
$e_class{$iid} = 'ap';
}
}
return \%e_class;
}
sub e_name {
my $airespace = shift;
my $ap_name = $airespace->airespace_ap_name() || {};
my %e_name;
# Chassis
$e_name{1} = 'WLAN Controller';
# APs
foreach my $iid (keys %$ap_name){
$e_name{$iid} = 'AP';
}
return \%e_name;
}
sub e_descr {
my $airespace = shift;
my $ap_model = $airespace->airespace_ap_model() || {};
my $ap_name = $airespace->airespace_ap_name() || {};
my $ap_loc = $airespace->airespace_ap_loc() || {};
my %e_descr;
# Chassis
$e_descr{1} = $airespace->airespace_prod_name();
# APs
foreach my $iid (keys %$ap_name){
my $name = $ap_name->{$iid};
next unless defined $name;
my $model = $ap_model->{$iid} || 'AP';
my $loc = $ap_loc->{$iid} || 'unknown';
$e_descr{$iid} = "$model: $name ($loc)";
}
return \%e_descr;
}
sub e_model {
my $airespace = shift;
my $ap_model = $airespace->airespace_ap_model() || {};
my %e_model;
# Chassis
$e_model{1} = $airespace->airespace_model();
# APs
foreach my $iid (keys %$ap_model){
my $model = $ap_model->{$iid};
next unless defined $model;
$e_model{$iid} = $model;
}
return \%e_model;
}
sub e_type {
my $airespace = shift;
my $ap_type = $airespace->airespace_ap_type() || {};
my %e_type;
# Chassis
$e_type{1} = $airespace->airespace_type();
# APs
foreach my $iid (keys %$ap_type){
my $type = $ap_type->{$iid};
next unless defined $type;
$e_type{$iid} = $type;
}
return \%e_type;
}
sub e_fwver {
my $airespace = shift;
my $ap_fw = $airespace->airespace_ap_fw() || {};
my %e_fwver;
# Chassis
$e_fwver{1} = $airespace->airespace_maint_ver();
# APs
foreach my $iid (keys %$ap_fw){
my $fw = $ap_fw->{$iid};
next unless defined $fw;
$e_fwver{$iid} = $fw;
}
return \%e_fwver;
}
sub e_vendor {
my $airespace = shift;
my $e_idx = $airespace->e_index() || {};
my %e_vendor;
foreach my $iid (keys %$e_idx){
$e_vendor{$iid} = 'cisco';
}
return \%e_vendor;
}
sub e_serial {
my $airespace = shift;
my $ap_serial = $airespace->airespace_ap_serial() || {};
my %e_serial;
# Chassis
$e_serial{1} = $airespace->airespace_serial();
# APs
foreach my $iid (keys %$ap_serial){
my $serial = $ap_serial->{$iid};
next unless defined $serial;
$e_serial{$iid} = $serial;
}
return \%e_serial;
}
sub e_pos {
my $airespace = shift;
my $e_idx = $airespace->e_index() || {};
my %e_pos;
my $pos = 0;
foreach my $iid (sort keys %$e_idx){
if ($iid eq 1) {
$e_pos{$iid} = -1;
next;
}
else {
$pos++;
$e_pos{$iid} = $pos;
}
}
return \%e_pos;
}
sub e_swver {
my $airespace = shift;
my $ap_sw = $airespace->airespace_ap_sw() || {};
my %e_swver;
# Chassis
$e_swver{1} = $airespace->airespace_os();
# APs
foreach my $iid (keys %$ap_sw){
my $sw = $ap_sw->{$iid};
next unless defined $sw;
$e_swver{$iid} = $sw;
}
return \%e_swver;
}
sub e_parent {
my $airespace = shift;
my $e_idx = $airespace->e_index() || {};
my %e_parent;
foreach my $iid (sort keys %$e_idx){
if ($iid eq 1) {
$e_parent{$iid} = 0;
next;
}
else {
$e_parent{$iid} = 1;
}
}
return \%e_parent;
}
1;
__END__
=head1 NAME
SNMP::Info::Airespace - SNMP Interface to data from AIRESPACE-WIRELESS-MIB
and AIRESPACE-SWITCHING-MIB
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $airespace = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $airespace->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::Airespace is a subclass of SNMP::Info that provides an interface
to C<AIRESPACE-WIRELESS-MIB> and C<AIRESPACE-SWITCHING-MIB>. These MIBs are
used in Airespace wireless switches, as well as, products from Cisco, Nortel,
and Alcatel which are based upon the Airespace platform.
The Airespace platform utilizes intelligent wireless switches which control
thin access points. The thin access points themselves are unable to be polled
for end station information.
This class emulates bridge functionality for the wireless switch. This enables
end station MAC addresses collection and correlation to the thin access point
the end station is using for communication.
Use or create a subclass of SNMP::Info that inherits this one.
Do not use directly.
=head2 Inherited Classes
=over
None.
=back
=head2 Required MIBs
=over
=item AIRESPACE-WIRELESS-MIB
=item AIRESPACE-SWITCHING-MIB
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $airespace->airespace_type()
(B<agentInventoryMachineType>)
=item $airespace->airespace_model()
(B<agentInventoryMachineModel>)
=item $airespace->airespace_serial()
(B<agentInventorySerialNumber>)
=item $airespace->airespace_maint_ver()
(B<agentInventoryMaintenanceLevel>)
=item $airespace->airespace_mac()
(B<agentInventoryBurnedInMacAddress>)
=item $airespace->airespace_os()
(B<agentInventoryOperatingSystem>)
=item $airespace->airespace_vendor()
(B<agentInventoryManufacturerName>)
=item $airespace->airespace_prod_name()
(B<agentInventoryProductName>)
=item $airespace->os_ver()
(B<agentInventoryProductVersion>)
=item $airespace->airespace_bssid_mode()
(B<agentNetworkBroadcastSsidMode>)
=item $airespace->airespace_mc_mode()
(B<agentNetworkMulticastMode>)
=item $airespace->airespace_lwapp_mode()
The LWAPP transport mode decides if the switch is operating in the Layer2 or
Layer3 mode.
(B<agentSwitchLwappTransportMode>)
=item $airespace->airespace_ul_mode()
Transfer upload mode configures the mode to use when uploading from the switch.
Normal usage tftp.
(B<agentTransferUploadMode>)
=item $airespace->airespace_ul_ip()
Transfer upload tftpserverip configures the IP address of the server. It is
valid only when the Transfer Mode is tftp.
(B<agentTransferUploadServerIP>)
=item $airespace->airespace_ul_path()
Transfer upload tftppath configures the directory path where the file is to be
uploaded to. The switch remembers the last file path used.
(B<agentTransferUploadPath>)
=item $airespace->airespace_ul_file()
(B<agentTransferUploadFilename>)
=item $airespace->airespace_ul_type()
Transfer upload datatype configures the type of file to upload from the switch.
The types for upload are:
config(2)
errorlog(3)
systemtrace(4)
traplog(5)
crashfile(6)
(B<agentTransferUploadDataType>)
=item $airespace->airespace_ul_start()
(B<agentTransferUploadStart>)
=item $airespace->airespace_ul_status()
(B<agentTransferUploadStatus>)
=back
=head2 Overrides
=over
=item $airespace->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=item $airespace->serial()
(B<agentInventorySerialNumber>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $airespace->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
=item $airespace->i_ssidbcast()
Returns reference to hash. Indicates whether the SSID is broadcast.
=item $airespace->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
=back
=head2 Dot11 Ess Table (B<bsnDot11EssTable>)
Ess(WLAN) Configuration Table. Maximum of 17 WLANs can be created on
Airespace Switch. Index of 17 is reserved for WLAN for Third Party
APs(non-Airespace APs).
=over
=item $airespace->airespace_ess_idx()
(B<bsnDot11EssIndex>)
=item $airespace->airespace_ess_ssid()
SSID assigned to ESS(WLAN)
(B<bsnDot11EssSsid>)
=item $airespace->airespace_ess_macflt()
Select to filter clients by MAC address. By selecting this Security, you need
to create MacFilters in B<bsnUsersTable> or have MacFilters configured on
Radius Servers specified in B<bsnRadiusAuthenticationTable>
(B<bsnDot11EssMacFiltering>)
=item $airespace->airespace_ess_status()
Administrative Status of ESS(WLAN).
(B<bsnDot11EssAdminStatus>)
=item $airespace->airespace_ess_sec_auth()
Type of 802.11 Authentication.
(B<bsnDot11EssSecurityAuthType>)
=item $airespace->airespace_ess_radio_pol()
Radio Policy for a WLAN. It can either be All where it will be applicable
to ALL types of protocols or it can be set to apply to combinations of
802.11a, 802.11b, 802.11g.
(B<bsnDot11EssRadioPolicy>)
=item $airespace->airespace_ess_qos()
Quality of Service for a WLAN.
(B<bsnDot11EssQualityOfService>)
=item $airespace->airespace_ess_ifname()
Name of the interface used by this WLAN.
(B<bsnDot11EssInterfaceName>)
=item $airespace->airespace_ess_aclname()
Name of ACL for the WLAN. This is applicable only when Web Authentication is
enabled.
(B<bsnDot11EssAclName>)
=back
=head2 AP Table (B<bsnAPTable>)
Table of Airespace APs managed by this Airespace Switch.
=over
=item $airespace->airespace_ap_mac()
The MAC address of the 802.3 interface of the AP.
(B<bsnAPDot3MacAddress>)
=item $airespace->airespace_ap_name()
Name assigned to this AP. If an AP is not configured its factory default name
will be ap:<last three byte of MAC Address>. eg. ap:af:12:be
(B<bsnAPName>)
=item $airespace->airespace_ap_ip()
Ip address of the AP. This will not be available when the switch is operating
in the Layer2 mode. In this case, the attribute will return 0 as value.
(B<bsnApIpAddress>)
=item $airespace->airespace_ap_loc()
User specified location of this AP.
(B<bsnAPLocation>)
=item $airespace->airespace_ap_sw()
(B<bsnAPSoftwareVersion>)
=item $airespace->airespace_ap_fw()
(B<bsnAPBootVersion>)
=item $airespace->airespace_ap_model()
(B<bsnAPModel>)
=item $airespace->airespace_ap_serial()
(B<bsnAPSerialNumber>)
=item $airespace->airespace_ap_type()
(B<bsnAPType>)
=item $airespace->airespace_ap_status()
(B<bsnAPAdminStatus>)
=back
=head2 AP Interface Table (B<bsnAPIfTable>)
Table of 802.11 interfaces in an Airespace APs.
=over
=item $airespace->airespace_apif_slot()
The slotId of this interface. Value will be 0 for a 802.11a (5Ghz) interface
and will be 1 for 802.11b/g (2.4Ghz) interface.
(B<bsnAPIfSlotId>)
=item $airespace->airespace_apif_type()
(B<bsnAPIfType>)
=item $airespace->airespace_apif_ch_num()
(B<bsnAPIfPhyChannelNumber>)
=item $airespace->airespace_apif_power()
The TxPowerLevel N currently being used to transmit data.
(B<bsnAPIfPhyTxPowerLevel>)
=item $airespace->airespace_apif()
(B<bsnAPIfOperStatus>)
=item $airespace->airespace_apif_oride()
This flag when disabled implies that all WLANs are available from this radio.
However, if this is enabled, then only those WLANs that appear in the
(B<bsnApIfWlanOverrideTable>) will be available from this radio.
(B<bsnAPIfWlanOverride>)
=item $airespace->airespace_apif_admin()
(B<bsnAPIfAdminStatus>)
=back
=head2 Mobile Station Table (B<bsnMobileStationTable>)
=over
=item $airespace->airespace_sta_mac()
Mac Address of the AP on which Mobile Station is associated.
(B<bsnMobileStationAPMacAddr>)
=item $airespace->airespace_sta_slot()
SlotId of APIf on which mobile station is associated.
(B<bsnMobileStationAPIfSlotId>)
=item $airespace->airespace_sta_ess_idx()
Ess Index of the Wlan(SSID) that is being used by Mobile Station to connect
to the AP.
(B<bsnMobileStationEssIndex>)
=item $airespace->airespace_sta_ssid()
The SSID Advertised by the Mobile Station.
(B<bsnMobileStationSsid>)
=item $airespace->airespace_sta_delete()
Action to Deauthenticate the Mobile Station. Set the State to delete.
(B<bsnMobileStationDeleteAction>)
=back
=head2 Users Table (B<bsnUsersTable>)
The (conceptual) table listing Wlan Users.
=over
=item $airespace->airespace_user_name()
User name. For MAC filters, this will be the MAC address (eg. 000123456789).
(B<bsnUserName>)
=item $airespace->airespace_user_pw()
User Password. For MAC filters, this will be "nopassword".
(B<bsnUserPassword>)
=item $airespace->airespace_user_ess_idx()
User WLAN ID. Value 0 implies that this applies to any WLAN ID.
(B<bsnUserEssIndex>)
=item $airespace->airespace_user_access()
For MAC filters, this will be "readOnly".
(B<bsnUserAccessMode>)
=item $airespace->airespace_user_type()
User Access Mode. For MAC filters, this will be "macFilter".
(B<bsnUserType>)
=item $airespace->airespace_user_ifname()
ACL for MAC Filters. An interface name from B<agentInterfaceConfigTable>
(B<bsnUserInterfaceName>)
=item $airespace->airespace_user_rstat()
(B<bsnUserRowStatus>)
=back
=head2 Black List Client Table (B<bsnBlackListClientTable>)
The table listing Wlan Black Listed Clients
=over
=item $airespace->airespace_bl_mac()
(B<bsnBlackListClientMacAddress>)
=item $airespace->airespace_bl_descr()
(B<bsnBlackListClientDescription>)
=item $airespace->airespace_bl_rstat()
(B<bsnBlackListClientRowStatus>)
=back
=head2 AP Interface WLAN Override Table (B<bsnAPIfWlanOverrideTable>)
Each entry represents an SSID added to the AP when the attribute
B<bsnAPIfWlanOverride> on the radio is enabled. This means only those WLANs
on the switch that are added to this table will be available on such a radio.
=over
=item $airespace->airespace_oride_id()
Index of the WLAN (B<bsnDot11EssIndex>) added to the radio.
(B<bsnAPIfWlanOverrideId>)
=item $airespace->airespace_oride_ssid()
SSID assigned to the override WLAN.
(B<bsnAPIfWlanOverrideSsid>)
=back
=head2 Interface Config Table (B<agentInterfaceConfigTable>)
A table of the switch's Interface Config entries. Typically, it will contain
entries for Service Port Interface, DS Port Interface and Virtual Gateway
Interface apart from other entries.
=over
=item $airespace->airespace_if_name()
Interace Name. This values is 'management' for DS port, 'service-port' for
service port and 'virtual' for virtual gateway. For other interfaces, the
name can be anything. These interfaces are already created by default.
(B<agentInterfaceName>)
=item $airespace->airespace_if_vlan()
VLAN Id configured for the Interface.
(B<agentInterfaceVlanId>)
=item $airespace->airespace_if_type()
The interface's type. The static type is set for the interfaces that are
created by default on the switch and these cannot be deleted. Any other
interface that is created is of type dynamic which can be deleted.
(B<agentInterfaceType>)
=item $airespace->airespace_if_mac()
Interface MAC Address. This is only applicable in case of management and
service-port interfaces.
(B<agentInterfaceMacAddress>)
=item $airespace->airespace_if_ip()
(B<agentInterfaceIPAddress>)
=item $airespace->airespace_if_mask()
(B<agentInterfaceIPNetmask>)
=item $airespace->airespace_if_acl()
Name of the Access Control List applied to the interface. This attribute is
applicable only to the management interface and other dynamic interfaces.
If it is required to remove the ACL name for an interface, it should be set
to an empty string.
(B<agentInterfaceAclName>)
=item $airespace->airespace_if_rstat()
(B<agentInterfaceRowStatus>)
=back
=head2 Port Config Table (B<agentPortConfigTable>)
=over
=item $airespace->airespace_duplex_admin()
(B<agentPortPhysicalMode>)
=item $airespace->airespace_duplex()
(B<agentPortPhysicalStatus>)
=back
=head2 Overrides
=over
=item $airespace->i_index()
Returns reference to map of IIDs to Interface index.
Extends ifIndex to support thin APs and WLAN virtual interfaces as device
interfaces.
=item $airespace->interfaces()
Returns reference to map of IIDs to ports. Thin APs are implemented as device
interfaces. The thin AP MAC address airespace_ap_mac() and Slot ID
airespace_apif_slot() are used as the port identifier. Virtual interfaces
use airespace_if_name() as the port identifier.
=item $airespace->i_name()
Returns reference to map of IIDs to interface names. Returns B<ifName> for
Ethernet interfaces, airespace_ap_name() for thin AP interfaces, and
airespace_if_name() for virtual interfaces.
=item $airespace->i_description()
Returns reference to map of IIDs to interface types. Returns B<ifDescr>
for Ethernet interfaces, airespace_ap_loc() for thin AP interfaces, and
airespace_if_name() for virtual interfaces.
=item $airespace->i_type()
Returns reference to map of IIDs to interface descriptions. Returns
B<ifType> for Ethernet interfaces, airespace_apif_type() for thin AP
interfaces, and airespace_if_type() for virtual interfaces.
=item $airespace->i_up()
Returns reference to map of IIDs to link status of the interface. Returns
B<ifOperStatus> for Ethernet interfaces and airespace_apif() for thin AP
interfaces.
=item $airespace->i_up_admin()
Returns reference to map of IIDs to administrative status of the interface.
Returns B<ifAdminStatus> for Ethernet interfaces and airespace_apif_admin()
for thin AP interfaces.
=item $airespace->i_mac()
Returns reference to map of IIDs to MAC address of the interface. Returns
B<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual
interfaces.
=item $airespace->i_vlan()
Returns reference to map of IIDs to VLAN ID of the interface. Returns
airespace_if_vlan() for virtual interfaces.
=item $airespace->i_duplex()
Returns reference to map of IIDs to current link duplex. Ethernet interfaces
only.
=item $airespace->i_duplex_admin()
Returns reference to hash of IIDs to admin duplex setting. Ethernet interfaces
only.
=item $airespace->ip_index()
Extends table by mapping airespace_if_ip() to the interface IID.
=item $airespace->ip_netmask()
Extends IP table by mapping airespace_if_mask() to airespace_if_ip()
=item $airespace->bp_index()
Simulates bridge MIB by returning reference to a hash mapping i_index() to
the interface iid.
=item $airespace->fw_port()
Returns reference to a hash, value being airespace_sta_mac() and
airespace_sta_slot() combined to match the interface iid.
=item $airespace->fw_mac()
(B<bsnMobileStationMacAddress>)
=back
=head2 Psuedo ENTITY-MIB information
These methods emulate ENTITY-MIB Physical Table methods using
AIRESPACE-SWITCHING-MIB and AIRESPACE-WIRELESS-MIB. Thin APs are included
as subcomponents of the wireless controller.
=over
=item $airespace->e_index()
Returns reference to hash. Key: IID and Value: Integer. The index for APs is
created with an integer representation of the last three octets of the
AP MAC address.
=item $airespace->e_class()
Returns reference to hash. Key: IID, Value: General hardware type. Return ap
for wireless access points.
=item $airespace->e_descr()
Returns reference to hash. Key: IID, Value: Human friendly name.
=item $airespace->e_model()
Returns reference to hash. Key: IID, Value: Model name.
=item $airespace->e_vendor()
Returns reference to hash. Key: IID, Value: cisco.
=item $airespace->e_serial()
Returns reference to hash. Key: IID, Value: Serial number.
=item $airespace->e_pos()
Returns reference to hash. Key: IID, Value: The relative position among all
entities sharing the same parent.
=item $airespace->e_type()
Returns reference to hash. Key: IID, Value: Type of component.
=item $airespace->e_fwver()
Returns reference to hash. Key: IID, Value: Firmware revision.
=item $airespace->e_swver()
Returns reference to hash. Key: IID, Value: Software revision.
=item $airespace->e_parent()
Returns reference to hash. Key: IID, Value: The value of e_index() for the
entity which 'contains' this entity.
=cut