class SyslogTls::SSLTransport

Supports SSL connection to remote host

Attributes

ca_cert[R]
cert[R]
host[R]
key[R]
port[R]
retries[W]
socket[RW]
ssl_version[R]

Public Class Methods

new(host, port, ca_cert: 'system', cert: nil, key: nil, ssl_version: :TLSv1_2, max_retries: 1) click to toggle source
# File lib/syslog_tls/ssl_transport.rb, line 27
def initialize(host, port, ca_cert: 'system', cert: nil, key: nil, ssl_version: :TLSv1_2, max_retries: 1)
  @ca_cert = ca_cert
  @host = host
  @port = port
  @cert = cert
  @key = key
  @ssl_version = ssl_version
  @retries = max_retries
  connect
end

Public Instance Methods

connect() click to toggle source
# File lib/syslog_tls/ssl_transport.rb, line 38
def connect
  @socket = get_ssl_connection
  @socket.connect
end
get_ssl_connection() click to toggle source
# File lib/syslog_tls/ssl_transport.rb, line 43
def get_ssl_connection
  tcp = TCPSocket.new(host, port)

  ctx = OpenSSL::SSL::SSLContext.new
  ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER)
  ctx.ssl_version = ssl_version

  case ca_cert
  when true, 'true', 'system'
    # use system certs, same as openssl cli
    ctx.cert_store = OpenSSL::X509::Store.new
    ctx.cert_store.set_default_paths
  when false, 'false'
    ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
  when %r{/$} # ends in /
    ctx.ca_path = ca_cert
  when String
    ctx.ca_file = ca_cert
  end

  ctx.cert = OpenSSL::X509::Certificate.new(File.read(cert)) if cert
  ctx.key = OpenSSL::PKey::read(File.read(key)) if key
  socket = OpenSSL::SSL::SSLSocket.new(tcp, ctx)
  socket.sync_close = true
  socket
end
method_missing(method_sym, *arguments, &block) click to toggle source

Forward any methods directly to SSLSocket

# File lib/syslog_tls/ssl_transport.rb, line 86
def method_missing(method_sym, *arguments, &block)
  @socket.send(method_sym, *arguments, &block)
end
write(s) click to toggle source

Allow to retry on failed writes

# File lib/syslog_tls/ssl_transport.rb, line 71
def write(s)
  begin
    retry_id ||= 0
    @socket.send(:write, s)
  rescue => e
    if (retry_id += 1) < @retries
      connect
      retry
    else
      raise e
    end
  end
end