#!/usr/bin/perl use strict; use IO::Socket; use Sys::Hostname; use Cisco::Management; use Getopt::Long qw(:config no_ignore_case); #bundling use Pod::Usage; my %opt; my ($opt_help, $opt_man); GetOptions( 'community=s' => \$opt{community}, 'Count=i' => \$opt{count}, 'destination=s' => \$opt{destination}, 'size=i' => \$opt{size}, 'vrf=s' => \$opt{vrf}, 'wait=i' => \$opt{wait}, 'help!' => \$opt_help, 'man!' => \$opt_man ) or pod2usage(-verbose => 0); pod2usage(-verbose => 1) if defined $opt_help; pod2usage(-verbose => 2) if defined $opt_man; # Make sure at least one arg was provided if (!@ARGV) { pod2usage(-verbose => 0, -message => "$0: host required\n") } $opt{community} = $opt{community} || 'private'; $opt{destination} = $opt{destination} || inet_ntoa((gethostbyname(hostname))[4]); $opt{count} = $opt{count} || 4; $opt{size} = $opt{size} || 64; $opt{wait} = $opt{wait} || 1; for (@ARGV) { print "\n-- $_ --\n"; my $cm; if (!defined($cm = Cisco::Management->new( hostname => $_, community => $opt{community} ))) { printf "Error: %s\n", Cisco::Management->error; next } $|++; my $dest = inet_ntoa((gethostbyname($opt{destination}))[4]); print "Pinging $opt{destination} [$dest] with $opt{size} bytes of data from:\n\n$_ "; my %params; if (defined($opt{count})) { $params{count} = $opt{count} } if (defined($opt{destination})) { $params{host} = $opt{destination} } if (defined($opt{size})) { $params{size} = $opt{size} } if (defined($opt{wait})) { $params{wait} = $opt{wait} } if (defined($opt{vrf})) { $params{vrf} = $opt{vrf} } if (defined(my $pings = $cm->proxy_ping(%params))) { printf "%s $opt{destination} [$dest]\n\nPing statistics for $dest:\n", ($pings->proxy_ping_received() >= 1) ? '!!! Reply from' : '... No response from'; printf " Packets: Sent = %i, Received = %i, Lost = %i (%i%% loss),\n", $pings->proxy_ping_sent(), $pings->proxy_ping_received(), $pings->proxy_ping_sent()-$pings->proxy_ping_received(), (100-($pings->proxy_ping_received()/$pings->proxy_ping_sent()*100)); print "Approximate round trip times in milli-seconds:\n"; printf " Minimum = %sms, Maximum = %sms, Average = %sms\n", $pings->proxy_ping_minimum(), $pings->proxy_ping_maximum(), $pings->proxy_ping_average(); } else { printf "Error: %s\n", Cisco::Management->error } $cm->close() } __END__ ######################################################## # Start POD ######################################################## =head1 NAME CISCO-PING - Cisco Proxy Ping =head1 SYNOPSIS cisco-ping [options] host [...] =head1 DESCRIPTION Execute proxy ping from host to provided destination. =head1 ARGUMENTS host The Cisco device to ping from. =head1 OPTIONS -c SNMP read/write community. --community DEFAULT: (or not specified) 'private'. -C # The number of pings to send. --Count DEFAULT: (or not specified) 4. -d The destination to ping to. --destination DEFAULT: (or not specified) localhost. -s # The size of the ping packets. --size DEFAULT: (or not specified) 64. -v The VRF instance name to source pings from. --vrf DEFAULT: (or not specified) [none]. -w # The ping timeout in seconds. --wait DEFAULT: (or not specified) 1. =head1 LICENSE This software is released under the same terms as Perl itself. If you don't know what that means visit L. =head1 AUTHOR Copyright (C) Michael Vincent 2010 L All rights reserved =cut