From 4712a70ca420acce8186b428453bc3c63edf20a1 Mon Sep 17 00:00:00 2001 From: Tobi Oetiker Date: Tue, 27 Jun 2006 21:12:36 +0000 Subject: new probe Telnet JunOSPing integrated --- lib/Smokeping/probes/TelnetJunOSPing.pm | 246 ++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 lib/Smokeping/probes/TelnetJunOSPing.pm (limited to 'lib/Smokeping/probes') diff --git a/lib/Smokeping/probes/TelnetJunOSPing.pm b/lib/Smokeping/probes/TelnetJunOSPing.pm new file mode 100644 index 0000000..8e6ca5d --- /dev/null +++ b/lib/Smokeping/probes/TelnetJunOSPing.pm @@ -0,0 +1,246 @@ +package Smokeping::probes::TelnetJunOSPing; + +=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::Telnet (); +use Carp; + +my $e = "="; +sub pod_hash { + return { + name => < < < <<'DOC', +S H A N + +based HEAVILY on Smokeping::probes::TelnetIOSPing by + +John A Jackson + +based on Smokeping::probes::JunOSPing by + +Paul J Murphy + +based on Smokeping::probes::FPing by + +Tobias Oetiker +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 "InfoAve 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 $port = 23; + my @output = (); + my $login = $target->{vars}{junosuser}; + my $pssword = $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 $telnet = Net::Telnet->new(Timeout => 60); +# $telnet->errmode("TIPreturn"); +# $telnet->input_log("TIPinlog"); +# $telnet->dump_log("TIPdumplog"); + +# Open the Connection to the router +# open(OUTF,">outfile.IA") || die "Can't open OUTF: $!"; +# print OUTF "target => $dest\nsource => $source\nuser => $login\n"; + my $ok = $telnet->open(Host => $source, + Port => $port); + print OUTF "Connection is a $ok\n"; + + #Authenticate + $telnet->waitfor('/(ogin):.*$/'); + $telnet->print("$login"); + $telnet->waitfor('/word:.*$/'); + $telnet->print("$pssword"); + $telnet->prompt('/[\@\w\-\.]+[>#][ ]*$/'); + #Do the work + $telnet->waitfor('/[\@\w\-\.]+[>#][ ]*$/'); + $telnet->print("set cli screen-length 0"); + $telnet->waitfor('/[\@\w\-\.]+[>#][ ]*$/'); + @output = $telnet->cmd("ping $dest count $pings size $bytes source $psource"); + $telnet->print("quit"); + $telnet->close; + print OUTF "closed Telnet connection\n"; + + my @times = (); + while (@output) { + my $outputline = shift @output; + chomp($outputline); + print OUTF "$outputline\n"; + $outputline =~ /^\d+ bytes from $dest: icmp_seq=\d+ ttl=\d+ time=(\d+\.\d+) ms$/ && push(@times,$1); + #print OUTF "$outputline => $1\n"; + } + @times = map {sprintf "%.10e", $_ / $self->{pingfactor}} sort {$a <=> $b} @times; +# close(OUTF); + 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; -- cgit v1.2.3-24-g4f1b