package Smokeping::probes::OpenSSHJunOSPing; =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. DOC authors => <<'DOC', Tobias Oetiker Ltobi@oetiker.chL based on L by S H A N Lshanali@yahoo.comL. DOC } } sub new($$$) { my $proto = shift; my $class = ref($proto) || $proto; my $self = $class->SUPER::new(@_); # no need for this if we run as a cgi unless ( $ENV{SERVER_SOFTWARE} ) { $self->{pingfactor} = 1000; # Gives us a good-guess default print "### assuming you are using an JunOS reporting in miliseconds\n"; }; return $self; } sub ProbeDesc($){ my $self = shift; my $bytes = $self->{properties}{packetsize}; return "Juniper JunOS - 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}{junosuser}; my $password = $target->{vars}{junospass}; my $bytes = $self->{properties}{packetsize}; my $pings = $self->pings($target); # do NOT call superclass ... the ping method MUST be overwriten my %upd; my @args = (); my $ssh = Net::OpenSSH->new( $source, $login ? ( user => $login ) : (), $password ? ( password => $password ) : (), timeout => 60 ); if ($ssh->error) { warn "OpenSSHJunOSPing connecting $source: ".$ssh->error."\n"; return undef; }; if ( $psource ) { @output = $ssh->capture("ping $dest count $pings size $bytes source $psource"); } else { @output = $ssh->capture("ping $dest count $pings size $bytes"); } $ssh->system("quit"); my @times = (); for (@output){ chomp; /^\d+ bytes from $dest: icmp_seq=\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 => [ 'junosuser', 'junospass', 'source' ], source => { _doc => < "192.168.2.1", }, psource => { _doc => < "192.168.2.129", }, junosuser => { _doc => < 'user', }, junospass => { _doc => < 'password', }, }); } 1;