Module: PryRemoteEm::Client::Generic

Includes:
EM::Deferrable, Proto
Included in:
PryRemoteEm::Client, Broker
Defined in:
lib/pry-remote-em/client/generic.rb

Instance Method Summary collapse

Methods included from Proto

#receive_auth, #receive_clear_buffer, #receive_completion, #receive_data, #receive_msg, #receive_msg_bcast, #receive_object, #receive_prompt, #receive_proxy_connection, #receive_raw, #receive_register_server, #receive_server_list, #receive_server_reload_list, #receive_shell_cmd, #receive_shell_data, #receive_shell_result, #receive_shell_sig, #receive_start_tls, #receive_unknown, #receive_unregister_server, #send_auth, #send_banner, #send_clear_buffer, #send_completion, #send_heatbeat, #send_msg, #send_msg_bcast, #send_object, #send_prompt, #send_proxy_connection, #send_raw, #send_register_server, #send_server_list, #send_server_reload_list, #send_shell_cmd, #send_shell_data, #send_shell_result, #send_shell_sig, #send_start_tls, #send_unregister_server

Instance Method Details

#connection_completedObject



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/pry-remote-em/client/generic.rb', line 34

def connection_completed
  if get_peername
    port, ip = Socket.unpack_sockaddr_in(get_peername)
    log.info("[pry-remote-em] client connected to pryem://#{ip}:#{port}/")
  else
    # TODO use the args used to create this connection
    log.info('[pry-remote-em] client connected')
  end
  timeout = ENV['PRYEMNEGOTIMEOUT'].nil? || ENV['PRYEMNEGOTIMEOUT'].empty? ? NEGOTIATION_TIMEOUT : ENV['PRYEMNEGOTIMEOUT']
  @nego_timer = EM::Timer.new(timeout) do
    fail("[pry-remote-em] server didn't finish negotiation within #{timeout} seconds; terminating")
  end
end

#initialize(opts = {}) ⇒ Object



9
10
11
# File 'lib/pry-remote-em/client/generic.rb', line 9

def initialize(opts = {})
  @opts   = opts
end

#logObject



17
18
19
20
21
22
23
24
25
# File 'lib/pry-remote-em/client/generic.rb', line 17

def log
  @log ||= Class.new do
    def print(str); $stderr.puts(str) end
    alias :info :print
    alias :warn :print
    alias :error :print
    alias :debug :print
  end.new
end

#optsObject



13
14
15
# File 'lib/pry-remote-em/client/generic.rb', line 13

def opts
  @opts ||= {}
end

#receive_banner(name, version, scheme) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/pry-remote-em/client/generic.rb', line 48

def receive_banner(name, version, scheme)
  log.info("[pry-remote-em] remote is #{name} #{version} #{scheme}")
  client_ver = Gem::Version.new(PryRemoteEm::VERSION)
  server_req = Gem::Requirement.new("~>#{version}")
  server_ver = Gem::Version.new(version)
  client_req = Gem::Requirement.new("~>#{PryRemoteEm::VERSION}")
  unless server_req.satisfied_by?(client_ver) || client_req.satisfied_by?(server_ver)
    fail("[pry-remote-em] incompatible version #{PryRemoteEm::VERSION}")
    return false
  end
  if scheme.nil? || scheme != (reqscheme = opts[:tls] ? 'pryems' : 'pryem')
    if scheme == 'pryems' && defined?(::OpenSSL)
      opts[:tls] = true
    else
      fail("[pry-remote-em] server doesn't support required scheme #{reqscheme.dump}")
      return false
    end
  end
  @negotiated = true
  @nego_timer.cancel
  true
end

#start_tlsObject



27
28
29
30
31
32
# File 'lib/pry-remote-em/client/generic.rb', line 27

def start_tls
  return if @tls_started
  @tls_started = true
  log.info('[pry-remote-em] negotiating TLS')
  super(opts[:tls].is_a?(Hash) ? opts[:tls] : {})
end