* update changes and SNMP::Info dep * Integrate netdisco-sshcollector into Worker::Plugin architecture (#489) * Initial integration of sshcollector into Worker::Plugin architecture * add NodesBySSH.pm * update Build.PL and config.yml to integrate the new module * Further integration of sshcollector into Worker::Plugin architecture * added App::Netdisco::Transport::CLI loosely based on ::SNMP counterpart * switched to the more prevalent two-space tabs style * removed various TBD items, some new ones * Further steps to integration of sshcollector into Worker::Plugin architecture * cleaned up code * added various error handling * warning for bin/netdisco-sshcollector deprecation * device_auth allows passing master_opts to Net::OpenSSH * netdisco-do -D also toggles Net::OpenSSH debug * Merged NodesBySSH.pm into Nodes.pm * see https://github.com/netdisco/netdisco/pull/489#pullrequestreview-205603516 * Further integration of sshcollector into Worker::Plugin architecture * add snmp_arpnip_also option to sshcollector device_auth * cleanup code * Remove big TBD: comment from CLI.pm as doc is updated now * add transport/cli.pm to manifest * revert some changes to allow simpler merging * silent exit legacy script unless explicitly requested * move ssh code into Transport, part one * rewrite the CLI transport to provide an API * merge in og-get_external_credentials Squashed commit of the following: commit3fe8f383a7Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 17:07:42 2019 +0000 add debug lines and tested commit3249739e42Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 16:54:11 2019 +0000 change config name to get_credentials commite78558397aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 16:51:11 2019 +0000 separate out generic device auth to DeviceAuth module commit249f05165fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Mar 6 18:43:31 2019 +0000 release 2.040007 commite3af64df77Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Mar 6 18:42:47 2019 +0000 #521-redux fix wifi date search commit48857ae300Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 12:03:31 2019 +0000 release 2.040006 commite09dab5362Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 11:39:12 2019 +0000 #527 update List::MoreUtils version requirement commit6e7de3fff3Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 09:59:41 2019 +0000 release 2.040005 commit0c98318a45Author: Oliver Gorwits <oliver@spike.local> Date: Mon Mar 4 09:57:18 2019 +0000 #526 fix discover syntax bug commite9efc45182Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:56:48 2019 +0000 release 2.040004 commit6cdfd80d10Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:34:00 2019 +0000 allow undiscovered neighbors report to use discover_{waps,phones} setting commitac381e0802Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:13:20 2019 +0000 #506 was a red herring commitb83e614c85Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 13:00:36 2019 +0000 make discover_{phones,waps} work with LLDP capabilities as well commit189d234b55Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:47:38 2019 +0000 check discover_no_type and friends earlier on in neighbors list build commit9c956466f3Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:32:07 2019 +0000 also update default config for new discover_phones and discover_waps settings commit09d29954d2Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:26:50 2019 +0000 #512 fix regression in phone/wap discovery exclusion commit2bae91f1b6Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:01:34 2019 +0000 rename match_devicetype() to match_to_setting() commit57cb6ddb70Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 09:19:39 2019 +0000 fix for over-eager fix to #506 commitef560fb59aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 22:41:40 2019 +0000 #506 relax device renumber so it works for an alias commit7a8bcb094eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 22:23:39 2019 +0000 #521 Search Node Date Range not working commita643820a62Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 21:54:27 2019 +0000 #428 Port-Channels not showing in netmap commit5ba5bcd295Merge:e7aacddba1f95028Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 20:04:11 2019 +0000 Merge branch 'master' of github.com:netdisco/netdisco commite7aacddbc6Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 20:01:05 2019 +0000 #498 Map with VLAN filter omits unconnected devices commita1f95028caAuthor: nick n <39005454+inphobia@users.noreply.github.com> Date: Sat Mar 2 19:54:22 2019 +0100 catch up with changes noticed that rc-sshcollector-core received updates to changes, add them here as well. didn't mention #499 & #522 commitce1b847ceaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 18:47:44 2019 +0000 fix bug showing no nodes when only one matches in netmap commit78e30a7926Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 16:28:15 2019 +0000 #500 filtering in device/ports on native vlan duplicates entries commit9952f0c6c7Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 15:02:12 2019 +0000 #499 netdisco-do renumber reports wrong ip (inphobia) commitca3fd8f466Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 15:00:18 2019 +0000 #505 device renumber should update device port properties and device skips commit1265bc8470Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:52:21 2019 +0000 #520 catch slave ports defined without a master commitd4c7579c10Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:47:49 2019 +0000 #522 TypeAhead.pm can reference empty data (inphobia) commit77decc23b7Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:45:37 2019 +0000 #514 inconsistent results in ip inventory (inphobia) commit3f211650b8Author: nick n <39005454+inphobia@users.noreply.github.com> Date: Fri Mar 1 12:34:42 2019 +0100 last pieces for db schema upgrade last piece of #510 * import legacy sshcollector config * add default use_legacy_sshcollector config * remove unneeded deps * various fixes and now tested * enable sshcollector platform tests
116 lines
2.5 KiB
Perl
116 lines
2.5 KiB
Perl
package App::Netdisco::Transport::CLI;
|
|
|
|
use Dancer qw/:syntax :script/;
|
|
|
|
use App::Netdisco::Util::Device 'get_device';
|
|
use Module::Load ();
|
|
use Net::OpenSSH;
|
|
use Try::Tiny;
|
|
|
|
use base 'Dancer::Object::Singleton';
|
|
|
|
=head1 NAME
|
|
|
|
App::Netdisco::Transport::CLI
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Returns an object which has an active SSH connection which can be used
|
|
for some actions such as arpnip.
|
|
|
|
my $cli = App::Netdisco::Transport::CLI->session_for( ... );
|
|
|
|
=cut
|
|
|
|
__PACKAGE__->attributes(qw/ sessions /);
|
|
|
|
sub init {
|
|
my ( $class, $self ) = @_;
|
|
$self->sessions( {} );
|
|
return $self;
|
|
}
|
|
|
|
=head1 session_for( $ip )
|
|
|
|
Given an IP address, returns an object instance configured for and connected
|
|
to that device.
|
|
|
|
Returns C<undef> if the connection fails.
|
|
|
|
=cut
|
|
|
|
{
|
|
package MySession;
|
|
use Moo;
|
|
|
|
has 'ssh' => ( is => 'rw' );
|
|
has 'auth' => ( is => 'rw' );
|
|
has 'host' => ( is => 'rw' );
|
|
has 'platform' => ( is => 'rw' );
|
|
|
|
sub arpnip {
|
|
my $self = shift;
|
|
$self->platform->arpnip(@_, $self->host, $self->ssh, $self->auth);
|
|
}
|
|
}
|
|
|
|
sub session_for {
|
|
my ($class, $ip) = @_;
|
|
|
|
my $device = get_device($ip) or return undef;
|
|
my $sessions = $class->instance->sessions or return undef;
|
|
|
|
return $sessions->{$device->ip} if exists $sessions->{$device->ip};
|
|
debug sprintf 'cli session cache warm: [%s]', $device->ip;
|
|
|
|
my $auth = (setting('device_auth') || []);
|
|
if (1 != scalar @$auth) {
|
|
error sprintf " [%s] require only one matching auth stanza", $device->ip;
|
|
return undef;
|
|
}
|
|
$auth = $auth->[0];
|
|
|
|
my @master_opts = qw(-o BatchMode=no);
|
|
push(@master_opts, @{$auth->{ssh_master_opts}})
|
|
if $auth->{ssh_master_opts};
|
|
|
|
$Net::OpenSSH::debug = $ENV{SSH_TRACE};
|
|
my $ssh = Net::OpenSSH->new(
|
|
$device->ip,
|
|
user => $auth->{username},
|
|
password => $auth->{password},
|
|
timeout => 30,
|
|
async => 0,
|
|
default_stderr_file => '/dev/null',
|
|
master_opts => \@master_opts
|
|
);
|
|
|
|
if ($ssh->error) {
|
|
error sprintf " [%s] ssh connection error [%s]", $device->ip, $ssh->error;
|
|
return undef;
|
|
}
|
|
elsif (! $ssh) {
|
|
error sprintf " [%s] Net::OpenSSH instantiation error", $device->ip;
|
|
return undef;
|
|
}
|
|
|
|
my $platform = "App::Netdisco::SSHCollector::Platform::" . $auth->{platform};
|
|
my $happy = false;
|
|
try {
|
|
Module::Load::load $platform;
|
|
$happy = true;
|
|
} catch { error $_ };
|
|
return unless $happy;
|
|
|
|
my $sess = MySession->new(
|
|
ssh => $ssh,
|
|
auth => $auth,
|
|
host => $device->ip,
|
|
platform => $platform->new(),
|
|
);
|
|
|
|
return ($sessions->{$device->ip} = $sess);
|
|
}
|
|
|
|
true;
|