#! /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; print "\nEnter the host file name:"; chomp (my $host_file = ); open (HOSTFILE, "<", $host_file) or die "\nOpen of $host_file failed. $!"; my @host_array = ; close (HOSTFILE); print"\nEnter the output file name:"; chomp(my $out_file = ); open (OUTFILE, ">", $out_file) or die "\n Open of $out_file failed.$!"; my @threads; foreach $addr(@host_array){ chomp($addr); 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 { my $host= shift; #to get $ARGV[0] my $ping_handle = Net::Ping->new("icmp",$timeout) or die "\n ping unsuccessful. $!";; $ping_handle->hires(); 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)); if ($ret) { printf "$host \($ip\) responds to pings at %.2f msec.\n", ($lat//0)*1000; printf OUTFILE ("$host \($ip\) responds to pings at %.2f msec.\n",($lat//0)*1000); } else { printf "$host is NOT responding to pings. Time Taken %.2f msec\n",($lat//0)*1000; printf OUTFILE ("$host is NOT responding to pings. Time taken %.2f msec\n",($lat//0)*1000); } #$ping_handle->close(); } else { print "$host is NOT a valid address.\n"; print OUTFILE ("$host is NOT a valid address.\n"); } return $host; }