I'm trying to write a script that'll check to see if another machine is 
pingable, and perform one of two actions based on the result.  I found the 
following isPingable() subroutine on a website (that is now not responding, 
so I couldn't contact its author) and thought I'd see how well it works.

Right now, it behaves correctly if fed the IP of a pingable machine, or if 
fed an IP that isn't in the DNS.  But it delivers false positives if a 
target IP is listed in the DNS but is turned off.

I'm very much a novice at scripting, so I was hoping that someone could give 
me some tips on whether I've misread the subroutine and I'm feeding it 
variables incorrectly, or if it's just broken and I wasn't able to pick up 
on that from reading it.


D.

        #!/usr/bin/perl

        sub isPingable;

        if ( isPingable ( "128.2.206.160" ) )  {
            system ("/bin/touch pingable-YES");
        } else {
            system ("/bin/touch pingable-NO");
        }

        sub isPingable {

        # isPingable -- is pingable ?
        #
        # version: 1.01
        #
        # usage: isPingable(IP_Address,[time=10sec])
        #
        # returns: 1 if pingable, 0 otherwise.
        #
        # Author: Dr. Michael M. Boyce
        # Date: Tue Aug 22 00:15:08 UTC 2000

            my $IP_Address=shift;
            my $time = ($_[0]) ? (shift) : 10 ;

            my $pid="failed";
            my $count=0;
            my $max_trys=10;

            while (($pid=open(CHILD,"-|")) eq "failed") {
                return 0 if ++$count > $max_trys;
                sleep 10;
            }

            unless ($pid) { # child (i.e., $SIG{ALRM} Wrapper)
                my $pid=open(PING,"ping -c 1 $IP_Address |") || return 0;

                $SIG{ALRM} = sub {`kill -9 $pid`};

                alarm $time;
                my $output=pop @{[map {(/loss/) ? $_ : ()} <PING>]};
                alarm 0;

                close PING;

                print (($output=~/0% packet loss/) ? 1 : 0) ;

                exit;
            }

            my $pingStatus=<CHILD>;

            close CHILD;

            return $pingStatus;

        }


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to