|
From: Max K. <be...@us...> - 2016-02-15 23:00:44
|
Hi
Patch below adds Check Point VSX support to sshcollector
Please review and apply if it's ok.
From 84d9c89e599c9cdea7371a627268e8b988c7f196 Mon Sep 17 00:00:00 2001
From: Max Kosmach <be...@us...>
Date: Tue, 16 Feb 2016 00:55:22 +0300
Subject: Add Check Point VSX support
---
.../App/Netdisco/SSHCollector/Platform/CPVSX.pm | 142 +++++++++++++++++++++
1 file changed, 142 insertions(+)
create mode 100644 Netdisco/lib/App/Netdisco/SSHCollector/Platform/CPVSX.pm
diff --git a/Netdisco/lib/App/Netdisco/SSHCollector/Platform/CPVSX.pm b/Netdisco/lib/App/Netdisco/SSHCollector/Platform/CPVSX.pm
new file mode 100644
index 0000000..983beff
--- /dev/null
+++ b/Netdisco/lib/App/Netdisco/SSHCollector/Platform/CPVSX.pm
@@ -0,0 +1,142 @@
+package App::Netdisco::SSHCollector::Platform::CPVSX;
+
+=head1 NAME
+
+App::Netdisco::SSHCollector::Platform::CPVSX
+
+=head1 DESCRIPTION
+
+Collect ARP entries from Check Point VSX
+
+This collector uses "C<arp>" as the command for the arp utility on your
+system. Clish "C<show arp>" dows not work correctly in versions prior to R77.30.
+Config example:
+
+ sshcollector:
+ - ip: '192.0.2.1'
+ user: oliver
+ password: letmein
+ expert_password: letmein2
+ platform: CPVSX
+
+=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 a list of hashrefs in the format C<< { mac => MACADDR, ip => IPADDR } >>.
+
+=back
+
+=cut
+
+sub arpnip {
+ my ($self, $hostlabel, $ssh, $args) = @_;
+
+ my @arpentries = ();
+
+ 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;
+
+ $prompt = qr/>/;
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ # TODO: check CP os/version via "cpstat os" and VSX status via "show vsx"
+# $expect->send("show vsx\n");
+# ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+# debug "$hostlabel $$ show vsx: $before";
+
+ # Enumerate virtual systems
+ # Virtual systems list
+ # VS ID VS NAME
+ # 0 0
+ # 1 BACKUP-VSX_xxxxxx_Context
+ # ...
+
+ $expect->send("show virtual-system all\n");
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ my @vsxentries = ();
+ my @lines = split(m/\n/, $before);
+
+ my $linereg = qr/(\d+)\s+([A-Za-z0-9_-]+)/;
+ foreach my $line (@lines) {
+ if ($line =~ $linereg) {
+ my ($vsid, $vsname) = ($1, $2);
+ push @vsxentries, { vsid => $vsid, vsname=> $vsname };
+ debug "$hostlabel $$ $vsid, $vsname";
+ }
+ }
+
+ # TODO:
+ # Expert mode should be used only for pre-R77.30 versions
+ # For R77.30 and later we can use:
+ # set virtual-system $vsid
+ # show arp dynamic all
+
+ $expect->send("expert\n");
+
+ $prompt = qr/Enter expert password:/;
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ $expect->send( $args->{expert_password} ."\n" );
+
+ $prompt = qr/#/;
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ foreach (@vsxentries) {
+ my $vsid = $_->{vsid};
+ debug "$hostlabel $$ arpnip VSID: $vsid";
+
+ $expect->send("vsenv $vsid\n");
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ $expect->send("arp -n | tail -n +2\n");
+ ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
+
+ @lines = split(m/\n/, $before);
+
+ # 192.168.1.1 ether 00:b6:aa:f5:bb:6e C eth1
+ $linereg = qr/([0-9\.]+)\s+ether\s+([a-fA-F0-9:]+)/;
+
+ foreach my $line (@lines) {
+ if ($line =~ $linereg) {
+ my ($ip, $mac) = ($1, $2);
+ push @arpentries, { mac => $mac, ip => $ip };
+ debug "$hostlabel $$ arpnip VSID: $vsid IP: $ip MAC: $mac";
+ }
+ }
+
+ }
+
+ $expect->send("exit\n");
+
+ $prompt = qr/>/;
+ ($pos, $error, $match, $before, $after) = $expect->expect(5, -re, $prompt);
+
+ $expect->send("exit\n");
+
+ $expect->soft_close();
+
+ return @arpentries;
+}
+
+1;
--
2.7.0
|