Files
snmp-info/Info/CiscoConfig.pm
Bill Fenner d460c5a473 Some of the links were broken since some pages used
TABLE ENTRIES and others used TABLE METHODS.  Since
README says TABLE METHODS, let's standardize on that.
2006-11-18 00:23:26 +00:00

447 lines
14 KiB
Perl

# SNMP::Info::CiscoConfig
# Justin Hunter, Eric Miller
# $Id$
#
# 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::CiscoConfig;
$VERSION = 1.05;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoConfig::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%MIBS = (
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
'CISCO-FLASH-MIB' => 'ciscoFlashCopyTable',
'OLD-CISCO-SYS-MIB' => 'writeMem',
);
%GLOBALS = (
# OLD-CISCO-SYS-MIB
'old_write_mem' => 'writeMem',
'old_write_net' => 'writeNet',
);
%FUNCS = (
# CISCO-COPY-CONFIG-MIB::ccCopyTable
'config_protocol' => 'ccCopyProtocol',
'config_source_type' => 'ccCopySourceFileType',
'config_dest_type' => 'ccCopyDestFileType',
'config_server_addr' => 'ccCopyServerAddress',
'config_filename' => 'ccCopyFileName',
'config_username' => 'ccCopyUserName',
'config_password' => 'ccCopyUserPassword',
'config_notify_complete' => 'ccCopyNotificationOnCompletion',
'config_copy_state' => 'ccCopyState',
'config_copy_start_time' => 'ccCopyTimeStarted',
'config_copy_complete_time' => 'ccCopyTimeCompleted',
'config_fail_cause' => 'ccCopyFailCause',
'config_row_status' => 'ccCopyEntryRowStatus',
# CISCO-FLASH-MIB::ciscoFlashCopyTable
'flash_copy_cmd' => 'ciscoFlashCopyCommand',
'flash_copy_protocol' => 'ciscoFlashCopyProtocol',
'flash_copy_address' => 'ciscoFlashCopyServerAddress',
'flash_copy_source' => 'ciscoFlashCopySourceName',
'flash_copy_dest' => 'ciscoFlashCopyDestinationName',
'flash_copy_row_status' => 'ciscoFlashCopyEntryStatus',
);
%MUNGE = (
);
sub copy_run_tftp {
my $ciscoconfig = shift;
my ( $tftphost, $tftpfile ) = @_;
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
print "Saving running config to $tftphost as $tftpfile\n" if $ciscoconfig->debug();
#Try new method first fall back to old method
if ( $ciscoconfig->set_config_protocol( 1, $rand ) ) {
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
#Check each set, delete created row if any fail
unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
$ciscoconfig->error_throw("Setting source type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Setting source type failed and failed to delete row $rand");
}
return undef;
}
unless ( $ciscoconfig->set_config_dest_type( 1, $rand ) ) {
$ciscoconfig->error_throw("Setting destination type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Setting dest type failed and failed to delete row $rand");
}
return undef;
}
unless ( $ciscoconfig->set_config_server_addr( $tftphost, $rand ) ) {
$ciscoconfig->error_throw("Setting tftp server failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Setting tftp server failed and failed to delete row $rand");
}
return undef;
}
unless ( $ciscoconfig->set_config_filename( $tftpfile, $rand ) ) {
$ciscoconfig->error_throw("Setting file name failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Setting file name failed and failed to delete row $rand");
}
return undef;
}
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
$ciscoconfig->error_throw("Initiating transfer failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Initiating transfer failed and failed to delete row $rand");
}
return undef;
}
my $status = 0;
my $timer = 0;
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
# option later if needed
my $timeout = 300;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
$timer += 1;
if ($timer >= $timeout) {
$status = 'failed';
last;
}
sleep 1;
}
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
}
if ( $status eq 'successful' ) {
print "Save operation successful\n" if $ciscoconfig->debug();
return 1;
}
if ( $status eq 'failed' ) {
$ciscoconfig->error_throw("Save operation failed");
return undef;
}
}
print "Using old method\n" if $ciscoconfig->debug();
unless ( $ciscoconfig->set_old_write_net( $tftpfile, $tftphost ) ) {
$ciscoconfig->error_throw("Save operation failed");
return undef;
}
return 1;
}
sub copy_run_start {
my $ciscoconfig = shift;
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
print "Saving running config to memory\n" if $ciscoconfig->debug();
if ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
#Check each set, delete created row if any fail
unless ( $ciscoconfig->set_config_dest_type( 3, $rand ) ) {
$ciscoconfig->error_throw("Setting dest type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Setting dest type failed and failed to delete row $rand");
}
return undef;
}
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
$ciscoconfig->error_throw("Initiating save failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw("Initiating save failed and failed to delete row $rand");
}
return undef;
}
my $status = 0;
my $timer = 0;
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
# option later if needed
my $timeout = 300;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
$timer += 1;
if ($timer >= $timeout) {
$status = 'failed';
last;
}
sleep 1;
}
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
}
if ( $status eq 'successful' ) {
print "Save operation successful\n" if $ciscoconfig->debug();
return 1;
}
if ( $status eq 'failed' ) {
$ciscoconfig->error_throw("Save operation failed");
return undef;
}
}
print "Using old method\n" if $ciscoconfig->debug();
unless ( $ciscoconfig->set_old_write_mem( 1 ) ) {
$ciscoconfig->error_throw("Save operation failed");
return undef;
}
return 1;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
=head1 AUTHOR
Justin Hunter, Eric Miller
=head1 SYNOPSIS
my $ciscoconfig = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ciscoconfig->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::CiscoConfig is a subclass of SNMP::Info that provides an interface
to C<CISCO-CONFIG-COPY-MIB>, C<CISCO-FLASH-MIB>, and C<OLD-CISCO-SYS-MIB>.
These MIBs facilitate the writing of configuration files.
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 CISCO-CONFIG-COPY-MIB
=item CISCO-FLASH-MIB
=item OLD-CISCO-SYS-MIB
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $ciscoconfig->old_write_mem()
(B<writeMem>)
=item $ciscoconfig->old_write_net()
(B<writeNet>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=back
=head2 Config Copy Request Table (B<ccCopyTable>)
=over
=item $ciscoconfig->config_protocol()
(B<ccCopyProtocol>)
=item $ciscoconfig->config_source_type()
(B<ccCopySourceFileType>)
=item $ciscoconfig->config_dest_type()
(B<ccCopyDestFileType>)
=item $ciscoconfig->config_server_addr()
(B<ccCopyServerAddress>)
=item $ciscoconfig->config_filename()
(B<ccCopyFileName>)
=item $ciscoconfig->config_username()
(B<ccCopyUserName>)
=item $ciscoconfig->config_password()
(B<ccCopyUserPassword>)
=item $ciscoconfig->config_notify_complete()
(B<ccCopyNotificationOnCompletion>)
=item $ciscoconfig->config_copy_state()
(B<ccCopyState>)
=item $ciscoconfig->config_copy_start_time()
(B<ccCopyTimeStarted>)
=item $ciscoconfig->config_copy_complete_time()
(B<ccCopyTimeCompleted>)
=item $ciscoconfig->config_fail_cause()
(B<ccCopyFailCause>)
=item $ciscoconfig->config_row_status()
(B<ccCopyEntryRowStatus>)
=back
=head2 Flash Copy Table (B<ciscoFlashCopyTable>)
Table of Flash copy operation entries.
=over
=item $ciscoconfig->flash_copy_cmd()
(B<ciscoFlashCopyCommand>)
=item $ciscoconfig->flash_copy_protocol()
(B<ciscoFlashCopyProtocol>)
=item $ciscoconfig->flash_copy_address()
(B<ciscoFlashCopyServerAddress>)
=item $ciscoconfig->flash_copy_source()
(B<ciscoFlashCopySourceName>)
=item $ciscoconfig->flash_copy_dest()
(B<ciscoFlashCopyDestinationName>)
=item $ciscoconfig->flash_copy_row_status()
(B<ciscoFlashCopyEntryStatus>)
=back
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods or
provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set operations.
=over
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
Store the running configuration on a TFTP server. Equivalent to the CLI
commands "copy running-config tftp" or "write net".
This method attempts to use newer "copy running-config tftp" procedure first
and then the older "write net" procedure if that fails. The newer procedure is
supported Cisco devices with the CISCO-CONFIG-COPY-MIB available, Cisco IOS
software release 12.0 or on some devices as early as release 11.2P. The
older procedure has been depreciated by Cisco and is utilized only to support
devices running older code revisions.
Example:
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
or die Couldn't save config. ",$ciscoconfig->error(1);
=item $ciscoconfig->copy_run_start()
Copy the running configuration to the startup configuration. Equivalent to
the CLI command "copy running-config startup-config" or "write mem".
This method attempts to use newer "copy running-config startup-config"
procedure first and then the older "write mem" procedure if that fails. The
newer procedure is supported Cisco devices with the CISCO-CONFIG-COPY-MIB
available, Cisco IOS software release 12.0 or on some devices as early as
release 11.2P. The older procedure has been depreciated by Cisco and is
utilized only to support devices running older code revisions.
Example:
$ciscoconfig->copy_run_start()
or die "Couldn't save config. ",$ciscoconfig->error(1);
=cut