558 lines
14 KiB
Perl
558 lines
14 KiB
Perl
# SNMP::Info::CiscoStats
|
|
# $Id$
|
|
#
|
|
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
|
|
# All rights reserved.
|
|
#
|
|
# Copyright (c) 2003 Regents of the University of California
|
|
# All rights reserved.
|
|
#
|
|
# 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::CiscoStats;
|
|
|
|
use strict;
|
|
use Exporter;
|
|
use SNMP::Info;
|
|
|
|
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
|
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
|
|
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
|
|
|
$VERSION = '3.50';
|
|
|
|
%MIBS = (
|
|
'SNMPv2-MIB' => 'sysDescr',
|
|
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
|
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
|
|
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
|
|
'CISCO-PRODUCTS-MIB' => 'sysName',
|
|
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
|
|
'CISCO-IMAGE-MIB' => 'ciscoImageString',
|
|
|
|
# some older catalysts live here
|
|
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
|
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
|
|
'CISCO-FLASH-MIB' => 'ciscoFlashDeviceSize',
|
|
);
|
|
|
|
%GLOBALS = (
|
|
'description' => 'sysDescr',
|
|
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
|
|
|
# We will use the numeric OID's so that we don't require people
|
|
# to install v1 MIBs, which can conflict.
|
|
# OLD-CISCO-CPU-MIB:avgBusyPer
|
|
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
|
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
|
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
|
|
|
# CISCO-PROCESS-MIB
|
|
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
|
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
|
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
|
|
|
# OLD-CISCO-SYSTEM-MIB
|
|
'write_mem' => 'writeMem',
|
|
'rom_id' => 'romId',
|
|
);
|
|
|
|
%FUNCS = (
|
|
|
|
# CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
|
|
'cisco_mem_free' => 'ciscoMemoryPoolFree',
|
|
'cisco_mem_used' => 'ciscoMemoryPoolUsed',
|
|
|
|
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
|
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
|
|
|
# CISCO-IMAGE-MIB
|
|
'ci_images' => 'ciscoImageString',
|
|
);
|
|
|
|
%MUNGE = ();
|
|
|
|
sub vendor {
|
|
return 'cisco';
|
|
}
|
|
|
|
sub os {
|
|
my $l2 = shift;
|
|
my $descr = $l2->description() || '';
|
|
|
|
# order here matters - there are Catalysts that run IOS and have catalyst
|
|
# in their description field, as well as Catalysts that run IOS-XE.
|
|
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
|
return 'ios-xr' if ( $descr =~ /IOS XR/ );
|
|
return 'ios' if ( $descr =~ /IOS/ );
|
|
return 'catalyst' if ( $descr =~ /catalyst/i );
|
|
return 'css' if ( $descr =~ /Content Switch SW/ );
|
|
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
|
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
|
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
|
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
|
|
|
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
|
# Only the admin context implements the entity MIB
|
|
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
|
return 'ace-context';
|
|
}
|
|
|
|
# Pre-version 3 FWSMs
|
|
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
|
|
|
# Version 3+ FWSMs (currently untested against version 4)
|
|
if ( $descr =~ /Firewall Services Module/ ) {
|
|
|
|
my $model = $l2->model();
|
|
|
|
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
|
# Only the admin context implements the entity MIB
|
|
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
|
return 'fwsm-context';
|
|
}
|
|
|
|
# Non context mode FWSM
|
|
return 'fwsm';
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
sub os_ver {
|
|
my $l2 = shift;
|
|
my $os = $l2->os();
|
|
my $descr = $l2->description();
|
|
|
|
# Older Catalysts
|
|
if ( defined $os
|
|
and $os eq 'catalyst'
|
|
and defined $descr
|
|
and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os eq 'css'
|
|
and defined $descr
|
|
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os eq 'css-sca'
|
|
and defined $descr
|
|
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os eq 'pix'
|
|
and defined $descr
|
|
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os eq 'asa'
|
|
and defined $descr
|
|
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os =~ /^ace/ )
|
|
{
|
|
return $l2->ent_physical_software_rev();
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os =~ /^fwsm/
|
|
and defined $descr
|
|
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
if ( defined $os
|
|
and $os eq 'ios-xr'
|
|
and defined $descr
|
|
and $descr =~ m/Version (\d+[\.\d]+)/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
# Newer Catalysts and IOS devices
|
|
if ( defined $descr
|
|
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
|
{
|
|
return $1;
|
|
}
|
|
|
|
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
|
my $image_info = $l2->ciscoImageString() || {};
|
|
foreach my $row (keys %$image_info) {
|
|
my $info_string = $image_info->{$row};
|
|
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
|
return $1;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
sub os_bin {
|
|
my $self = shift;
|
|
my $rom_id = $self->rom_id();
|
|
if ($rom_id =~ m/Version ([^,]+),/) {
|
|
return $1;
|
|
}
|
|
return;
|
|
}
|
|
|
|
sub cpu {
|
|
my $self = shift;
|
|
my $ios_cpu = $self->ios_cpu();
|
|
return $ios_cpu if defined $ios_cpu;
|
|
my $cat_cpu = $self->cat_cpu();
|
|
return $cat_cpu;
|
|
}
|
|
|
|
sub cpu_1min {
|
|
my $self = shift;
|
|
my $ios_cpu_1min = $self->ios_cpu_1min();
|
|
return $ios_cpu_1min if defined $ios_cpu_1min;
|
|
my $cat_cpu_1min = $self->cat_cpu_1min();
|
|
return $cat_cpu_1min;
|
|
}
|
|
|
|
sub cpu_5min {
|
|
my $self = shift;
|
|
my $ios_cpu_5min = $self->ios_cpu_5min();
|
|
return $ios_cpu_5min if defined $ios_cpu_5min;
|
|
my $cat_cpu_5min = $self->cat_cpu_5min();
|
|
return $cat_cpu_5min;
|
|
}
|
|
|
|
sub mem_free {
|
|
my $self = shift;
|
|
|
|
my $mem_free;
|
|
|
|
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
|
|
|
foreach my $mem_free_val ( values %$cisco_mem_free ) {
|
|
$mem_free += $mem_free_val;
|
|
}
|
|
|
|
return $mem_free;
|
|
}
|
|
|
|
sub mem_used {
|
|
my $self = shift;
|
|
|
|
my $mem_used;
|
|
|
|
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
|
|
|
foreach my $mem_used_val ( values %$cisco_mem_used ) {
|
|
$mem_used += $mem_used_val;
|
|
}
|
|
|
|
return $mem_used;
|
|
}
|
|
|
|
sub mem_total {
|
|
my $self = shift;
|
|
|
|
my $mem_total;
|
|
|
|
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
|
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
|
|
|
foreach my $mem_entry ( keys %$cisco_mem_free ) {
|
|
my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
|
|
my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
|
|
$mem_total += ( $mem_free + $mem_used );
|
|
}
|
|
return $mem_total;
|
|
}
|
|
|
|
sub flashmem_total {
|
|
my $self = shift;
|
|
|
|
my $flashmem_total;
|
|
|
|
my $flash_sizes = $self->cisco_flash_size;
|
|
|
|
foreach my $flash_index ( keys %$flash_sizes ) {
|
|
$flashmem_total += $flash_sizes->{$flash_index};
|
|
}
|
|
|
|
return $flashmem_total;
|
|
}
|
|
|
|
1;
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
|
|
Devices
|
|
|
|
=head1 AUTHOR
|
|
|
|
Eric Miller, Max Baker, Sam Stickland
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# Let SNMP::Info determine the correct subclass for you.
|
|
my $ciscostats = new SNMP::Info(
|
|
AutoSpecify => 1,
|
|
Debug => 1,
|
|
# These arguments are passed directly on to SNMP::Session
|
|
DestHost => 'myswitch',
|
|
Community => 'public',
|
|
Version => 2
|
|
)
|
|
or die "Can't connect to DestHost.\n";
|
|
|
|
my $class = $ciscostats->class();
|
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
|
|
os and version information about Cisco Devices.
|
|
|
|
Use or create in a subclass of SNMP::Info. Do not use directly.
|
|
|
|
=head2 Inherited Classes
|
|
|
|
None.
|
|
|
|
=head2 Required MIBs
|
|
|
|
=over
|
|
|
|
=item F<CISCO-PRODUCTS-MIB>
|
|
|
|
=item F<CISCO-PROCESS-MIB>
|
|
|
|
=item F<CISCO-MEMORY-POOL-MIB>
|
|
|
|
=item F<SNMPv2-MIB>
|
|
|
|
=item F<OLD-CISCO-SYSTEM-MIB>
|
|
|
|
=item F<CISCO-STACK-MIB>
|
|
|
|
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
|
|
|
=item F<CISCO-FLASH-MIB>
|
|
|
|
=item F<ENTITY-MIB>
|
|
|
|
=item F<CISCO-IMAGE-MIB>
|
|
|
|
=back
|
|
|
|
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
|
|
|
=head1 GLOBALS
|
|
|
|
=over
|
|
|
|
=item $ciscostats->cpu()
|
|
|
|
Returns ios_cpu() or cat_cpu(), whichever is available.
|
|
|
|
=item $ciscostats->cpu_1min()
|
|
|
|
Returns ios_cpu_1min() or cat_cpu1min(), whichever is available.
|
|
|
|
=item $ciscostats->cpu_5min()
|
|
|
|
Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
|
|
|
=item $ciscostats->mem_total()
|
|
|
|
Returns mem_free() + mem_used()
|
|
|
|
=item $ciscostats->vendor()
|
|
|
|
'cisco'
|
|
|
|
=item $ciscostats->os()
|
|
|
|
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
|
|
from description()
|
|
|
|
Available values:
|
|
|
|
'ios' for Cisco IOS
|
|
'ios-xe' for Cisco IOS XE
|
|
'ios-xr' for Cisco IOS XR
|
|
'pix' for Cisco PIX
|
|
'asa' for Cisco ASA
|
|
'fwsm' for Single-mode FWSM
|
|
'fwsm-admin' for Admin context of multi-context FWSM
|
|
'fwsm-context' for Standard context of multi-context FWSM
|
|
'ace-admin' for Admin context of ACE module
|
|
'ace-context' for Standard context of ACE module (NB: No OS version
|
|
detection is available, but will be the same as it's
|
|
'ace admin')
|
|
'css' for Cisco Content Switch
|
|
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
|
'san-os' for Cisco SAN-OS
|
|
|
|
=item $ciscostats->os_ver()
|
|
|
|
Tries to parse device operating system version from description(), falls back
|
|
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
|
|
|
|
=item $ciscostats->os_bin()
|
|
|
|
Tries to parse C<ROMMON> version from rom_id() string
|
|
|
|
=item $ciscostats->ios_cpu()
|
|
|
|
Current CPU usage in percent.
|
|
|
|
C<1.3.6.1.4.1.9.2.1.56.0> =
|
|
C<OLD-CISCO-CPU-MIB:avgBusyPer>
|
|
|
|
=item $ciscostats->ios_cpu_1min()
|
|
|
|
Average CPU Usage in percent over the last minute.
|
|
|
|
C<1.3.6.1.4.1.9.2.1.57.0>
|
|
|
|
=item $ciscostats->ios_cpu_5min()
|
|
|
|
Average CPU Usage in percent over the last 5 minutes.
|
|
|
|
C<1.3.6.1.4.1.9.2.1.58.0>
|
|
|
|
=item $ciscostats->cat_cpu()
|
|
|
|
Current CPU usage in percent.
|
|
|
|
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
|
|
|
=item $ciscostats->cat_cpu_1min()
|
|
|
|
Average CPU Usage in percent over the last minute.
|
|
|
|
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
|
|
|
=item $ciscostats->cat_cpu_5min()
|
|
|
|
Average CPU Usage in percent over the last 5 minutes.
|
|
|
|
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
|
|
|
=item $ciscostats->mem_free()
|
|
|
|
Main DRAM free of the device in bytes.
|
|
|
|
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
|
|
|
|
=item $ciscostats->mem_used()
|
|
|
|
Main DRAM used of the device in bytes.
|
|
|
|
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
|
|
|
=item $ciscostats->mem_total()
|
|
|
|
Main DRAM of the device in bytes.
|
|
|
|
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
|
|
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
|
|
|
=item $ciscostats->flashmem_total()
|
|
|
|
Flash memory of the device in bytes.
|
|
|
|
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
|
|
|
|
=back
|
|
|
|
=head1 TABLE METHODS
|
|
|
|
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
|
|
|
|
=over
|
|
|
|
=item $ciscostats->cisco_mem_free()
|
|
|
|
The number of bytes from the memory pool that are currently unused on the
|
|
managed device.
|
|
|
|
(C<ciscoMemoryPoolFree>)
|
|
|
|
=item $ciscostats->cisco_mem_used()
|
|
|
|
The number of bytes from the memory pool that are currently in use by
|
|
applications on the managed device.
|
|
|
|
(C<ciscoMemoryPoolUsed>)
|
|
|
|
=back
|
|
|
|
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
|
|
|
|
=over
|
|
|
|
=item $ciscostats->cisco_flash_size()
|
|
|
|
Total size of the Flash device. For a removable device, the size will be
|
|
zero if the device has been removed.
|
|
|
|
(C<ciscoFlashDeviceSize>)
|
|
|
|
=back
|
|
|
|
=head2 Cisco Image Table (C<ciscoImageTable>)
|
|
|
|
=over
|
|
|
|
=item $ci->ci_images()
|
|
|
|
Returns the table of image strings.
|
|
|
|
C<ciscoImageString>
|
|
|
|
=back
|
|
|
|
=cut
|