61 lines
1.5 KiB
Ruby
61 lines
1.5 KiB
Ruby
# -*- coding: binary -*-
|
|
|
|
module Msf::Ui::Console::CommandDispatcher::Db::Common
|
|
|
|
#
|
|
# Returns true if the db is connected, prints an error and returns
|
|
# false if not.
|
|
#
|
|
# All commands that require an active database should call this before
|
|
# doing anything.
|
|
#
|
|
def active?
|
|
unless framework.db.active
|
|
print_error("Database not connected")
|
|
return false
|
|
end
|
|
true
|
|
end
|
|
|
|
#
|
|
# Miscellaneous option helpers
|
|
#
|
|
|
|
#
|
|
# Takes +host_ranges+, an Array of RangeWalkers, and chunks it up into
|
|
# blocks of 1024.
|
|
#
|
|
def each_host_range_chunk(host_ranges, &block)
|
|
# Chunk it up and do the query in batches. The naive implementation
|
|
# uses so much memory for a /8 that it's basically unusable (1.6
|
|
# billion IP addresses take a rather long time to allocate).
|
|
# Chunking has roughly the same performance for small batches, so
|
|
# don't worry about it too much.
|
|
host_ranges.each do |range|
|
|
if range.nil? or range.length.nil?
|
|
chunk = nil
|
|
end_of_range = true
|
|
else
|
|
chunk = []
|
|
end_of_range = false
|
|
# Set up this chunk of hosts to search for
|
|
while chunk.length < 1024 and chunk.length < range.length
|
|
n = range.next_ip
|
|
if n.nil?
|
|
end_of_range = true
|
|
break
|
|
end
|
|
chunk << n
|
|
end
|
|
end
|
|
|
|
# The block will do some
|
|
yield chunk
|
|
|
|
# Restart the loop with the same RangeWalker if we didn't get
|
|
# to the end of it in this chunk.
|
|
redo unless end_of_range
|
|
end
|
|
end
|
|
end
|