Included Modules

PryRemoteEm::Broker

Attributes

host[R]
listening[R]
listening?[R]
port[R]

Public Class Methods

connected?() click to toggle source
# File lib/pry-remote-em/broker.rb, line 100
def connected?
  @connected
end
expand_url(url) click to toggle source
# File lib/pry-remote-em/broker.rb, line 75
def expand_url(url)
  return Array(url) if (u = URI.parse(url)).host != '0.0.0.0'
  Socket.ip_address_list.select { |a| a.ipv4? }
   .map(&:ip_address).map{|i| u.clone.tap{|mu| mu.host = i } }
end
hbeats() click to toggle source
# File lib/pry-remote-em/broker.rb, line 96
def hbeats
  @hbeats ||= {}
end
log() click to toggle source
# File lib/pry-remote-em/broker.rb, line 54
def log
  return opts[:logger] if opts[:logger]
  @log ||= Logger.new(STDERR)
end
new(opts = {:tls => false}, &blk) click to toggle source
# File lib/pry-remote-em/broker.rb, line 159
def initialize(opts = {:tls => false}, &blk)
  @opts   = opts
end
opts() click to toggle source
# File lib/pry-remote-em/broker.rb, line 50
def opts
  @opts ||= {}
end
register(url, name = 'unknown') click to toggle source
# File lib/pry-remote-em/broker.rb, line 63
def register(url, name = 'unknown')
  expand_url(url).each do |u|
    client { |c| c.send_register_server(u, name) }
  end
end
restart() click to toggle source
# File lib/pry-remote-em/broker.rb, line 38
def restart
  log.info("[pry-remote-em broker] restarting on pryem://#{host}:#{port}")
  @waiting   = nil
  @client    = nil
  run(@host, @port, @opts) do
    PryRemoteEm.servers.each do |url, (sig, name)|
      next unless EM.get_sockname(sig)
      register(url, name)
    end
  end
end
run(host = ENV['PRYEMBROKER'] || DEF_BROKERHOST, port = ENV['PRYEMBROKERPORT'] || DEF_BROKERPORT, opts = {:tls => false}) click to toggle source
# File lib/pry-remote-em/broker.rb, line 12
def run(host = ENV['PRYEMBROKER'] || DEF_BROKERHOST, port = ENV['PRYEMBROKERPORT'] || DEF_BROKERPORT, opts = {:tls => false})
  raise "root permission required for port below 1024 (#{port})" if port < 1024 && Process.euid != 0
  @host      = host
  @port      = port
  # Brokers cannot use SSL directly. If they do then when a proxy request to an SSL server is received
  # the client and server will not be able to negotiate a SSL session. The proxied traffic can be SSL
  # encrypted, but the SSL session will be between the client and the server.
  opts       = opts.dup
  opts[:tls] = false
  @opts      = opts
  begin
    EM.start_server(host, port, PryRemoteEm::Broker, opts) do |broker|
    end
    log.info("[pry-remote-em broker] listening on #{opts[:tls] ? 'pryems' : 'pryem'}://#{host}:#{port}")
    @listening = true
  rescue => e
    # EM 1.0.0.beta4's message tells us the port is in use; 0.12.10 just says, 'no acceptor'
    if (e.message.include?('port is in use') || e.message.include?('no acceptor'))
      # [pry-remote-em broker] a broker is already listening on #{host}:#{port}
    else
      raise e
    end
  end
  client { |c| yield self } if block_given?
end
servers() click to toggle source
# File lib/pry-remote-em/broker.rb, line 59
def servers
  @servers ||= {}
end
timers() click to toggle source
# File lib/pry-remote-em/broker.rb, line 92
def timers
  @timers ||= {}
end
unregister(url) click to toggle source
# File lib/pry-remote-em/broker.rb, line 69
def unregister(url)
  expand_url(url).each do |u|
    client { |c| c.send_unregister_server(u) }
  end
end
watch_heartbeats(url) click to toggle source
# File lib/pry-remote-em/broker.rb, line 81
def watch_heartbeats(url)
  return if timers[url]
  timers[url] = EM::PeriodicTimer.new(20) do
    if !hbeats[url] || (Time.new - hbeats[url]) > 20
      servers.delete(url)
      timers[url].cancel
      timers.delete(url)
    end
  end
end

Public Instance Methods

log() click to toggle source
# File lib/pry-remote-em/broker.rb, line 163
def log
  Broker.log
end
peer_ip() click to toggle source
# File lib/pry-remote-em/broker.rb, line 180
def peer_ip
  return @peer_ip if @peer_ip
  return "" if get_peername.nil?
  @peer_port, @peer_ip = Socket.unpack_sockaddr_in(get_peername)
  @peer_ip
end
peer_port() click to toggle source
# File lib/pry-remote-em/broker.rb, line 187
def peer_port
  return @peer_port if @peer_port
  return "" if get_peername.nil?
  @peer_port, @peer_ip = Socket.unpack_sockaddr_in(get_peername)
  @peer_port
end
post_init() click to toggle source
# File lib/pry-remote-em/broker.rb, line 167
def post_init
  port, ip = Socket.unpack_sockaddr_in(get_peername)
  log.info("[pry-remote-em broker] received client connection from #{ip}:#{port}")
  send_banner("PryRemoteEm #{VERSION} #{@opts[:tls] ? 'pryems' : 'pryem'}")
  @opts[:tls] ? start_tls : send_server_list(Broker.servers)
end
receive_proxy_connection(url) click to toggle source
# File lib/pry-remote-em/broker.rb, line 153
def receive_proxy_connection(url)
  log.info("[pry-remote-em broker] proxying to #{url}")
  url = URI.parse(url)
  EM.connect(url.host, url.port, Client::Proxy, self)
end
receive_register_server(url, name) click to toggle source
# File lib/pry-remote-em/broker.rb, line 136
def receive_register_server(url, name)
  url      = URI.parse(url)
  url.host = peer_ip if ['0.0.0.0', 'localhost', '127.0.0.1'].include?(url.host)
  log.info("[pry-remote-em broker] registered #{url} - #{name.inspect}") unless Broker.servers[url] == name
  Broker.servers[url] = name
  Broker.hbeats[url]  = Time.new
  Broker.watch_heartbeats(url)
  name
end
receive_server_list() click to toggle source
# File lib/pry-remote-em/broker.rb, line 132
def receive_server_list
  send_server_list(Broker.servers)
end
receive_unregister_server(url) click to toggle source
# File lib/pry-remote-em/broker.rb, line 146
def receive_unregister_server(url)
  url      = URI.parse(url)
  url.host = peer_ip if ['0.0.0.0', 'localhost', '127.0.0.1'].include?(url.host)
  log.warn("[pry-remote-em broker] unregister #{url}")
  Broker.servers.delete(url)
end
ssl_handshake_completed() click to toggle source
# File lib/pry-remote-em/broker.rb, line 194
def ssl_handshake_completed
  log.info("[pry-remote-em broker] TLS connection established (#{peer_ip}:#{peer_port})")
  send_server_list(Broker.servers)
end
start_tls() click to toggle source
# File lib/pry-remote-em/broker.rb, line 174
def start_tls
  log.debug("[pry-remote-em broker] starting TLS (#{peer_ip}:#{peer_port})")
  send_start_tls
  super(@opts[:tls].is_a?(Hash) ? @opts[:tls] : {})
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.