TABLE ENTRIES and others used TABLE METHODS. Since README says TABLE METHODS, let's standardize on that.
		
			
				
	
	
		
			447 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			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
 |