class Object

Public Instance Methods

combine_port_states(states) click to toggle source
# File lib/extensions/port.rb, line 58
def combine_port_states(states)
  states.reduce({}) do |old_state, state|
    old_state[:open] ||= state[:open]
    old_state[:ssl] ||= state[:ssl]

    old_state[:open] &&= state[:open]
    old_state[:ssl] &&= state[:open]

    old_state
  end
end
connect_to_port(port) click to toggle source
# File lib/extensions/port.rb, line 34
def connect_to_port(port)
  begin
    TCPSocket.new('0.0.0.0', port)
  rescue StandardError # Errno::ECONNREFUSED mainly but covering for timeouts
    nil
  end
end
get_port_state(port) click to toggle source
# File lib/extensions/port.rb, line 42
def get_port_state(port)
  state = { :open => false,
            :ssl => "unknown" }

  tcp_socket = connect_to_port(port)

  return state unless tcp_socket # couldn't connect, can't figure anything out

  state[:open] = true
  state[:ssl] = is_ssl_enabled?(tcp_socket)

  tcp_socket.close

  state
end
is_ssl_enabled?(tcp_socket) click to toggle source
# File lib/extensions/port.rb, line 4
def is_ssl_enabled?(tcp_socket)
  ctx = OpenSSL::SSL::SSLContext.new
  ctx.set_params({ :options=>OpenSSL::SSL::OP_ALL })
  ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
  enabled = true

  OpenSSL::SSL::SSLSocket.new(tcp_socket, ctx).tap do |socket|
    begin
      socket.sync_close = true
      socket.connect_nonblock
    rescue IO::WaitReadable
      if IO.select([socket], nil, nil, 1)
        retry
      else
        enabled = false
      end
    rescue IO::WaitWritable
      if IO.select([socket], nil, nil, 1)
        retry
      else
        enabled = false
      end
    rescue OpenSSL::SSL::SSLError
      enabled = false
    end

    return enabled
  end
end