----- Original Message -----
From: Tyson Sommer <[EMAIL PROTECTED]>
Date: Thursday, February 17, 2005 11:42 am
Subject: RE: Capturing the results from Expect with backtick

> 
> 
> > -----Original Message-----
> > From: glidden, matthew [EMAIL PROTECTED] 
> > Sent: Thursday, February 17, 2005 10:15 AM
> > To: 'beginners@perl.org'
> > Subject: Capturing the results from Expect with backtick
> > 
> > I'm using combined perl and Expect scripts to do the following:
> > 
> > 1. ping a host using expect (for technical reasons, I've had 
> > better luck using expect than perl here) 2. for each system 
> > that responds to ping, perform a series of rsh commands via perl
> > 
> > The expect script is this, where $hosts is a list of 
> > potential names to
> > ping:
> > 
> >     foreach h $hosts {
> >                 spawn ping $h
> > 
> >                 expect {
> >                         icmp_seq {
> >                                 puts $h
> >                                 exit 0
> >                         }
> >                 }
> >     }
> > 
> >     puts ""
> >     exit -1
> > 
> > Calling the expect script looks like this, where $sName is 
> > the system name:
> > 
> >     my $sPing = `./ping.exp $sName`;
> > 
> > Later on, I check the results like this:
> > 
> >                if ($sPing ne '') {
> >                         print "$sPing is up";
> >                             [rsh commands]
> >                } else {
> >                         print "$sName is down";
> >                }
> > 
> > When I run this from a terminal window, it returns the pinged 
> > name and everything works fine. However, I need it automated, 
> > so I set up a cron job.
> > The cron job never pings the hosts successfully--everything 
> > returns as "down." My hunch is that it has to do with using 
> > "puts" in Expect and backtick in perl--do they need a STDOUT 
> > stream to work properly? How can I set this up to ping 
> > properly while automated?
> > 
> > Matthew
> 
> 
> You shouldn't need Expect. I've had great success with something 
> like this
> (I'm sure there's a more condensed way to write it, but this works 
> everytime):
> 
> 
> ...
> 
>       ### open ping command with filehandle so we can grab the STDERR (in
> case of Unknown Host) using the 2>&1 and pipe
>       ### Also using switches to make ping faster and limit to only four
> pings -- tailor to suit your needs
>       open (PINGTEST, 'ping -c 4 -i .2 -w 3 ' . $sName . ' 2>&1 |') || die
> "Can't run PING!!!\n";
>       
>       ### set $ping_data to result of <PINGTEST> using join() to put into
> scalar context
>       my $ping_data = join ("", <PINGTEST>);
>       
>       ### print $ping_data if debugging (useful for checking results of
> open() above)
>       print "\n$ping_data\n" if $debug;
>       
>       
>       ######### Might have to change one or more of the following regexes
> ########
>       ######### depending on how your system returns ping data
> ########
> 
>       ### search $ping_data string...   
>       if ( $ping_data !~ /bytes\sfrom/ ) {   ### <-- REGEX HERE
> 
>               if ( $ping_data =~ /unknown\shost/ ) {  ### <-- REGEX HERE
> 
>                       ### ...and set $error if device unknown...
>                       $error = "$sName unknown!!\n";
> 
>               } elsif ( $ping_data =~ /100% loss/ ) {   ### <-- REGEX HERE
> 
>                       ### ...or set $error if device known but
> unreachable...
>                       $error = "$sName is down!!\n";
> 
>               }
>       } else {
> 
>               ### ...or set $error to "successful" if we are
>               $error = "$sName is up!\n";
>       }
> 
> ...
> 
> 
> If anyone can make this simpler, let me know!

Why not use Net::Ping module ?? Here is an example

#!PERL
use warnings;
use strict;
use Net::Ping;

my $pinger = Net::Ping->new("icmp") || die "error: $!\n"; 
my $host = "myhost";

if( $pinger->ping($host,2) ){
        print "$host is online\n";
}
else{
        print "$host is offline\n";
}


> 
> 
> 
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> <http://learn.perl.org/> <http://learn.perl.org/first-response>
> 
> 
> 


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to