#!/usr/bin/perl 

use strict;
use Net::Ping;
use List::Util 'shuffle';

my @hosts = qw/kernighan.cs.calvin.edu
augusta.cs.calvin.edu
stroustrup.cs.calvin.edu
ritchie.cs.calvin.edu
aiken.cs.calvin.edu
backus-naur.cs.calvin.edu
eckert-mauchly.cs.calvin.edu
atanasoff.cs.calvin.edu
thompson.cs.calvin.edu
codd.cs.calvin.edu
babbage.cs.calvin.edu
turing.cs.calvin.edu
hoare.cs.calvin.edu
wall.cs.calvin.edu
englebart.cs.calvin.edu
vonneuman.cs.calvin.edu
hopper.cs.calvin.edu
dijkstra.cs.calvin.edu
chomsky.cs.calvin.edu
leibniz.cs.calvin.edu
schreyer.cs.calvin.edu
wirth.cs.calvin.edu
cray.cs.calvin.edu
hillis.cs.calvin.edu
taylor.cs.calvin.edu
goldberg.cs.calvin.edu
kay.cs.calvin.edu
boole.cs.calvin.edu
church.cs.calvin.edu
sutherland.cs.calvin.edu
noyce-kilby.cs.calvin.edu
hollerith.cs.calvin.edu/; 

my $p = Net::Ping->new("tcp",5);
$p->{port_num} = getservbyname("ssh", "tcp");
$p->service_check(1);
my $numchildren;

pipe(FIN,FOUT);

foreach my $host (@hosts) 
{
    $numchildren++;
    if ($numchildren > 100) {
            while(wait() != -1 && $numchildren > 50) { $numchildren--; }
    }
    unless(fork())
    {
        close(FIN);
        if ($p->ping($host))
        {
            print FOUT "$host\n";
        }
        exit 0;
    }
}

while (wait() != -1) { $numchildren--; }

close(FOUT);
my @linux_hosts;
while (<FIN>)
{
        push(@linux_hosts,$_);
}
close(FIN);

my @shuffled = shuffle(@linux_hosts);

foreach my $host(@shuffled) { chomp $host; print $host . "\n"; }
