Skip to content

Instantly share code, notes, and snippets.

@jokester
Created June 1, 2013 03:29
Show Gist options
  • Save jokester/5689192 to your computer and use it in GitHub Desktop.
Save jokester/5689192 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
def merge_cidr(segments_regex)
segments = segments_regex.map do |s|
(0..255).map(&:to_s).grep(/^#{s}$/).map(&:to_i)
end
memo = []
segments.each do |s|
if s.size == 1
memo += s
next
else
mask_full = s.reduce &:|
8.downto 0 do |mask_len|
mask = mask_full & ( ((1<<8)-1) ^ ((1<<(8-mask_len))-1) )
return "#{ (memo + [mask,0,0,0])[0..3].join(".") }/#{ 8*memo.size + mask_len}" if s.all? {|v| mask==mask&v}
end
end
end
return "#{ memo.join "." }/32"
end
%q{
^35\.20\.174\.100$
|
^36\.87\.113\.102$
|
^37\.32\.3\.67$
|
^38\.170\.244\.(64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95)$
|
^39\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
|
^(127)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
}.scan %r! (?<=\^) .*? (?=\$) !x do |lv1|
puts "< #{lv1.gsub '\\','' }"
puts "> #{merge_cidr lv1.split(%r!\\\.!)}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment