- Support for "write mem" and "write net" for older IOS versions

- Added appropriate debugging output and throw errors as expected
- Timeout value to prevent an infinite loop while waiting for the device to report success or failure.
This commit is contained in:
Eric Miller
2006-11-01 21:37:29 +00:00
parent df9a335052
commit d46b124674

View File

@@ -1,5 +1,5 @@
# SNMP::Info::CiscoConfig
# Justin Hunter
# Justin Hunter, Eric Miller
# $Id$
#
# Redistribution and use in source and binary forms, with or without
@@ -84,23 +84,86 @@ sub copy_run_tftp {
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
$ciscoconfig->set_config_protocol( 1, $rand );
$ciscoconfig->set_config_source_type( 4, $rand );
$ciscoconfig->set_config_dest_type( 1, $rand );
$ciscoconfig->set_config_server_addr( $tftphost, $rand );
$ciscoconfig->set_config_filename( $tftpfile, $rand );
$ciscoconfig->set_config_row_status( 1, $rand );
my $status = 0;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
sleep 1;
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;
}
}
$ciscoconfig->set_config_row_status( 6, $rand );
return 0 if $status eq 'failed';
return 1 if $status eq 'successful';
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 {
@@ -109,20 +172,64 @@ sub copy_run_start {
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
my $t = $ciscoconfig->set_config_source_type( 4, $rand );
$ciscoconfig->set_config_dest_type( 3, $rand );
$ciscoconfig->set_config_row_status( 1, $rand );
my $status = 0;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
sleep 1;
}
$ciscoconfig->set_config_row_status( 6, $rand );
print "Saving running config to memory\n" if $ciscoconfig->debug();
return 0 if $status eq 'failed';
return 1 if $status eq 'successful';
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;
@@ -135,7 +242,7 @@ SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
=head1 AUTHOR
Justin Hunter
Justin Hunter, Eric Miller
=head1 SYNOPSIS
@@ -307,11 +414,14 @@ L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set operations.
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
Store the running configuration on a TFTP server. Equivalent to the CLI
command "copy running-config tftp".
commands "copy running-config tftp" or "write net".
This method currently only supports Cisco devices with the
CISCO-CONFIG-COPY-MIB available with Cisco IOS software release 12.0, or on
some devices as early as release 11.2P.
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')
@@ -320,11 +430,14 @@ some devices as early as release 11.2P.
=item $ciscoconfig->copy_run_start()
Copy the running configuration to the startup configuration. Equivalent to
the CLI command "copy running-config startup-config".
the CLI command "copy running-config startup-config" or "write mem".
This method currently only supports Cisco devices with the
CISCO-CONFIG-COPY-MIB available with Cisco IOS software release 12.0, or on
some devices as early as release 11.2P.
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()