package Smokeping::probes::TelnetIOSPing; =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', John A Jackson based HEAVILY on Smokeping::probes::IOSPing 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 IOS reporting in miliseconds\n"; }; return $self; } sub ProbeDesc($){ my $self = shift; my $bytes = $self->{properties}{packetsize}; return "InfoAve Cisco IOS - 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}{iosuser}; my $pssword = $target->{vars}{iospass}; 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(); # These are for debugging # $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|name|word):.*$/'); $telnet->print("$login"); $telnet->waitfor('/word:.*$/'); $telnet->print("$pssword"); #Do the work $telnet->waitfor('/[\@\w\-\.]+[>#][ ]*$/'); $telnet->print("terminal length 0"); $telnet->waitfor('/[\@\w\-\.]+[>#][ ]*$/'); $telnet->print("ping"); $telnet->waitfor('/Protocol \[ip\]: $/'); $telnet->print(""); $telnet->waitfor('/Target IP address: $/'); $telnet->print("$dest"); $telnet->waitfor('/Repeat count \[5\]: $/'); $telnet->print($pings); $telnet->waitfor('/Datagram size \[100\]: $/'); $telnet->print("$bytes"); $telnet->waitfor('/Timeout in seconds \[2\]: $/'); $telnet->print(""); $telnet->waitfor('/Extended commands \[n\]: $/'); $telnet->print("y"); $telnet->waitfor('/Source address or interface: $/'); $telnet->print("$psource"); $telnet->waitfor('/Type of service \[0\]: $/'); $telnet->print(""); $telnet->waitfor('/Set DF bit in IP header\? \[no\]: $/'); $telnet->print(""); $telnet->waitfor('/Validate reply data\? \[no\]: $/'); $telnet->print(""); $telnet->waitfor('/Data pattern \[0xABCD\]: $/'); $telnet->print(""); $telnet->waitfor('/Loose, Strict, Record, Timestamp, Verbose\[none\]: $/'); $telnet->print("v"); $telnet->waitfor('/Loose, Strict, Record, Timestamp, Verbose\[V\]: $/'); $telnet->print(""); $telnet->waitfor('/Sweep range of sizes.+$/'); $telnet->prompt('/[\@\w\-\.]+[>#][ ]*$/'); @output = $telnet->cmd("n"); #$telnet->waitfor('/[\@\w\-\.]+[>#][ ]*$/'); $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 =~ /^Reply to request \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 => < 56, _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 => [ 'iosuser', 'iospass', 'source' ], source => { _doc => < "192.168.2.1", }, psource => { _doc => < "192.168.2.129", }, iosuser => { _doc => < 'user', }, iospass => { _doc => < 'password', }, }); } 1;