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\-\.]+[>#][ ]*$/'); if ( $psource ) { @output = $telnet->cmd("ping $dest count $pings size $bytes source $psource"); } else { @output = $telnet->cmd("ping $dest count $pings size $bytes"); } $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;