experimental ASA ARP collector
This commit is contained in:
		
							
								
								
									
										75
									
								
								Netdisco/lib/App/Netdisco/SSHCollector/Platform/ASA.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								Netdisco/lib/App/Netdisco/SSHCollector/Platform/ASA.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
package App::Netdisco::SSHCollector::Platform::ASA;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
App::Netdisco::SSHCollector::Platform::ASA
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Collect ARP entries from Cisco ASA devices.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Dancer ':script';
 | 
			
		||||
use Expect;
 | 
			
		||||
use Moo;
 | 
			
		||||
 | 
			
		||||
=head1 PUBLIC METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item B<arpnip($host, $ssh)>
 | 
			
		||||
 | 
			
		||||
Retrieve ARP entries from device. C<$host> is the hostname or IP address
 | 
			
		||||
of the device. C<$ssh> is a Net::OpenSSH connection to the device.
 | 
			
		||||
 | 
			
		||||
Returns an array of hashrefs in the format { mac => MACADDR, ip => IPADDR }.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub arpnip {
 | 
			
		||||
    my ($self, $hostlabel, $ssh, @args) = @_;
 | 
			
		||||
 | 
			
		||||
    debug "$hostlabel $$ arpnip()";
 | 
			
		||||
 | 
			
		||||
    my ($pty, $pid) = $ssh->open2pty or die "unable to run remote command";
 | 
			
		||||
    my $expect = Expect->init($pty);
 | 
			
		||||
 | 
			
		||||
    my ($pos, $error, $match, $before, $after);
 | 
			
		||||
    my $prompt = qr/#/;
 | 
			
		||||
 | 
			
		||||
    ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
 | 
			
		||||
 | 
			
		||||
    $expect->send("terminal length 2147483647\n");
 | 
			
		||||
    ($pos, $error, $match, $before, $after) = $expect->expect(5, -re, $prompt);
 | 
			
		||||
 | 
			
		||||
    $expect->send("show arp\n");
 | 
			
		||||
    ($pos, $error, $match, $before, $after) = $expect->expect(60, -re, $prompt);
 | 
			
		||||
 | 
			
		||||
    my @arpentries = ();
 | 
			
		||||
    my @lines = split m/\n/, $before;
 | 
			
		||||
 | 
			
		||||
    # ifname 192.168.148.99 0022.1925.9305 347
 | 
			
		||||
    foreach my $line (@lines) {
 | 
			
		||||
        my @parts = split m/\n/, $line;
 | 
			
		||||
        my ($ip, $mac) = ($1, $2);
 | 
			
		||||
 | 
			
		||||
        if ($ip and $mac and
 | 
			
		||||
            $ip =~ m/(\d{1,3}\.){3}\d{1,3}/ and
 | 
			
		||||
            $mac =~ m/[0-9a-f.]+/i) {
 | 
			
		||||
 | 
			
		||||
            push @arpentries, { ip => $ip, mac => $mac };
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $expect->send("exit\n");
 | 
			
		||||
    $expect->soft_close();
 | 
			
		||||
 | 
			
		||||
    return @arpentries;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
		Reference in New Issue
	
	Block a user