module 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}) { |self| ... }
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
Private Class Methods
client() { |client| ... }
click to toggle source
# File lib/pry-remote-em/broker.rb, line 106 def client(&blk) raise ArgumentError.new("A block is required") unless block_given? if @client yield @client return end if @waiting @waiting << blk else @waiting = [blk] EM.connect(host, port, Client::Broker, @opts) do |client| client.errback { |e| raise(e || "broker client error") } client.callback do @client = client while (w = @waiting.shift) w.call(client) end end 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
Calls superclass method
# 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