Parent

Included Modules

Net::Ping::External

The Ping::External class encapsulates methods for external (system) pings.

Constants

CWINDOWS

Public Instance Methods

ping(host = @host) click to toggle source

Pings the host using your system's ping utility and checks for any errors or warnings. Returns true if successful, or false if not.

If the ping failed then the Ping::External#exception method should contain a string indicating what went wrong. If the ping succeeded then the Ping::External#warning method may or may not contain a value.

# File lib/net/ping/external.rb, line 37
def ping(host = @host)
  super(host)

  stdin, stdout, stderr = ""
  pstring = "ping "
  bool    = false
  orig_cp = nil
   
  case RbConfig::CONFIG['host_os']
    when /linux|bsd|osx|mach|darwin/
      pstring += "-c 1 #{host}"
    when /solaris|sunos/
      pstring += "#{host} 1"
    when /hpux/
      pstring += "#{host} -n 1"
    when /win32|windows|msdos|mswin|cygwin|mingw/
      if RUBY_PLATFORM != 'java'
        orig_cp = GetConsoleCP()
        SetConsoleCP(437) if orig_cp != 437 # United States
      end
      pstring += "-n 1 #{host}"
    else
      pstring += "#{host}"
  end
   
  start_time = Time.now
   
  begin
    err = nil

    Timeout.timeout(@timeout){
      stdin, stdout, stderr = Open3.popen3(pstring)
      err = stderr.gets # Can't chomp yet, might be nil
    }

    stdin.close
    stderr.close

    if CWINDOWS && GetConsoleCP() != orig_cp
      SetConsoleCP(orig_cp)
    end
  
    unless err.nil?
      if err =~ /warning/
        @warning = err.chomp
        bool = true
      else
        @exception = err.chomp
      end
    # The "no answer" response goes to stdout, not stderr, so check it
    else
      lines = stdout.readlines
      stdout.close
      if lines.nil? || lines.empty?
        bool = true
      else
        regexp = /
          no\ answer|
          host\ unreachable|
          could\ not\ find\ host|
          request\ timed\ out|
          100%\ packet\ loss
        /x

        lines.each{ |line|
          if regexp.match(line)
            @exception = line.chomp
            break
          end
        }

        bool = true unless @exception
      end
    end
  rescue Exception => error
    @exception = error.message 
  ensure
    stdin.close  if stdin  && !stdin.closed?
    stdout.close if stdout && !stdout.closed?
    stderr.close if stderr && !stderr.closed?
  end

  # There is no duration if the ping failed
  @duration = Time.now - start_time if bool

  bool
end
Also aliased as: ping?, pingecho
ping?(host = @host) click to toggle source
Alias for: ping
pingecho(host = @host) click to toggle source
Alias for: ping

[Validate]

Generated with the Darkfish Rdoc Generator 2.