90 lines
2.9 KiB
Ruby
90 lines
2.9 KiB
Ruby
|
require 'socket'
|
||
|
require 'timeout'
|
||
|
|
||
|
# The Net module serves as a namespace only.
|
||
|
#
|
||
|
module Net
|
||
|
|
||
|
# The Ping class serves as an abstract base class for all other Ping class
|
||
|
# types. You should not instantiate this class directly.
|
||
|
#
|
||
|
class Ping
|
||
|
# The version of the net-ping library.
|
||
|
VERSION = '1.7.1'
|
||
|
|
||
|
# The host to ping. In the case of Ping::HTTP, this is the URI.
|
||
|
attr_accessor :host
|
||
|
|
||
|
# The port to ping. This is set to the echo port (7) by default. The
|
||
|
# Ping::HTTP class defaults to port 80.
|
||
|
#
|
||
|
attr_accessor :port
|
||
|
|
||
|
# The maximum time a ping attempt is made.
|
||
|
attr_accessor :timeout
|
||
|
|
||
|
# If a ping fails, this value is set to the error that occurred which
|
||
|
# caused it to fail.
|
||
|
#
|
||
|
attr_reader :exception
|
||
|
|
||
|
# This value is set if a ping succeeds, but some other condition arose
|
||
|
# during the ping attempt which merits warning, e.g a redirect in the
|
||
|
# case of Ping::HTTP#ping.
|
||
|
#
|
||
|
attr_reader :warning
|
||
|
|
||
|
# The number of seconds (returned as a Float) that it took to ping
|
||
|
# the host. This is not a precise value, but rather a good estimate
|
||
|
# since there is a small amount of internal calculation that is added
|
||
|
# to the overall time.
|
||
|
#
|
||
|
attr_reader :duration
|
||
|
|
||
|
# The default constructor for the Net::Ping class. Accepts an optional
|
||
|
# +host+, +port+ and +timeout+. The port defaults to your echo port, or
|
||
|
# 7 if that happens to be undefined. The default timeout is 5 seconds.
|
||
|
#
|
||
|
# The host, although optional in the constructor, must be specified at
|
||
|
# some point before the Net::Ping#ping method is called, or else an
|
||
|
# ArgumentError will be raised.
|
||
|
#
|
||
|
# Yields +self+ in block context.
|
||
|
#
|
||
|
# This class is not meant to be instantiated directly. It is strictly
|
||
|
# meant as an interface for subclasses.
|
||
|
#
|
||
|
def initialize(host=nil, port=nil, timeout=5)
|
||
|
@host = host
|
||
|
@port = port || Socket.getservbyname('echo') || 7
|
||
|
@timeout = timeout
|
||
|
@exception = nil
|
||
|
@warning = nil
|
||
|
@duration = nil
|
||
|
|
||
|
yield self if block_given?
|
||
|
end
|
||
|
|
||
|
# The default interface for the Net::Ping#ping method. Each subclass
|
||
|
# should call super() before continuing with their own implementation in
|
||
|
# order to ensure that the @exception and @warning instance variables
|
||
|
# are reset.
|
||
|
#
|
||
|
# If +host+ is nil here, then it will use the host specified in the
|
||
|
# constructor. If the +host+ is nil and there was no host specified
|
||
|
# in the constructor then an ArgumentError is raised.
|
||
|
#--
|
||
|
# The @duration should be set in the subclass' ping method.
|
||
|
#
|
||
|
def ping(host = @host)
|
||
|
raise ArgumentError, 'no host specified' unless host
|
||
|
@exception = nil
|
||
|
@warning = nil
|
||
|
@duration = nil
|
||
|
end
|
||
|
|
||
|
alias ping? ping
|
||
|
alias pingecho ping
|
||
|
end
|
||
|
end
|