#! /usr/bin/perl # to check ping from a file of hostnames using threads #use strict; use warnings; use threads; use threads::shared; use Net::Ping; use Time::HiRes; my $timeout = 5; my $ping_handle = Net::Ping->new("icmp",$timeout) or die "\n ping unsuccessful. $!";; $ping_handle->hires(); #Get the host file name and check if valid file print "\nEnter the host file name:"; chomp (my $host_file = ); open (HOSTFILE, "<", $host_file) or die "\nOpen of $host_file failed. $!"; #assign host_array to list of addresses in file and close my @host_array = ; close (HOSTFILE); #Get output file name and check if valid file print"\nEnter the output file name:"; chomp(my $out_file = ); open (OUTFILE, ">", $out_file) or die "\n Open of $out_file failed.$!"; #debugging #if($ping_handle->ping("www.google.com")){ # print "Google works\n";} #else{ # print "Ping not working\n";} my @threads; foreach $addr(@host_array){ chomp($addr); #print "$addr chomped off\n"; #debugging only my $thr = threads->new(\&sub_ping,$addr); sleep(1); push(@threads,$thr); } foreach (@threads){ my $val = $_->join(); print "Trying to ping $val complete\n"; } sub sub_ping { #check if host is a URL or an IP Address my $host= shift; #to get $ARGV[0] if (($host =~ m([a-zA-Z]+\.\w+\.\w+)) || ($host =~ m(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))) { ($ret, $lat, $ip) = ($ping_handle->ping($host)); #Check if the valid host responds to pings if ($ret) { printf "$host \($ip\) responds to pings at %.2f msec.\n",$lat*1000; printf OUTFILE ("$host \($ip\) responds to pings at %.2f msec.\n",$lat*1000); } else { printf "$host is NOT responding to pings. Time Taken %.2f msec\n",$lat*1000; printf OUTFILE ("$host is NOT responding to pings. Time taken %.2f msec\n",$lat*1000); } $ping_handle->close(); } else #the address is not a URL or an IP Address { print "$host is NOT a valid address.\n"; print OUTFILE ("$host is NOT a valid address.\n"); } return $host; }