class Net::Ping::External

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

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 Net::Ping#exception method should contain a string indicating what went wrong. If the ping succeeded then the Net::Ping#warning method may or may not contain a value.

Calls superclass method Net::Ping#ping
# File lib/net/ping/external.rb, line 33
def ping(host = @host)
  super(host)

  stdin = stdout = stderr = nil
  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/
      orig_cp = GetConsoleCP()
      SetConsoleCP(437) if orig_cp != 437 # United States
      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 File::ALT_SEPARATOR && 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)
Alias for: ping
pingecho(host = @host)
Alias for: ping