Sha256: 8a740dcfc7b71c0393c07f9b34a0588073fcc2a5348e8cafc06f142d6cd65ed9

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

# -*- coding: binary -*-
require 'ssl_scan/socket'

module SSLScan
module Socket

###
#
# This class provides an interface to enumerating a subnet with a supplied
# netmask.
#
###
class SubnetWalker

  #
  # Initializes a subnet walker instance using the supplied subnet
  # information.
  #
  def initialize(subnet, netmask)
    self.subnet  = Socket.resolv_to_dotted(subnet)
    self.netmask = Socket.resolv_to_dotted(netmask)

    reset
  end

  #
  # Resets the subnet walker back to its original state.
  #
  def reset
    self.curr_ip     = self.subnet.split('.')
    self.num_ips     = (1 << (32 - Socket.net2bitmask(self.netmask).to_i))
    self.curr_ip_idx = 0
  end

  #
  # Returns the next IP address.
  #
  def next_ip
    if (curr_ip_idx >= num_ips)
      return nil
    end

    if (curr_ip_idx > 0)
      self.curr_ip[3] = (curr_ip[3].to_i + 1) % 256
      self.curr_ip[2] = (curr_ip[2].to_i + 1) % 256 if (curr_ip[3] == 0)
      self.curr_ip[1] = (curr_ip[1].to_i + 1) % 256 if (curr_ip[2] == 0)
      self.curr_ip[0] = (curr_ip[0].to_i + 1) % 256 if (curr_ip[1] == 0)
    end

    self.curr_ip_idx += 1

    self.curr_ip.join('.')
  end

  #
  # The subnet that is being enumerated.
  #
  attr_reader :subnet
  #
  # The netmask of the subnet.
  #
  attr_reader :netmask
  #
  # The total number of IPs within the subnet.
  #
  attr_reader :num_ips

protected

  attr_writer   :subnet, :netmask, :num_ips # :nodoc:
  attr_accessor :curr_ip, :curr_ip_idx # :nodoc:

end

end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ssl_scan-0.0.2 lib/ssl_scan/socket/subnet_walker.rb
ssl_scan-0.0.1 lib/ssl_scan/socket/subnet_walker.rb