Skip to content

Instantly share code, notes, and snippets.

@tony612
Last active June 26, 2018 11:00
Show Gist options
  • Save tony612/51d8e3e3c8256b86d0ea8b406422c919 to your computer and use it in GitHub Desktop.
Save tony612/51d8e3e3c8256b86d0ea8b406422c919 to your computer and use it in GitHub Desktop.
subnet calculator
# https://github.com/ipaddress-gem/ipaddress
require 'ipaddress'
class Calculator
def self.run(top, parts: nil, prefixes: nil)
top = IPAddress(top)
subnets = by_parts(top, parts) if parts
subnets = by_prefixes(top, prefixes) if prefixes
subnets
end
def self.by_parts(parent, parts)
part = parts.shift
subnets = parent.split(part)
return subnets if parts.length == 0
subnets.map { |subnet| by_parts(subnet, parts.dup) }
end
def self.by_prefixes(parent, prefixes)
prefix = prefixes.shift
subnets = parent.subnet(prefix)
return subnets if prefixes.length == 0
subnets.map { |subnet| by_prefixes(subnet, prefixes.dup) }
end
def self.print_subnets(subnets, array: false)
subnets.each do |ss|
if ss.is_a?(Array)
if ss[0].is_a?(IPAddress) && array
p ss.map(&:to_string)
else
print_subnets(ss, array: array)
end
puts ""
else
puts ss.to_string
end
end
end
end
# divide to 16 parts, then to 4 subnets for each part
subnets = Calculator.run("172.25.0.0/16", parts: [16, 4])
# Calculator.print_subnets(subnets)
Calculator.print_subnets(subnets, array: true)
# divide to /20 parts, then to /22 subnets for each part
# subnets = Calculator.run("172.25.0.0/16", prefixes: [20, 22])
# Calculator.print_subnets(subnets, array: true)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment