package Smokeping::probes::OpenSSHEOSPing; =head1 301 Moved Permanently This is a Smokeping probe module. Please use the command C to view the documentation or the command C to generate the POD document. =cut use strict; use base qw(Smokeping::probes::basefork); use Net::OpenSSH; use Carp; my $e = "="; sub pod_hash { return { name => < < < and L perl modules. DOC authors => <<'DOC', Bill Fenner Efenner@aristanetworks.comE based on L by Tobias Oetiker Etobi@oetiker.chE, which itself is based on L by S H A N Eshanali@yahoo.comE. DOC } } sub new($$$) { my $proto = shift; my $class = ref($proto) || $proto; my $self = $class->SUPER::new(@_); $self->{pingfactor} = 1000; # Gives us a good-guess default return $self; } sub ProbeDesc($){ my $self = shift; my $bytes = $self->{properties}{packetsize}; return "Arista EOS - ICMP Echo Pings ($bytes Bytes)"; } sub pingone ($$){ my $self = shift; my $target = shift; my $source = $target->{vars}{source}; my $dest = $target->{vars}{host}; my $psource = $target->{vars}{psource}; my @output = (); my $login = $target->{vars}{eosuser}; my $password = $target->{vars}{eospass}; my $bytes = $self->{properties}{packetsize}; my $pings = $self->pings($target); my $unpriv = $target->{vars}{unpriv} || 0; # do NOT call superclass ... the ping method MUST be overridden my %upd; my @args = (); my $ssh = Net::OpenSSH->new( $source, $login ? ( user => $login ) : (), $password ? ( password => $password ) : (), timeout => 60, batch_mode => 1 ); if ($ssh->error) { $self->do_log( "OpenSSHEOSPing connecting $source: ".$ssh->error ); return (); }; if ( $unpriv ) { @output = $ssh->capture("ping $dest"); } else { if ( $psource ) { @output = $ssh->capture("ping $dest repeat $pings size $bytes source $psource"); } else { @output = $ssh->capture("ping $dest repeat $pings size $bytes"); } } if ($ssh->error) { $self->do_log( "OpenSSHEOSPing running commands on $source: ".$ssh->error ); return (); }; if ($output[ 0 ] !~ /^PING/) { $self->do_log( "OpenSSHEOSPing got error on $source for $dest: "." / ".join( @output ) ); return (); } my @times = (); for (@output){ chomp; /^\d+ bytes from .+: icmp_req=\d+ ttl=\d+ time=(\d+\.\d+) ms$/ and push @times,$1; } @times = map {sprintf "%.10e", $_ / $self->{pingfactor}} sort {$a <=> $b} @times; return @times; } sub probevars { my $class = shift; return $class->_makevars($class->SUPER::probevars, { packetsize => { _doc => < 100, _re => '\d+', _sub => sub { my $val = shift; return "ERROR: packetsize must be between 12 and 64000" unless $val >= 12 and $val <= 64000; return undef; }, }, }); } sub targetvars { my $class = shift; return $class->_makevars($class->SUPER::targetvars, { _mandatory => [ 'eosuser', 'eospass', 'source' ], source => { _doc => < "192.168.2.1", }, psource => { _doc => < "192.168.2.129", }, eosuser => { _doc => < 'user', }, eospass => { _doc => < 'password', }, unpriv => { _doc => < '1', }, }); } 1;