The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

netdisco-sshcollector - Collect ARP data for Netdisco from devices without full SNMP support

SYNOPSIS

 # install dependencies:
 ~netdisco/bin/localenv cpanm --notest Net::OpenSSH Expect
 
 # run manually, or add to cron:
 ~/bin/netdisco-sshcollector [-DQ]

DESCRIPTION

Collects ARP data for Netdisco from devices without full SNMP support. Currently, ARP tables can be retrieved from the following device classes:

The collected arp entries are then directly stored in the netdisco database.

CONFIGURATION

The following should go into your Netdisco 2 configuration file, "~/environments/deployment.yml"

sshcollector

Data is collected from the machines specified in this setting. The format is a list of dictionaries. The keys ip, user, password, and platform are required. Optionally the hostname key can be used instead of the ip. For example:

 sshcollector:
   - ip: '192.0.2.1'
     user: oliver
     password: letmein
     platform: IOS
   - hostname: 'core-router.example.com'
     user: oliver
     password: letmein
     platform: IOS

Platform is the final part of the classname to be instantiated to query the host, e.g. platform ACE will be queried using App::Netdisco::SSHCollector::Platform::ACE.

If the password is "-", public key authentication will be attempted.

ADDING DEVICES

Additional device classes can be easily integrated just by adding and additonal class to the App::Netdisco::SSHCollector::Platform namespace. This class must implement an arpnip($hostname, $ssh) method which returns an array of hashrefs in the format

 @result = ({ ip => IPADDR, mac => MACADDR }, ...) 

The parameter $ssh is an active Net::OpenSSH connection to the host. Depending on the target system, it can be queried using simple methods like

 my @data = $ssh->capture("show whatever")

or automated via Expect - this is mostly useful for non-Linux appliances which don't support command execution via ssh:

 my ($pty, $pid) = $ssh->open2pty or die "unable to run remote command";
 my $expect = Expect->init($pty);
 my $prompt = qr/#/;
 my ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt);
 $expect->send("terminal length 0\n");
 # etc...

The returned IP and MAC addresses should be in a format that the respective inetaddr and macaddr datatypes in PostgreSQL can handle.

DEBUG LEVELS

The flags "-DQ" can be specified, multiple times, and enable the following items in order:

-D

Netdisco debug log level

-Q

DBIx::Class trace enabled

DEPENDENCIES

App::Netdisco
Net::OpenSSH
Expect