1
0
Fork 0

Add switch to return by hostname

This commit is contained in:
Andrew Tomaka 2013-02-23 19:46:28 -05:00
parent cd60141714
commit a88c923a5d

View file

@ -2,6 +2,7 @@
use strict; use strict;
use Net::Ping; use Net::Ping;
use POSIX; use POSIX;
use Socket;
use Time::HiRes qw/time/; use Time::HiRes qw/time/;
if($> != 0) { if($> != 0) {
@ -10,6 +11,7 @@ if($> != 0) {
my $alive = 1; my $alive = 1;
my $time = 0; my $time = 0;
my $name = 0;
my($start,$finish); my($start,$finish);
while($ARGV[0] =~ /\-/) { while($ARGV[0] =~ /\-/) {
my $arg = shift(@ARGV); my $arg = shift(@ARGV);
@ -22,6 +24,8 @@ while($ARGV[0] =~ /\-/) {
$alive = 0; $alive = 0;
} elsif($switch eq "r") { } elsif($switch eq "r") {
$alive = 1; $alive = 1;
} elsif($switch eq "n") {
$name = 1;
} elsif($switch eq "t") { } elsif($switch eq "t") {
$time = 1; $time = 1;
} elsif($switch eq "h") { } elsif($switch eq "h") {
@ -40,38 +44,47 @@ if(scalar(@ARGV) < 1 || scalar(@ARGV) > 2) {
$start = time if($time); $start = time if($time);
my $p = Net::Ping->new('icmp'); my $p = Net::Ping->new('icmp');
my @ips; my @ips;
if(scalar(@ARGV) == 2) {
# must be IP addresses # must be IP addresses
if($ARGV[0] !~ /((?:\d{1,3}\.){3}\d{1,3})/ || $ARGV[1] !~ /((?:\d{1,3}\.){3}\d{1,3})/) { if($ARGV[0] !~ /((?:\d{1,3}\.){3}\d{1,3})/ || (defined($ARGV[1]) && $ARGV[1] !~ /((?:\d{1,3}\.){3}\d{1,3})/)) {
die("Both arguments must be IP addresses if two are specified.\n"); die("Both arguments must be IP addresses if two are specified.\n");
} }
# and only the final octet should differ # and only the final octet should differ
my @ip1 = split(/\./, $ARGV[0]); my @ip1 = split(/\./, $ARGV[0]);
my @ip2 = split(/\./, $ARGV[1]); my @ip2;
if($ip1[0] != $ip2[0] || $ip1[1] != $ip2[1] || $ip1[2] != $ip2[2]) { if(scalar(@ARGV) == 2) {
@ip2 = split(/\./, $ARGV[1]);
} else {
@ip2 = @ip1;
}
if($ip1[0] != $ip2[0] || $ip1[1] != $ip2[1] || $ip1[2] != $ip2[2]) {
die("The first three octets of the IP addresses must match.\n") die("The first three octets of the IP addresses must match.\n")
} }
my $baseIp = $ip1[0] . '.' . $ip1[1] . '.' . $ip1[2]; my $baseIp = $ip1[0] . '.' . $ip1[1] . '.' . $ip1[2];
my $start = $ip1[3]; my $start = $ip1[3];
my $end = $ip2[3]; my $end = $ip2[3];
my $count = $ip2[3] - $ip1[3] + 1; my $count = $ip2[3] - $ip1[3] + 1;
for(my $i = $start, my $k = 1; $i <= $end; $i++, $k++) { for(my $i = $start, my $k = 1; $i <= $end; $i++, $k++) {
$| = 1; $| = 1;
progressBar($k, $count); progressBar($k, $count);
my $ip = $baseIp . '.' . $i; my $ip = $baseIp . '.' . $i;
push(@ips, $ip) if($p->ping($ip, 1) == $alive); if($p->ping($ip, 1) == $alive) {
if($name) {
my $hostaddr = gethostbyaddr(inet_aton($ip), AF_INET);
$ip = $hostaddr if($hostaddr ne "");
} }
} elsif(scalar(@ARGV) == 1) {
my $host = $ARGV[0];
push(@ips, $host) if($p->ping($host, 1) == $alive); push(@ips, $ip);
}
} }
$p->close(); $p->close();
$finish = time if($time); $finish = time if($time);
@ -124,6 +137,7 @@ sub progressBar {
sub help { sub help {
print "usage:\t pinger [-d] start [finish]\n\n"; print "usage:\t pinger [-d] start [finish]\n\n";
print "\t-d\t\tList dead addresses\n"; print "\t-d\t\tList dead addresses\n";
print "\t-n\t\tReturn list as hostnames when possible\n";
print "\t-r\t\tList reachable addresses (default)\n"; print "\t-r\t\tList reachable addresses (default)\n";
print "\t-t\t\tTime ping execution\n"; print "\t-t\t\tTime ping execution\n";
exit(1); exit(1);