vagrant/lib/vagrant/util/is_port_open.rb

39 lines
1.4 KiB
Ruby

require "socket"
require "timeout"
module Vagrant
module Util
# Contains the method {#is_port_open?} to check if a port is open
# (listening) or closed (not in use). This method isn't completely
# fool-proof, but it works enough of the time to be useful.
module IsPortOpen
# Checks if a port is open (listening) on a given host and port.
#
# @param [String] host Hostname or IP address.
# @param [Integer] port Port to check.
# @return [Boolean] `true` if the port is open (listening), `false`
# otherwise.
def is_port_open?(host, port)
# We wrap this in a timeout because once in awhile the TCPSocket
# _will_ hang, but this signals that the port is closed.
Timeout.timeout(1) do
# Attempt to make a connection
s = TCPSocket.new(host, port)
# A connection was made! Properly clean up the socket, not caring
# at all if any exception is raised, because we already know the
# result.
s.close rescue nil
# The port is open if we reached this point, since we were able
# to connect.
return true
end
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH
# Any of the above exceptions signal that the port is closed.
return false
end
end
end
end