Improved #run_server to check if EM reactor is already running.

Also moved Thread creation to inside #run_server instead of
forcing caller to do so.
This commit is contained in:
soh_cah_toa
2013-07-14 23:27:21 -04:00
parent d9f7af2721
commit ebbadba6dd
2 changed files with 39 additions and 31 deletions

View File

@@ -24,15 +24,13 @@ module API
# Begins main DNS server run-loop at BeEF startup
def self.pre_http_start(http_hook_server)
config = BeEF::Core::Configuration.instance
dns_config = BeEF::Core::Configuration.instance.get('beef.extension.dns')
address = config.get('beef.extension.dns.address')
port = config.get('beef.extension.dns.port')
address = dns_config['address']
port = dns_config['port']
Thread.new do
dns = BeEF::Extension::Dns::Server.instance
dns.run_server(address, port)
end
dns = BeEF::Extension::Dns::Server.instance
dns.run_server(address, port)
print_info "DNS Server: #{address}:#{port}"
end

View File

@@ -27,24 +27,22 @@ module Dns
@server = nil
end
# Starts the main DNS server run-loop.
#
# @note This method will not return. It is recommended that it be invoked inside a
# separate thread.
# Starts the main DNS server run-loop in a new thread.
#
# @param address [String] interface address server should run on
# @param port [Integer] desired server port number
def run_server(address = '0.0.0.0', port = 5300)
EventMachine.next_tick do
RubyDNS.run_server(:listen => [[:udp, address, port]]) do
server = self
BeEF::Extension::Dns::Server.instance.instance_eval { @server = server }
@lock.synchronize do
Thread.new do
# @note Calling #sleep is a quick fix that prevents race conditions
# with WebSockets. A better solution is needed; perhaps a
# global EventMachine mutex.
sleep(1)
# Pass unmatched queries upstream to root nameservers
otherwise do |transaction|
transaction.passthrough!(
RubyDNS::Resolver.new([[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]])
)
if EventMachine.reactor_running?
EventMachine.next_tick { run_server_block(address, port) }
else
run_server_block(address, port)
end
end
end
@@ -71,9 +69,7 @@ module Dns
# @see #remove_rule
# @see http://rubydoc.info/gems/rubydns/RubyDNS/Transaction
def add_rule(pattern, type, &block)
@lock.synchronize do
return @server.match(pattern, type, block)
end
@lock.synchronize { @server.match(pattern, type, block) }
end
# Removes the given DNS rule. Any future queries for it will be passed through.
@@ -84,9 +80,7 @@ module Dns
#
# @see #add_rule
def remove_rule(id)
@lock.synchronize do
@server.remove_rule(id)
end
@lock.synchronize { @server.remove_rule(id) }
end
# Returns an AoH representing the entire current DNS ruleset.
@@ -100,9 +94,7 @@ module Dns
#
# @return [Array<Hash>] DNS ruleset (empty if no rules are currently loaded)
def get_ruleset
@lock.synchronize do
@server.get_ruleset
end
@lock.synchronize { @server.get_ruleset }
end
# Retrieves a specific rule given its id
@@ -111,8 +103,26 @@ module Dns
#
# @return [Hash] hash representation of rule
def get_rule(id)
@lock.synchronize do
@server.get_rule(id)
@lock.synchronize { @server.get_rule(id) }
end
private
# Common code needed by {#run_server} to start DNS server.
#
# @param address [String] interface address server should run on
# @param port [Integer] desired server port number
def run_server_block(address, port)
RubyDNS.run_server(:listen => [[:udp, address, port]]) do
server = self
BeEF::Extension::Dns::Server.instance.instance_eval { @server = server }
# Pass unmatched queries upstream to root nameservers
otherwise do |transaction|
transaction.passthrough!(
RubyDNS::Resolver.new([[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]])
)
end
end
end