NetAddr :: Tree获取CIDR列表并合并它们?

时间:2012-10-03 13:46:47

标签: ruby cidr

我正在使用Ruby NetAddr :: Tree类来保存一堆CIDR对象,但我需要一种方法将CIDR对象压缩为更大的子网。

我想要一种方法来获取IP:

12.26.8.0/21
12.26.16.0/21
12.26.24.0/21
12.26.32.0/21
12.26.40.0/21
12.27.152.0/21

并合并树中的相关地址范围,以便输出如下:

12.26.8.0/21
12.26.16.0/20
12.26.32.0/20
12.27.152.0/21

我查看了文档,但找不到任何方法来执行此操作。如果需要,我很高兴不再使用NEtAddr :: Tree,重要的是它需要一个IP /网络掩码字符串列表,合并它们并逐行输出。

1 个答案:

答案 0 :(得分:3)

你看过NetAddr::merge吗?

来自文档:

  

给定CIDR地址或NetAddr :: CIDR对象的列表,以尽可能最有效的方式合并(汇总)它们。仅当新创建的超网不会导致“创建”新IP空间时,才会发生摘要。例如,以下块(192.168.0.0/24,192.168.1.0/24和192.168.2.0/24)将汇总到192.168.0.0/23和192.168.2.0/24而不是192.168.0.0/22中。 p>

require 'netaddr'
require 'pp'

pp NetAddr.merge(
  %w[
    12.26.8.0/21
    12.26.16.0/21
    12.26.24.0/21
    12.26.32.0/21
    12.26.40.0/21
    12.27.152.0/21
  ].map{ |ip| NetAddr::CIDR.create(ip) }
)

=> ["12.26.8.0/21", "12.26.16.0/20", "12.26.32.0/20", "12.27.152.0/21"]